文章目录
一、新建6个docker容器实例
1.1 架构图
2.1新建命令
docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
二、构建集群关系
2.1 进入容器创建集群
进入容器:
docker exec -it redis-node-1 /bin/bash
创建集群:
redis-cli --cluster create 192.168.136.133:6381 192.168.136.133:6382 192.168.136.133:6383 192.168.136.133:6384 192.168.136.133:6385 192.168.136.133:6386 --cluster-replicas 1
#cluster-replicas 1 表示为每个master节点创建一个slave,即123为主,456为从
如图:6381对应6385,6382对应6386,6384对应6383
hash槽分配完成代表创建成功
2.2 进入reids查看集群状态
redis-cli -p 6381
cluster info
cluster nodes
三、测试
3.1 单机连接报错
单机连接导致部分key值无法存入,原因是在集群环境中每个节点分配了hash槽,当key值hash之后的结果落在其他主机的槽上时,就会报找不到其他主机的错
改成集群连接之后再看下
redis-cli -p 6381 -c
3.2 检查集群状态
进入容器
redis-cli --cluster check 192.168.136.133:6381
3.3 主从容错切换迁移
#停止node1
docker stop redis-node-1
docker exec -it redis-node-2 /bin/bash
#容器内部
redis-cli -p 6382 -c
cluster nodes
如图:1号宕机,5号切换为master
恢复1号机
#启动node1
docker start redis-node-1
docker exec -it redis-node-2 /bin/bash
#容器内部
redis-cli -p 6382 -c
cluster nodes
5号机还是主,1号机还是从;将5号机停止再启动,恢复1为主,5为从。
docker stop redis-node-5
docker start redis-node-5
3.4 主从扩容
3.4.1 新建新主机加入集群
# 新建两个容器6387,6388
docker run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388
# 进入容器,将6387作为master加入集群
docker exec -it redis-node-7 /bin/bash
redis-cli --cluster add-node 192.168.136.133:6387 192.168.136.133:6381
# 检查集群状态
redis-cli --cluster check 192.168.136.133:6381
如图:6387已加入集群,但是尚未分配槽号
3.4.2 新主机分配槽号
# 重新分配槽号
redis-cli --cluster reshard 192.168.136.133:6381
分配4096个槽位给6387,需要提供节点ID;4096=16384/4(主节点数);
all模式:将所有节点用作哈希槽的源节点
重新检查集群状态:
发现原来的新主机的槽位不是连续的,他是从其他三个主机分别获取了大约1364个槽位,达到每个主机节点的槽位都是4096。这样做的原因是重新分配hash槽的速度会更快,完全重分配成本太高。
3.4.3 新主机添加从节点
redis-cli --cluster add-node 192.168.136.133:6388 192.168.136.133:6387 --cluster-slave --cluster-master-id f3b1c4ee14462809ad4b0506e8d027011bcf28f4 #6387主机ID
添加完之后再次检查集群,已成功添加
3.5 主从缩容
#删除6388
redis-cli --cluster del-node 192.168.136.133:6388 83af4c6288965982bcfbc8721596d1a7228798d7 #6388节点ID
#重新分配6377的槽位
redis-cli --cluster reshard 192.168.136.133:6381
redis-cli --cluster check 192.168.136.133:6381
将1365个槽位从6387转移到6381,如图:
再将1366个槽位转移到6382,1365个槽位转移给6383
查看集群状态
#删除6387
redis-cli --cluster del-node 192.168.136.133:6387 f3b1c4ee14462809ad4b0506e8d027011bcf28f4
redis-cli --cluster check 192.168.136.133:6381
再次查看集群状态