Cluster集群
一个 Redis 集群中的节点数量至少需要 6 个才能保证组成完整高可用的集群。每个节点都需要开启 cluster-enabled yes,让 Redis 运行在集群模式下。建议为集群内所有节点统一目录,一般划分为三个目录:conf、data、log,分别存放配置、数据和日志相关文件。
集群模式的 Redis 除了原有的配置文件之外,又增加了一份集群配置文件(由参数 cluster-config-file 设置)。
当集群内节点信息发生变化,如添加节点、节点下线、故障转移等,节点会自动保存集群状态到集群配置文件中。
Redis 自动维护集群配置文件,不要手动修改,防止节点重启时产生集群信息错误。
节点 ID:它是一个长度为 40 位的 16 进制字符串,用于唯一标识集群内一个节点。
节点 ID 不同于运行 ID,节点 ID 在集群初始化时创建,节点重启时会加载集群配置文件进行重用,而 Redis 的运行 ID 每次重启都会变化。
创建目录
mkdir -p /media/redis/node1/conf
mkdir -p /media/redis/node1/data
vim /media/redis/node1/conf/redis.conf
注意:redis.conf中必须配置以下属性:
cluster-enabled yes
bind * -::*
protected-mode no
cp -r /media/redis/node1 /media/redis/node2
cp -r /media/redis/node1 /media/redis/node3
cp -r /media/redis/node1 /media/redis/node4
cp -r /media/redis/node1 /media/redis/node5
cp -r /media/redis/node1 /media/redis/node6
启动集群服务
第一步:准备节点
docker run -v /media/redis/node1/conf:/etc/redis -v /media/redis/node1/data:/data --name redis-node1 --net redis-net -d redis:7.0.12 redis-server /etc/redis/redis.conf
docker run -v /media/redis/node2/conf:/etc/redis -v /media/redis/node2/data:/data --name redis-node2 --net redis-net -d redis:7.0.12 redis-server /etc/redis/redis.conf
docker run -v /media/redis/node3/conf:/etc/redis -v /media/redis/node3/data:/data --name redis-node3 --net redis-net -d redis:7.0.12 redis-server /etc/redis/redis.conf
docker run -v /media/redis/node4/conf:/etc/redis -v /media/redis/node4/data:/data --name redis-node4 --net redis-net -d redis:7.0.12 redis-server /etc/redis/redis.conf
docker run -v /media/redis/node5/conf:/etc/redis -v /media/redis/node5/data:/data --name redis-node5 --net redis-net -d redis:7.0.12 redis-server /etc/redis/redis.conf
docker run -v /media/redis/node6/conf:/etc/redis -v /media/redis/node6/data:/data --name redis-node6 --net redis-net -d redis:7.0.12 redis-server /etc/redis/redis.conf
此时,各个redis服务均处于独立状态,彼此并无联系
[root@docker-host redis]# docker exec -it redis-node1 redis-cli cluster nodes
bd88e14a2634abc4ab38308e300a513b8ac253fc :6379@16379 myself,master - 0 0 0 connected
[root@docker-host redis]# docker exec -it redis-node2 redis-cli cluster nodes
e5ceee80bb04c59c72e50f8b6a194c44dbeba1ac :6379@16379 myself,master - 0 0 0 connected
...
第二步:节点握手,并分配分区槽
docker exec -it redis-node1 \
redis-cli --cluster create --cluster-replicas 1 redis-node1:6379 redis-node2:6379 redis-node3:6379 redis-node4:6379 redis-node5:6379 redis-node6:6379
第三步:检查集群状态
访问redis集群
[root@docker-host redis]# docker exec -it redis-node1 redis-cli -c
127.0.0.1:6379> set k1 v1
-> Redirected to slot [12706] located at 172.18.0.4:6379
OK
172.18.0.4:6379> set k2 v2
-> Redirected to slot [449] located at 172.18.0.2:6379
OK
172.18.0.2:6379> exit
redis-cli命令中的 -c 的作用时,当收到重定向信息时,进行自动重定向
集群扩容
第一步:准备节点
cp -r /media/redis/node1 /media/redis/node7
rm -rf /media/redis/node7/data/*
cp -r /media/redis/node1 /media/redis/node8
rm -rf /media/redis/node8/data/*
docker run -v /media/redis/node7/conf:/etc/redis -v /media/redis/node7/data:/data --name redis-node7 --net redis-net -d redis:7.0.12 redis-server /etc/redis/redis.conf
docker run -v /media/redis/node8/conf:/etc/redis -v /media/redis/node8/data:/data --name redis-node8 --net redis-net -d redis:7.0.12 redis-server /etc/redis/redis.conf
第二步:新节点加入集群
docker exec -it redis-node1 \
redis-cli --cluster add-node redis-node7:6379 redis-node1:6379
第三步:槽迁移
docker exec -it redis-node1 \
redis-cli --cluster reshard redis-node1:6379 \
--cluster-from all \
--cluster-to bca02a4b4d88a03bb3bd6bcd338196b2ca6d31fe \
--cluster-slots 4096 --cluster-yes --cluster-timeout 100 --cluster-pipeline 1000
第四步:检查集群状态
第五步:增加slave节点
# bca02a4b4d88a03bb3bd6bcd338196b2ca6d31fe为新增从节点的跟踪主节点的node id
docker exec -it redis-node1 \
redis-cli --cluster add-node redis-node8 redis-node1 --cluster-slave --cluster-master-id bca02a4b4d88a03bb3bd6bcd338196b2ca6d31fe
集群缩容
第一步:移除slave节点
# d143b322b356edce52909b6686384555968ceb34是待移除节点的node id
docker exec -it redis-node1 \
redis-cli --cluster del-node redis-node1:6379 \
d143b322b356edce52909b6686384555968ceb34
第二步:槽迁移
为了满足负载均衡条件,在归还节点的slot时,应该将这些slot均匀地分配给各个主节点。
而因为reshard命令只能向一个目标节点迁移slot,因此需要多次执行reshard命令以完成slot的迁移。
docker exec -it redis-node1 \
redis-cli --cluster reshard redis-node1:6379 \
--cluster-from bca02a4b4d88a03bb3bd6bcd338196b2ca6d31fe \
--cluster-to ede4128545e99cbd4c1275e3f2f9c9f97e91ad54 \
--cluster-slots 1366 --cluster-yes --cluster-timeout 100 --cluster-pipeline 1000
docker exec -it redis-node1 \
redis-cli --cluster reshard redis-node1:6379 \
--cluster-from bca02a4b4d88a03bb3bd6bcd338196b2ca6d31fe \
--cluster-to 2246d056901e369cf170c514550f260a687182bf \
--cluster-slots 1366 --cluster-yes --cluster-timeout 100 --cluster-pipeline 1000
docker exec -it redis-node1 \
redis-cli --cluster reshard redis-node1:6379 \
--cluster-from bca02a4b4d88a03bb3bd6bcd338196b2ca6d31fe \
--cluster-to e5ceee80bb04c59c72e50f8b6a194c44dbeba1ac \
--cluster-slots 1366 --cluster-yes --cluster-timeout 100 --cluster-pipeline 1000
第三步:移除master节点
docker exec -it redis-node1 \
redis-cli --cluster del-node redis-node1:6379 \
bca02a4b4d88a03bb3bd6bcd338196b2ca6d31fe
Last updated
Was this helpful?