之前介绍过一篇快捷部署Redis集群的方法,也说明此方法仅可用于本地测试,如果用于开发环境甚至生产环境就会带来很多问题,Grokzen/docker-redis-cluster这个镜像在Docker重启后会将所有的配置文件覆盖,数据备份文件删除,集群配置文件也会被删除。那么如果仅作为缓存,这倒也无所谓,一旦遇到需要持久化的数据那就是一个巨大的坑,我这几天也趟了一次,于是果断将其删除,选择用官方的镜像来做集群。

拉取Redis官方镜像

1
docker pull redis

创建模版文件

创建目录

1
mkdir /home/redis

创建文件

1
vim redis-cluster.tmpl

填入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# redis端口
port ${PORT}
# 关闭保护模式
protected-mode no
# 开启集群
cluster-enabled yes
# 集群节点配置
cluster-config-file nodes.conf
# 超时
cluster-node-timeout 5000
# 集群节点IP host模式为宿主机IP
cluster-announce-ip 10.10.100.197
# 集群节点端口 7000 - 7005
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
# 开启 appendonly 备份模式
appendonly yes
# 每秒钟备份
appendfsync everysec
# 对aof文件进行压缩时,是否执行同步操作
no-appendfsync-on-rewrite no
# 当目前aof文件大小超过上一次重写时的aof文件大小的100%时会再次进行重写
auto-aof-rewrite-percentage 100
# 重写前AOF文件的大小最小值 默认 64mb
auto-aof-rewrite-min-size 5120mb
# 关闭快照备份
save ""

批量创建配置文件和数据目录

当前路径为/home/redis

1
2
3
4
5
for port in `seq 7000 7005`; do \
mkdir -p ./${port}/conf \
&& PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \
&& mkdir -p ./${port}/data; \
done

批量启动redis

host模式(推荐)

host模式的-p参数没用,没必要指定-p参数

1
2
3
4
5
6
7
for port in `seq 7000 7005`; do \
docker run -d -ti \
-v /home/redis/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /home/redis/${port}/data:/data \
--restart always --name redis-${port} --net host \
--sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf; \
done

创建集群

随便进入其中一个容器:

1
docker exec -it redis-7000 bash

进入后执行如下命令创建集群:

1
redis-cli --cluster create 10.10.100.197:7000 10.10.100.197:7001 10.10.100.197:7002 10.10.100.197:7003 10.10.100.197:7004 10.10.100.197:7005 --cluster-replicas 1

输入yes后,集群创建完毕,接着登录其中一个节点,验证集群可用性

1
redis-cli -c -p 7000

输入cluster nodes查看集群状态

1
2
3
4
5
6
7
127.0.0.1:7000> cluster nodes
06851aa134d50096d82a434eced9194233b5204e 10.10.100.197:7003@17003 slave 8b33f273386c9504ef8bd10b005e24825b3b9596 0 1567671901000 4 connected
a42297b65f7101fc9e4941ef8a0e65080d1b6338 10.10.100.197:7005@17005 slave 0aa20378d14e3ef0859815196cbafa67e1001d0e 0 1567671901581 6 connected
e7b6a35b1e92f94c225c507ea19f7f0318f0d1c3 10.10.100.197:7002@17002 master - 0 1567671902582 3 connected 10923-16383
0aa20378d14e3ef0859815196cbafa67e1001d0e 10.10.100.197:7000@17000 myself,master - 0 1567671901000 1 connected 0-5460
8b33f273386c9504ef8bd10b005e24825b3b9596 10.10.100.197:7001@17001 master - 0 1567671902383 2 connected 5461-10922
fe355eed99100197f43d1216d1de82643dd496a5 10.10.100.197:7004@17004 slave e7b6a35b1e92f94c225c507ea19f7f0318f0d1c3 0 1567671901380 5 connected

开启防火墙

如果宿主机有防火墙,需要手动开启访问策略

1
2
3
4
5
for port in `seq 7000 7005`; do \  
firewall-cmd --zone=public --add-port=${port}/tcp --permanent
done
#重新载入
firewall-cmd --reload

集群维护

批量停止

1
2
3
for port in `seq 7000 7005`; do \
docker stop redis-${port};
done

批量删除

1
2
3
for port in `seq 7000 7005`; do \
docker rm redis-${port};
done

在做完集群后,在星球得知一本书《Redis 5设计与源码分析》,大概看了下这个目录感觉还不错,对工作以及面试都有很大的帮助,如果你对redis很感兴趣,不妨入手一本试试,本来打算在京东买,可惜价格吓我一跳,122元。后来同事告诉我淘宝上出版社官方旗舰店只要88,还能再减10元,也就是78元,即使京东也有满减活动,但是算下来却不如直接去出版社买,毕竟没有中间商赚差价。同理《深入理解Apache Dubbo与实战》、《Spring Security实战》在淘宝买也比京东便宜得多,当然,主要提醒大家买书时也货比三家,稍微注意点能省很多钱。当然,如果买来不看,相当于给出版社、作者、造纸、种树的都投资了。