Docker 中 Redis 集群环境搭建、缩容、扩容

Mar 21, 2023 阅读(369)

标签: Redis Docker

一、3主3从集群搭建

  1. 新建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端口号

 

  1. 构建主从关系

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
  1. 进入docker容器后才能执行一下命令,且注意自己的真实IP地址;

  2. --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#
  1. 查看集群状态

# 连入容器中
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 返回的信息可以看到集群结构如下:

 

  1. 测试数据操作(非正常的操作)

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 参数启动集群模式进行连接操作。

 

  1. 测试数据操作(正常的操作)

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#
  1. 再启动 主机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#

1679120979(1)

完成缩容后,在客户端工具中进行查看时报以上错误,然而在 redis-cli 一起正常,删除了客户端连接重新连上后对应的错误就没再报啦。

MongoDB学习园