一、3主3从集群搭建
新建6个docker容器redis实例
docker run -d --name redis-node-1 --net host --privileged=true -v /docker/redis-cluster/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 /docker/redis-cluster/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 /docker/redis-cluster/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 /docker/redis-cluster/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 /docker/redis-cluster/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 /docker/redis-cluster/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
docker run 创建并运行docker容器实例
--name redis-node-6 容器名字
--net host 使用宿主机的IP和端口,默认
--privileged=true 获取宿主机root用户权限
-v /docker/redis-cluster/redis-node-1:/data 容器卷,宿主机地址:docker内部地址
redis:6.0.8 redis镜像和版本号
--cluster-enabled yes 开启redis集群
--appendonly yes 开启持久化
--port 6386 redis端口号
构建主从关系
redis-cli --cluster create 192.168.100.1:6381 192.168.100.1:6382 192.168.100.1:6383 192.168.100.1:6384 192.168.100.1:6385 192.168.100.1:6386 --cluster-replicas 1
进入docker容器后才能执行一下命令,且注意自己的真实IP地址;
--cluster-replicas 1 表示为每个master创建一个slave节点
root@mi:/docker/redis# docker exec -it redis-node-1 /bin/bash root@mi:/data# redis-cli --cluster create 192.168.100.1:6381 192.168.100.1:6382 192.168.100.1:6383 192.168.100.1:6384 192.168.100.1:6385 192.168.100.1:6386 --cluster-replicas 1 >>> Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 192.168.100.1:6385 to 192.168.100.1:6381 Adding replica 192.168.100.1:6386 to 192.168.100.1:6382 Adding replica 192.168.100.1:6384 to 192.168.100.1:6383 >>> Trying to optimize slaves allocation for anti-affinity [WARNING] Some slaves are in the same host as their master M: b44850a9c1b50e5d65064d2f67577defb8707e1f 192.168.100.1:6381 slots:[0-5460] (5461 slots) master M: 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd 192.168.100.1:6382 slots:[5461-10922] (5462 slots) master M: 0f222827c8c726ed53ef24bc14ff1654940ae41a 192.168.100.1:6383 slots:[10923-16383] (5461 slots) master S: 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 192.168.100.1:6384 replicates 0f222827c8c726ed53ef24bc14ff1654940ae41a S: a8028dc2dd2ad84eedeae7a72d27fdff9f507393 192.168.100.1:6385 replicates b44850a9c1b50e5d65064d2f67577defb8707e1f S: 228a908a67b823dd8a4f831095a8f58ff4909079 192.168.100.1:6386 replicates 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd Can I set the above configuration? (type 'yes' to accept): no # 是否同意以上配置, yes 表示同意,否则表示不同意 root@mi:/data# redis-cli --cluster create 192.168.100.1:6381 192.168.100.1:6382 192.168.100.1:6383 192.168.100.1:6384 192.168.100.1:6385 192.168.100.1:6386 --cluster-replicas 1 >>> Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 192.168.100.1:6385 to 192.168.100.1:6381 Adding replica 192.168.100.1:6386 to 192.168.100.1:6382 Adding replica 192.168.100.1:6384 to 192.168.100.1:6383 >>> Trying to optimize slaves allocation for anti-affinity [WARNING] Some slaves are in the same host as their master M: b44850a9c1b50e5d65064d2f67577defb8707e1f 192.168.100.1:6381 slots:[0-5460] (5461 slots) master M: 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd 192.168.100.1:6382 slots:[5461-10922] (5462 slots) master M: 0f222827c8c726ed53ef24bc14ff1654940ae41a 192.168.100.1:6383 slots:[10923-16383] (5461 slots) master S: 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 192.168.100.1:6384 replicates b44850a9c1b50e5d65064d2f67577defb8707e1f S: a8028dc2dd2ad84eedeae7a72d27fdff9f507393 192.168.100.1:6385 replicates 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd S: 228a908a67b823dd8a4f831095a8f58ff4909079 192.168.100.1:6386 replicates 0f222827c8c726ed53ef24bc14ff1654940ae41a Can I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join . >>> Performing Cluster Check (using node 192.168.100.1:6381) M: b44850a9c1b50e5d65064d2f67577defb8707e1f 192.168.100.1:6381 slots:[0-5460] (5461 slots) master 1 additional replica(s) M: 0f222827c8c726ed53ef24bc14ff1654940ae41a 192.169.27.89:6383 slots:[10923-16383] (5461 slots) master 1 additional replica(s) M: 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd 192.169.27.89:6382 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: 228a908a67b823dd8a4f831095a8f58ff4909079 192.169.27.89:6386 slots: (0 slots) slave replicates 0f222827c8c726ed53ef24bc14ff1654940ae41a S: a8028dc2dd2ad84eedeae7a72d27fdff9f507393 192.169.27.89:6385 slots: (0 slots) slave replicates 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd S: 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 192.169.27.89:6384 slots: (0 slots) slave replicates b44850a9c1b50e5d65064d2f67577defb8707e1f [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. root@mi:/data#
查看集群状态
# 连入容器中 docker exec -it redis-node-6 /bin/bash # 在集群中连上其中任一一台 redis redis-cli -p 6386 # 查看集群信息 CLUSTER INFO # 查看集群节点信息 CLUSTER NODES
root@mi:~# docker exec -it redis-node-6 /bin/bash root@mi:/data# redis-cli -p 6386 127.0.0.1:6386> CLUSTER INFO cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:3 cluster_stats_messages_ping_sent:314 cluster_stats_messages_pong_sent:312 cluster_stats_messages_meet_sent:1 cluster_stats_messages_sent:627 cluster_stats_messages_ping_received:312 cluster_stats_messages_pong_received:315 cluster_stats_messages_received:627 127.0.0.1:6386> CLUSTER NODES 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd 192.169.27.89:6382@16382 master - 0 1679111690000 2 connected 5461-10922 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 192.169.27.89:6384@16384 slave b44850a9c1b50e5d65064d2f67577defb8707e1f 0 1679111690000 1 connected b44850a9c1b50e5d65064d2f67577defb8707e1f 192.169.27.89:6381@16381 master - 0 1679111691752 1 connected 0-5460 228a908a67b823dd8a4f831095a8f58ff4909079 192.169.27.89:6386@16386 myself,slave 0f222827c8c726ed53ef24bc14ff1654940ae41a 0 1679111689000 3 connected a8028dc2dd2ad84eedeae7a72d27fdff9f507393 192.169.27.89:6385@16385 slave 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd 0 1679111690000 2 connected 0f222827c8c726ed53ef24bc14ff1654940ae41a 192.169.27.89:6383@16383 master - 0 1679111690749 3 connected 10923-16383 127.0.0.1:6386>
通过上面的 CLUSTER NODES 返回的信息可以看到集群结构如下:
测试数据操作(非正常的操作)
root@mi:~# docker exec -it redis-node-6 /bin/bash root@mi:/data# redis-cli -p 6386 127.0.0.1:6386> CLUSTER INFO cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:3 cluster_stats_messages_ping_sent:314 cluster_stats_messages_pong_sent:312 cluster_stats_messages_meet_sent:1 cluster_stats_messages_sent:627 cluster_stats_messages_ping_received:312 cluster_stats_messages_pong_received:315 cluster_stats_messages_received:627 127.0.0.1:6386> CLUSTER NODES 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd 192.169.27.89:6382@16382 master - 0 1679111690000 2 connected 5461-10922 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 192.169.27.89:6384@16384 slave b44850a9c1b50e5d65064d2f67577defb8707e1f 0 1679111690000 1 connected b44850a9c1b50e5d65064d2f67577defb8707e1f 192.169.27.89:6381@16381 master - 0 1679111691752 1 connected 0-5460 228a908a67b823dd8a4f831095a8f58ff4909079 192.169.27.89:6386@16386 myself,slave 0f222827c8c726ed53ef24bc14ff1654940ae41a 0 1679111689000 3 connected a8028dc2dd2ad84eedeae7a72d27fdff9f507393 192.169.27.89:6385@16385 slave 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd 0 1679111690000 2 connected 0f222827c8c726ed53ef24bc14ff1654940ae41a 192.169.27.89:6383@16383 master - 0 1679111690749 3 connected 10923-16383 127.0.0.1:6386> set k1 v1 (error) MOVED 12706 192.169.27.89:6383 127.0.0.1:6386> set k2 v2 (error) MOVED 449 192.169.27.89:6381 127.0.0.1:6386> set k3 v3 (error) MOVED 4576 192.169.27.89:6381 127.0.0.1:6386> set k4 v4 (error) MOVED 8455 192.169.27.89:6382 127.0.0.1:6386>
上面传统的方式连接 192.168.100.1:6386 从节点进行操作,发现都操作失败。
root@mi:/data# redis-cli -p 6381 127.0.0.1:6381> set k1 v1 (error) MOVED 12706 192.169.27.89:6383 127.0.0.1:6381> set k2 v2 OK 127.0.0.1:6381> set k3 v3 OK 127.0.0.1:6381> set k4 v4 (error) MOVED 8455 192.169.27.89:6382 127.0.0.1:6381>
上面传统的方式连接 192.168.100.1:6381 主节点进行操作,发现部分操作可以成功执行。
总结: 造成以上原因的是客户端连接方式不对,应该添加 -c 参数启动集群模式进行连接操作。
测试数据操作(正常的操作)
root@mi:/data# redis-cli -c -p 6384 127.0.0.1:6384> set k1 v1 -> Redirected to slot [12706] located at 192.169.27.89:6383 OK 192.169.27.89:6383> set k2 v2 -> Redirected to slot [449] located at 192.169.27.89:6381 OK 192.169.27.89:6381> set k3 v3 OK 192.169.27.89:6381> set k4 v4 -> Redirected to slot [8455] located at 192.169.27.89:6382 OK 192.169.27.89:6382>
使用集群方式连接 redis 的 6384 的从节点进行操作,都可以操作成功。
可以看到每次 set 操作 redis 都会自己找到对应的槽并重定向到相应的(主)节点上进行操作。
root@mi:/data# redis-cli -c -p 6381 127.0.0.1:6381> get k1 -> Redirected to slot [12706] located at 192.169.27.89:6383 "v1" 192.169.27.89:6383> get k2 -> Redirected to slot [449] located at 192.169.27.89:6381 "v2" 192.169.27.89:6381> get k3 "v3" 192.169.27.89:6381> get k4 -> Redirected to slot [8455] located at 192.169.27.89:6382 "v4" 192.169.27.89:6382>
使用集群方式连接 redis 的 6381 的主节点进行操作,也都可以操作成功。每次操作也有相应的重定向到对应的(主)节点。
root@mi:/data# redis-cli --cluster check 192.168.100.1:6384 192.169.27.89:6382 (7768e69e...) -> 1 keys | 5462 slots | 1 slaves. 192.169.27.89:6383 (0f222827...) -> 1 keys | 5461 slots | 1 slaves. 192.169.27.89:6381 (b44850a9...) -> 2 keys | 5461 slots | 1 slaves. [OK] 4 keys in 3 masters. 0.00 keys per slot on average. >>> Performing Cluster Check (using node 192.168.100.1:6384) S: 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 192.168.100.1:6384 slots: (0 slots) slave replicates b44850a9c1b50e5d65064d2f67577defb8707e1f M: 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd 192.169.27.89:6382 slots:[5461-10922] (5462 slots) master 1 additional replica(s) M: 0f222827c8c726ed53ef24bc14ff1654940ae41a 192.169.27.89:6383 slots:[10923-16383] (5461 slots) master 1 additional replica(s) S: 228a908a67b823dd8a4f831095a8f58ff4909079 192.169.27.89:6386 slots: (0 slots) slave replicates 0f222827c8c726ed53ef24bc14ff1654940ae41a S: a8028dc2dd2ad84eedeae7a72d27fdff9f507393 192.169.27.89:6385 slots: (0 slots) slave replicates 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd M: b44850a9c1b50e5d65064d2f67577defb8707e1f 192.169.27.89:6381 slots:[0-5460] (5461 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. root@mi:/data#
redis-cli --cluster check 192.168.100.1:6384 查看集群信息,这里可以选择连接集群中的任一一个节点。
总结: 以上我们的 3 主 3 从 redis 集群模式搭建成功。
二、主从容错迁移测试
1、主6381和从机切换,先停止主机6381
docker stop redis-node-1
以下是两次查看集群的信息, 第一次是 6381 节点停掉后立即查看(此时从节点还没有升为主节点),第二次是过了一段时间后查看(可以看到从节点升为主节点)。
root@mi:/data# redis-cli --cluster check 192.168.100.1:6384 Could not connect to Redis at 192.169.27.89:6381: Connection refused *** WARNING: 192.168.100.1:6384 claims to be slave of unknown node ID b44850a9c1b50e5d65064d2f67577defb8707e1f. 192.169.27.89:6382 (7768e69e...) -> 1 keys | 5462 slots | 1 slaves. 192.169.27.89:6383 (0f222827...) -> 1 keys | 5461 slots | 1 slaves. [OK] 2 keys in 2 masters. 0.00 keys per slot on average. >>> Performing Cluster Check (using node 192.168.100.1:6384) S: 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 192.168.100.1:6384 slots: (0 slots) slave replicates b44850a9c1b50e5d65064d2f67577defb8707e1f M: 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd 192.169.27.89:6382 slots:[5461-10922] (5462 slots) master 1 additional replica(s) M: 0f222827c8c726ed53ef24bc14ff1654940ae41a 192.169.27.89:6383 slots:[10923-16383] (5461 slots) master 1 additional replica(s) S: 228a908a67b823dd8a4f831095a8f58ff4909079 192.169.27.89:6386 slots: (0 slots) slave replicates 0f222827c8c726ed53ef24bc14ff1654940ae41a S: a8028dc2dd2ad84eedeae7a72d27fdff9f507393 192.169.27.89:6385 slots: (0 slots) slave replicates 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [ERR] Not all 16384 slots are covered by nodes. root@mi:/data# redis-cli --cluster check 192.168.100.1:6384 Could not connect to Redis at 192.169.27.89:6381: Connection refused 192.168.100.1:6384 (0ed9ee55...) -> 2 keys | 5461 slots | 0 slaves. 192.169.27.89:6382 (7768e69e...) -> 1 keys | 5462 slots | 1 slaves. 192.169.27.89:6383 (0f222827...) -> 1 keys | 5461 slots | 1 slaves. [OK] 4 keys in 3 masters. 0.00 keys per slot on average. >>> Performing Cluster Check (using node 192.168.100.1:6384) M: 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 192.168.100.1:6384 slots:[0-5460] (5461 slots) master M: 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd 192.169.27.89:6382 slots:[5461-10922] (5462 slots) master 1 additional replica(s) M: 0f222827c8c726ed53ef24bc14ff1654940ae41a 192.169.27.89:6383 slots:[10923-16383] (5461 slots) master 1 additional replica(s) S: 228a908a67b823dd8a4f831095a8f58ff4909079 192.169.27.89:6386 slots: (0 slots) slave replicates 0f222827c8c726ed53ef24bc14ff1654940ae41a S: a8028dc2dd2ad84eedeae7a72d27fdff9f507393 192.169.27.89:6385 slots: (0 slots) slave replicates 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. root@mi:/data#
再启动 主机6381
docker start redis-node-1
过一会后查看集群信息如下:
root@mi:/data# redis-cli --cluster check 192.168.100.1:6384 192.168.100.1:6384 (0ed9ee55...) -> 2 keys | 5461 slots | 1 slaves. 192.169.27.89:6382 (7768e69e...) -> 1 keys | 5462 slots | 1 slaves. 192.169.27.89:6383 (0f222827...) -> 1 keys | 5461 slots | 1 slaves. [OK] 4 keys in 3 masters. 0.00 keys per slot on average. >>> Performing Cluster Check (using node 192.168.100.1:6384) M: 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 192.168.100.1:6384 slots:[0-5460] (5461 slots) master 1 additional replica(s) M: 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd 192.169.27.89:6382 slots:[5461-10922] (5462 slots) master 1 additional replica(s) M: 0f222827c8c726ed53ef24bc14ff1654940ae41a 192.169.27.89:6383 slots:[10923-16383] (5461 slots) master 1 additional replica(s) S: 228a908a67b823dd8a4f831095a8f58ff4909079 192.169.27.89:6386 slots: (0 slots) slave replicates 0f222827c8c726ed53ef24bc14ff1654940ae41a S: a8028dc2dd2ad84eedeae7a72d27fdff9f507393 192.169.27.89:6385 slots: (0 slots) slave replicates 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd S: b44850a9c1b50e5d65064d2f67577defb8707e1f 192.169.27.89:6381 slots: (0 slots) slave replicates 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. root@mi:/data#
可以看到现在集群中 6381 的节点变成了 6384 的从节点拉。
三、主从扩容测试
# 1、新增两个实例节点 docker run -d --name redis-node-7 --net host --privileged=true -v /docker/redis-cluster/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 /docker/redis-cluster/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388 # 2、进入6387容器实例内部 docker exec -it redis-node-7 /bin/bash # 3、将新增的6387节点(空槽号)作为master节点加入原集群 redis-cli --cluster add-node 自己实际IP地址:6387 自己实际IP地址:6381 6387 就是将要作为master新增节点 6381 就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群 # 4、重新分派槽号(需要按提示输入:1.移动的槽数 2.接受的目标节点 3.分出的源节点) redis-cli --cluster reshard IP地址:端口号 # 5、为主节点6387分配从节点6388 redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID
root@mi:~# docker run -d --name redis-node-7 --net host --privileged=true -v /docker/redis-cluster/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387 a762167ab6e4f2f16c92fcddf21010dfd49ce14ade125650303aacb08d98ecee root@mi:~# root@mi:~# docker run -d --name redis-node-8 --net host --privileged=true -v /docker/redis-cluster/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388 c477fd95ec3f1ea63b82e0ba9d64266543dacc9b3726632d986bd0c4e8c1441e root@mi:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c477fd95ec3f redis:6.0.8 "docker-entrypoint.s…" 4 seconds ago Up 3 seconds redis-node-8 a762167ab6e4 redis:6.0.8 "docker-entrypoint.s…" 6 seconds ago Up 5 seconds redis-node-7 a674c14f68f9 redis:6.0.8 "docker-entrypoint.s…" 2 hours ago Up 2 hours redis-node-6 caafe9d8e8e3 redis:6.0.8 "docker-entrypoint.s…" 2 hours ago Up 2 hours redis-node-5 4068a989a7c1 redis:6.0.8 "docker-entrypoint.s…" 2 hours ago Up 2 hours redis-node-4 e9837d2dc277 redis:6.0.8 "docker-entrypoint.s…" 2 hours ago Up 2 hours redis-node-3 4091c5855a5c redis:6.0.8 "docker-entrypoint.s…" 2 hours ago Up 2 hours redis-node-2 022d882850c0 redis:6.0.8 "docker-entrypoint.s…" 2 hours ago Up 7 minutes redis-node-1 root@mi:~# root@mi:~# docker exec -it redis-node-7 /bin/bash root@mi:/data# redis-cli --cluster add-node 192.168.100.1:6387 192.168.100.1:6381 >>> Adding node 192.168.100.1:6387 to cluster 192.168.100.1:6381 >>> Performing Cluster Check (using node 192.168.100.1:6381) S: b44850a9c1b50e5d65064d2f67577defb8707e1f 192.168.100.1:6381 slots: (0 slots) slave replicates 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 S: 228a908a67b823dd8a4f831095a8f58ff4909079 192.169.27.89:6386 slots: (0 slots) slave replicates 0f222827c8c726ed53ef24bc14ff1654940ae41a M: 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd 192.169.27.89:6382 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: a8028dc2dd2ad84eedeae7a72d27fdff9f507393 192.169.27.89:6385 slots: (0 slots) slave replicates 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd M: 0f222827c8c726ed53ef24bc14ff1654940ae41a 192.169.27.89:6383 slots:[10923-16383] (5461 slots) master 1 additional replica(s) M: 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 192.169.27.89:6384 slots:[0-5460] (5461 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. >>> Send CLUSTER MEET to node 192.168.100.1:6387 to make it join the cluster. [OK] New node added correctly. root@mi:/data# redis-cli --cluster check 192.168.100.1:6381 192.169.27.89:6387 (5d435ee7...) -> 0 keys | 0 slots | 0 slaves. 192.169.27.89:6382 (7768e69e...) -> 1 keys | 5462 slots | 1 slaves. 192.169.27.89:6383 (0f222827...) -> 1 keys | 5461 slots | 1 slaves. 192.169.27.89:6384 (0ed9ee55...) -> 2 keys | 5461 slots | 1 slaves. [OK] 4 keys in 4 masters. 0.00 keys per slot on average. >>> Performing Cluster Check (using node 192.168.100.1:6381) S: b44850a9c1b50e5d65064d2f67577defb8707e1f 192.168.100.1:6381 slots: (0 slots) slave replicates 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 M: 5d435ee7c5177a146c236596c0f8c6632d9fbd91 192.169.27.89:6387 slots: (0 slots) master S: 228a908a67b823dd8a4f831095a8f58ff4909079 192.169.27.89:6386 slots: (0 slots) slave replicates 0f222827c8c726ed53ef24bc14ff1654940ae41a M: 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd 192.169.27.89:6382 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: a8028dc2dd2ad84eedeae7a72d27fdff9f507393 192.169.27.89:6385 slots: (0 slots) slave replicates 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd M: 0f222827c8c726ed53ef24bc14ff1654940ae41a 192.169.27.89:6383 slots:[10923-16383] (5461 slots) master 1 additional replica(s) M: 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 192.169.27.89:6384 slots:[0-5460] (5461 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. root@mi:/data# root@mi:/data# redis-cli --cluster reshard 192.168.100.1:6381 >>> Performing Cluster Check (using node 192.168.100.1:6381) S: b44850a9c1b50e5d65064d2f67577defb8707e1f 192.168.100.1:6381 slots: (0 slots) slave replicates 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 M: 5d435ee7c5177a146c236596c0f8c6632d9fbd91 192.169.27.89:6387 slots: (0 slots) master S: 228a908a67b823dd8a4f831095a8f58ff4909079 192.169.27.89:6386 slots: (0 slots) slave replicates 0f222827c8c726ed53ef24bc14ff1654940ae41a M: 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd 192.169.27.89:6382 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: a8028dc2dd2ad84eedeae7a72d27fdff9f507393 192.169.27.89:6385 slots: (0 slots) slave replicates 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd M: 0f222827c8c726ed53ef24bc14ff1654940ae41a 192.169.27.89:6383 slots:[10923-16383] (5461 slots) master 1 additional replica(s) M: 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 192.169.27.89:6384 slots:[0-5460] (5461 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. How many slots do you want to move (from 1 to 16384)? 4096 What is the receiving node ID? 5d435ee7c5177a146c236596c0f8c6632d9fbd91 Please enter all the source node IDs. Type 'all' to use all the nodes as source nodes for the hash slots. Type 'done' once you entered all the source nodes IDs. Source node #1: 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd Source node #2: 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 Source node #3: done .... root@mi:/data# redis-cli --cluster check 192.168.100.1:6381 192.169.27.89:6387 (5d435ee7...) -> 1 keys | 4096 slots | 0 slaves. 192.169.27.89:6382 (7768e69e...) -> 1 keys | 3413 slots | 1 slaves. 192.169.27.89:6383 (0f222827...) -> 1 keys | 5461 slots | 1 slaves. 192.169.27.89:6384 (0ed9ee55...) -> 1 keys | 3414 slots | 1 slaves. [OK] 4 keys in 4 masters. 0.00 keys per slot on average. >>> Performing Cluster Check (using node 192.168.100.1:6381) S: b44850a9c1b50e5d65064d2f67577defb8707e1f 192.168.100.1:6381 slots: (0 slots) slave replicates 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 M: 5d435ee7c5177a146c236596c0f8c6632d9fbd91 192.169.27.89:6387 slots:[0-2046],[5461-7509] (4096 slots) master S: 228a908a67b823dd8a4f831095a8f58ff4909079 192.169.27.89:6386 slots: (0 slots) slave replicates 0f222827c8c726ed53ef24bc14ff1654940ae41a M: 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd 192.169.27.89:6382 slots:[7510-10922] (3413 slots) master 1 additional replica(s) S: a8028dc2dd2ad84eedeae7a72d27fdff9f507393 192.169.27.89:6385 slots: (0 slots) slave replicates 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd M: 0f222827c8c726ed53ef24bc14ff1654940ae41a 192.169.27.89:6383 slots:[10923-16383] (5461 slots) master 1 additional replica(s) M: 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 192.169.27.89:6384 slots:[2047-5460] (3414 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. root@mi:/data# root@mi:/data# redis-cli --cluster add-node 192.168.100.1:6388 192.168.100.1:6387 --cluster-slave --cluster-master-id 5d435ee7c5177a146c236596c0f8c6632d9fbd91 >>> Adding node 192.168.100.1:6388 to cluster 192.168.100.1:6387 >>> Performing Cluster Check (using node 192.168.100.1:6387) M: 5d435ee7c5177a146c236596c0f8c6632d9fbd91 192.168.100.1:6387 slots:[0-2046],[5461-7509] (4096 slots) master M: 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 192.169.27.89:6384 slots:[2047-5460] (3414 slots) master 1 additional replica(s) M: 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd 192.169.27.89:6382 slots:[7510-10922] (3413 slots) master 1 additional replica(s) S: b44850a9c1b50e5d65064d2f67577defb8707e1f 192.169.27.89:6381 slots: (0 slots) slave replicates 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 M: 0f222827c8c726ed53ef24bc14ff1654940ae41a 192.169.27.89:6383 slots:[10923-16383] (5461 slots) master 1 additional replica(s) S: a8028dc2dd2ad84eedeae7a72d27fdff9f507393 192.169.27.89:6385 slots: (0 slots) slave replicates 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd S: 228a908a67b823dd8a4f831095a8f58ff4909079 192.169.27.89:6386 slots: (0 slots) slave replicates 0f222827c8c726ed53ef24bc14ff1654940ae41a [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. >>> Send CLUSTER MEET to node 192.168.100.1:6388 to make it join the cluster. Waiting for the cluster to join >>> Configure node as replica of 192.168.100.1:6387. [OK] New node added correctly. root@mi:/data# redis-cli --cluster check 192.168.100.1:6381 192.169.27.89:6387 (5d435ee7...) -> 1 keys | 4096 slots | 1 slaves. 192.169.27.89:6382 (7768e69e...) -> 1 keys | 3413 slots | 1 slaves. 192.169.27.89:6383 (0f222827...) -> 1 keys | 5461 slots | 1 slaves. 192.169.27.89:6384 (0ed9ee55...) -> 1 keys | 3414 slots | 1 slaves. [OK] 4 keys in 4 masters. 0.00 keys per slot on average. >>> Performing Cluster Check (using node 192.168.100.1:6381) S: b44850a9c1b50e5d65064d2f67577defb8707e1f 192.168.100.1:6381 slots: (0 slots) slave replicates 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 S: 029b0b37336dda9b8ab11516f0dfc7086983a0da 192.169.27.89:6388 slots: (0 slots) slave replicates 5d435ee7c5177a146c236596c0f8c6632d9fbd91 M: 5d435ee7c5177a146c236596c0f8c6632d9fbd91 192.169.27.89:6387 slots:[0-2046],[5461-7509] (4096 slots) master 1 additional replica(s) S: 228a908a67b823dd8a4f831095a8f58ff4909079 192.169.27.89:6386 slots: (0 slots) slave replicates 0f222827c8c726ed53ef24bc14ff1654940ae41a M: 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd 192.169.27.89:6382 slots:[7510-10922] (3413 slots) master 1 additional replica(s) S: a8028dc2dd2ad84eedeae7a72d27fdff9f507393 192.169.27.89:6385 slots: (0 slots) slave replicates 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd M: 0f222827c8c726ed53ef24bc14ff1654940ae41a 192.169.27.89:6383 slots:[10923-16383] (5461 slots) master 1 additional replica(s) M: 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 192.169.27.89:6384 slots:[2047-5460] (3414 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. root@mi:/data#
在 redis-cli --cluster reshard 重新分配槽位有两种方式:
1、输入 "all" + "done" 从其他所有节点中均分一部分出来;
2、自定一些节点从中分配出槽位出来给 receiving node,输入方式: "Source node id1"、"Source node id2" 、"done" ;
以上示例中采用第二种方式;
四、主从缩容测试
目的: 6387和6388下线
# 0、 查看集群信息 redis-cli --cluster check 192.168.100.1:6381 # 1、将6388删除,从集群中将从节点6388删除 redis-cli --cluster del-node ip:从机端口 从机6388节点ID redis-cli --cluster del-node 192.168.100.1:6388 029b0b37336dda9b8ab11516f0dfc7086983a0da # 2、将6387的槽号清空,重新分配,本例将清出来的槽号都给6381 redis-cli --cluster reshard 192.168.100.1:6381 # 3、将6387删除,从集群中将主节点6387删除 redis-cli --cluster del-node ip:端口 6387节点ID redis-cli --cluster del-node 192.168.100.1:6387 5d435ee7c5177a146c236596c0f8c6632d9fbd91 # 4、查看集群信息 redis-cli --cluster check 192.168.100.1:6381 # 5、停掉被移除的redis节点 docker stop redis-node-7 redis-node-8
root@mi:/data# redis-cli --cluster check 192.168.100.1:6381 192.169.27.89:6387 (5d435ee7...) -> 2 keys | 4096 slots | 1 slaves. 192.169.27.89:6382 (7768e69e...) -> 2 keys | 3413 slots | 1 slaves. 192.169.27.89:6383 (0f222827...) -> 3 keys | 5461 slots | 1 slaves. 192.169.27.89:6384 (0ed9ee55...) -> 2 keys | 3414 slots | 1 slaves. [OK] 9 keys in 4 masters. 0.00 keys per slot on average. >>> Performing Cluster Check (using node 192.168.100.1:6381) S: b44850a9c1b50e5d65064d2f67577defb8707e1f 192.168.100.1:6381 slots: (0 slots) slave replicates 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 S: 029b0b37336dda9b8ab11516f0dfc7086983a0da 192.169.27.89:6388 slots: (0 slots) slave replicates 5d435ee7c5177a146c236596c0f8c6632d9fbd91 M: 5d435ee7c5177a146c236596c0f8c6632d9fbd91 192.169.27.89:6387 slots:[0-2046],[5461-7509] (4096 slots) master 1 additional replica(s) S: 228a908a67b823dd8a4f831095a8f58ff4909079 192.169.27.89:6386 slots: (0 slots) slave replicates 0f222827c8c726ed53ef24bc14ff1654940ae41a M: 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd 192.169.27.89:6382 slots:[7510-10922] (3413 slots) master 1 additional replica(s) S: a8028dc2dd2ad84eedeae7a72d27fdff9f507393 192.169.27.89:6385 slots: (0 slots) slave replicates 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd M: 0f222827c8c726ed53ef24bc14ff1654940ae41a 192.169.27.89:6383 slots:[10923-16383] (5461 slots) master 1 additional replica(s) M: 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 192.169.27.89:6384 slots:[2047-5460] (3414 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. ### 删除从节点 root@mi:/data# redis-cli --cluster del-node 192.168.100.1:6388 029b0b37336dda9b8ab11516f0dfc7086983a0da >>> Removing node 029b0b37336dda9b8ab11516f0dfc7086983a0da from cluster 192.168.100.1:6388 >>> Sending CLUSTER FORGET messages to the cluster... >>> Sending CLUSTER RESET SOFT to the deleted node. ### 将 6387 主节点的槽都分配出去 root@mi:/data# redis-cli --cluster reshard 192.168.100.1:6381 >>> Performing Cluster Check (using node 192.168.100.1:6381) S: b44850a9c1b50e5d65064d2f67577defb8707e1f 192.168.100.1:6381 slots: (0 slots) slave replicates 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 M: 5d435ee7c5177a146c236596c0f8c6632d9fbd91 192.169.27.89:6387 slots:[0-2046],[5461-7509] (4096 slots) master S: 228a908a67b823dd8a4f831095a8f58ff4909079 192.169.27.89:6386 slots: (0 slots) slave replicates 0f222827c8c726ed53ef24bc14ff1654940ae41a M: 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd 192.169.27.89:6382 slots:[7510-10922] (3413 slots) master 1 additional replica(s) S: a8028dc2dd2ad84eedeae7a72d27fdff9f507393 192.169.27.89:6385 slots: (0 slots) slave replicates 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd M: 0f222827c8c726ed53ef24bc14ff1654940ae41a 192.169.27.89:6383 slots:[10923-16383] (5461 slots) master 1 additional replica(s) M: 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 192.169.27.89:6384 slots:[2047-5460] (3414 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. How many slots do you want to move (from 1 to 16384)? 4096 What is the receiving node ID? 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 Please enter all the source node IDs. Type 'all' to use all the nodes as source nodes for the hash slots. Type 'done' once you entered all the source nodes IDs. Source node #1: 5d435ee7c5177a146c236596c0f8c6632d9fbd91 Source node #2: done .... Moving slot 7507 from 192.169.27.89:6387 to 192.169.27.89:6384: Moving slot 7508 from 192.169.27.89:6387 to 192.169.27.89:6384: Moving slot 7509 from 192.169.27.89:6387 to 192.169.27.89:6384: root@mi:/data# redis-cli --cluster check 192.168.100.1:6381 192.169.27.89:6387 (5d435ee7...) -> 0 keys | 0 slots | 0 slaves. 192.169.27.89:6382 (7768e69e...) -> 2 keys | 3413 slots | 1 slaves. 192.169.27.89:6383 (0f222827...) -> 3 keys | 5461 slots | 1 slaves. 192.169.27.89:6384 (0ed9ee55...) -> 4 keys | 7510 slots | 1 slaves. [OK] 9 keys in 4 masters. 0.00 keys per slot on average. >>> Performing Cluster Check (using node 192.168.100.1:6381) S: b44850a9c1b50e5d65064d2f67577defb8707e1f 192.168.100.1:6381 slots: (0 slots) slave replicates 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 M: 5d435ee7c5177a146c236596c0f8c6632d9fbd91 192.169.27.89:6387 slots: (0 slots) master S: 228a908a67b823dd8a4f831095a8f58ff4909079 192.169.27.89:6386 slots: (0 slots) slave replicates 0f222827c8c726ed53ef24bc14ff1654940ae41a M: 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd 192.169.27.89:6382 slots:[7510-10922] (3413 slots) master 1 additional replica(s) S: a8028dc2dd2ad84eedeae7a72d27fdff9f507393 192.169.27.89:6385 slots: (0 slots) slave replicates 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd M: 0f222827c8c726ed53ef24bc14ff1654940ae41a 192.169.27.89:6383 slots:[10923-16383] (5461 slots) master 1 additional replica(s) M: 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 192.169.27.89:6384 slots:[0-7509] (7510 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. root@mi:/data# ### 删除 6387 主节点的 root@mi:/data# redis-cli --cluster del-node 192.168.100.1:6387 5d435ee7c5177a146c236596c0f8c6632d9fbd91 >>> Removing node 5d435ee7c5177a146c236596c0f8c6632d9fbd91 from cluster 192.168.100.1:6387 >>> Sending CLUSTER FORGET messages to the cluster... >>> Sending CLUSTER RESET SOFT to the deleted node. root@mi:/data# root@mi:/data# redis-cli --cluster check 192.168.100.1:6381 192.169.27.89:6382 (7768e69e...) -> 2 keys | 3413 slots | 1 slaves. 192.169.27.89:6383 (0f222827...) -> 3 keys | 5461 slots | 1 slaves. 192.169.27.89:6384 (0ed9ee55...) -> 4 keys | 7510 slots | 1 slaves. [OK] 9 keys in 3 masters. 0.00 keys per slot on average. >>> Performing Cluster Check (using node 192.168.100.1:6381) S: b44850a9c1b50e5d65064d2f67577defb8707e1f 192.168.100.1:6381 slots: (0 slots) slave replicates 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 S: 228a908a67b823dd8a4f831095a8f58ff4909079 192.169.27.89:6386 slots: (0 slots) slave replicates 0f222827c8c726ed53ef24bc14ff1654940ae41a M: 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd 192.169.27.89:6382 slots:[7510-10922] (3413 slots) master 1 additional replica(s) S: a8028dc2dd2ad84eedeae7a72d27fdff9f507393 192.169.27.89:6385 slots: (0 slots) slave replicates 7768e69e7ba09cd3fa4150f27add7c2fa5d245fd M: 0f222827c8c726ed53ef24bc14ff1654940ae41a 192.169.27.89:6383 slots:[10923-16383] (5461 slots) master 1 additional replica(s) M: 0ed9ee5503e50806dfd219b34fb59d6b5fec3471 192.169.27.89:6384 slots:[0-7509] (7510 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. root@mi:/data#
完成缩容后,在客户端工具中进行查看时报以上错误,然而在 redis-cli 一起正常,删除了客户端连接重新连上后对应的错误就没再报啦。