一、概述

Redis集群创建后,可能会出现互为主从关系的节点从属于同一台服务器的情况。在此种情况下,若
服务器故障宕机或需要停机维护,互为主从关系的节点同时停止运行,导致redis集群暂时失去一部
分slot插槽。此时,redis集群为fail状态,对其进行的数据读写操作均无法正常进行。为避免此种情
况的发生,应对redis集群节点的主从关系进行调整,使互为主从关系的节点分属于不同的服务器。

二.调整方法描述

1.使用redis-trib.rb脚本将待调整的从节点从redis集群中删除。(执行此步操作时,从节点会从redis集群中去除。同时,此从节点进程会被杀掉。)命令如下:
redis-trib.rb del-node 集群中某节点IP:PORT 待调整的从节点ID
2.删除待调整从节点rdb子目录下的所有文件。(包括“dump.rdb”和“nodes-节点端口号.conf”文件。)
3.重新启动待调整的从节点。
4.使用redis-trib.rb脚本将待调整的从节点加入到redis集群中,使其与合适的主节点对应,建立起新的主从关系。命令如下:
redis-trib.rb add-node --slave --master-id 主节点ID 待调整的从节点IP:PORT 集群中某节点IP:PORT

三.具体操作方法举例

1.redis集群节点主从关系信息,通过show_redis_map.sh查看主从关系

redis从节点数据槽 redis从节点升级主节点_redis从节点数据槽

 用Excel整理出主从关系

调整前

redis从节点数据槽 redis从节点升级主节点_redis从节点数据槽_02

 调整后

redis从节点数据槽 redis从节点升级主节点_redis从节点数据槽_03

 

从图一、表一可见,其中一对主从节点(10.72.14.39:7005和10.72.14.39:7002)从属于同一台服务器。计划是蓝色和红色互相调整从节点

需要从redis集群中去除两个从节点(包括10.72.14.39:7002、10.72.14.38:7003),而后建立新的主从关系。具体操作方法如下。

(1)从redis集群中删掉两个从节点(10.72.14.39:7002、10.72.14.38:7003)
命令格式:redis-trib.rb del-node 集群中某节点IP:PORT 待调整的从节点ID

在任意一台服务器上执行下面2条命令:
/opt/redis-3.2.3/bin/redis-trib.rb del-node 10.72.14.38:7000 d4d9147bbc2023960b2d19d8c27b1c564a35461d
/opt/redis-3.2.3/bin/redis-trib.rb del-node 10.72.14.38:7000 c2adf53531cd16ac23faf9be714717615de1e604

说明10.72.14.38:7000为集群中任意节点
(2)删除两个从节点rdb子目录下的所有文件 分别在10.72.14.39和10.72.14.38服务器上执行如下命令: 
由于当时建立群集时没有分别建立目录,所以dump文件在同一文件里,这里是个隐患 (包括“dump.rdb”和“nodes-节点端口号.conf”文件。) 
先备份
# cp -a dump.rdb dump.rdb.bak
# cp -a nodes-7002.conf{,.bak}
再删除
rm -rf nodes-7002.conf
rm -rf dump.rdb

(3)重新启动删掉的两个从节点
分别在10.72.14.39和10.72.14.38服务器上执行如下命令:
# 10.72.14.39执行
/opt/redis-3.2.3/bin/redis-server conf/7002.conf

# 10.72.14.38执行
/opt/redis-3.2.3/bin/redis-server conf/7003.conf

(4)将删掉的两个从节点加入redis集群并建立新的主从关系
命令格式:redis-trib.rb add-node --slave --master-id 主节点ID 待调整的从节点IP:PORT 集群中某节点IP:PORT

在任意一台服务器上执行下面2条命令:
/opt/redis-3.2.3/bin/redis-trib.rb add-node --slave --master-id 56a26d4b176df4d93da7eac2cb356ea2e46acedf 10.72.14.39:7002 10.72.14.38:7000
/opt/redis-3.2.3/bin/redis-trib.rb add-node --slave --master-id 8af43aecd220384a947e4128c45306a4545f79e4 10.72.14.38:7003 10.72.14.38:7000

调整后

redis从节点数据槽 redis从节点升级主节点_redis从节点数据槽_03

redis从节点数据槽 redis从节点升级主节点_redis从节点数据槽_05

但是从节点的ID会变,所以就变了,但是服务器和端口是不变的

redis从节点数据槽 redis从节点升级主节点_redis集群_06

redis从节点数据槽 redis从节点升级主节点_redis从节点数据槽_07

 

 

 用redisinsight查看集群状态正常

 

redis从节点数据槽 redis从节点升级主节点_redis集群_08

 

 

其中试验环境,没有数据写入所以不能证明对集群没有影响,过程中删除了俩个从节点后,redisinsight连接10.72.14.37:7000端口时出现群集无法显示。

下次会模拟有数据写入的状态下操作,已到达对生产环境的真实模拟此操作是否会有影响!

模拟数据写入

还是删除10.72.14.38:7003、10.72.14.39:7002,再加入回集群。

[root@k8s-node2 redis-3.2.3]# /opt/redis-3.2.3/bin/redis-trib.rb del-node 10.72.14.38:7000 776300dca952b4646d678049ec91b9be636a210a
>>> Removing node 776300dca952b4646d678049ec91b9be636a210a from cluster 10.72.14.38:7000
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
[root@k8s-node2 redis-3.2.3]# /opt/redis-3.2.3/bin/redis-trib.rb del-node 10.72.14.38:7000 17b8fbfac04b4171bfecf934c5cf608e609a557c
>>> Removing node 17b8fbfac04b4171bfecf934c5cf608e609a557c from cluster 10.72.14.38:7000
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

# 关闭俩个从节点,然后写入数据,恢复后看能否读取
[root@k8s-node2 redis-3.2.3]#  /opt/redis-3.2.3/bin/redis-cli -c -p 7000 -h 10.72.14.37
10.72.14.37:7000> set test 1
-> Redirected to slot [6918] located at 10.72.14.37:7001
OK
10.72.14.37:7001> set test1 2
-> Redirected to slot [4768] located at 10.72.14.39:7000
OK
10.72.14.39:7000> exit

测试

# bin/redis-benchmark -h 10.72.14.37 -p 7000 -n 1000000 -q
PING_INLINE: 34756.01 requests per second
PING_BULK: 34641.63 requests per second
SET: 34189.20 requests per second
GET: 34866.29 requests per second
INCR: 34702.94 requests per second
LPUSH: 34736.70 requests per second
RPUSH: 34514.89 requests per second
LPOP: 34907.67 requests per second
RPOP: 34374.89 requests per second
SADD: 34575.75 requests per second
SPOP: 34478.00 requests per second
LPUSH (needed to benchmark LRANGE): 34391.45 requests per second
LRANGE_100 (first 100 elements): 34106.41 requests per second
LRANGE_300 (first 300 elements): 34526.81 requests per second
LRANGE_500 (first 450 elements): 34121.54 requests per second
LRANGE_600 (first 600 elements): 34820.15 requests per second
MSET (10 keys): 33549.17 requests per second

-p:端口,-n:请求书,-q:强制退出redis

redis从节点数据槽 redis从节点升级主节点_redis从节点数据槽_09

 

 

俩个节点重新分配恢复后,读取数据成功 

[root@k8s-node2 redis-3.2.3]# /opt/redis-3.2.3/bin/redis-cli -c -p 7002 -h 10.72.14.39
10.72.14.39:7002> get test
-> Redirected to slot [6918] located at 10.72.14.37:7001
"1"
10.72.14.37:7001> get test1
-> Redirected to slot [4768] located at 10.72.14.39:7000
"2"
10.72.14.39:7000> exit
[root@k8s-node2 redis-3.2.3]# /opt/redis-3.2.3/bin/redis-cli -c -p 7003 -h 10.72.14.38
10.72.14.38:7003> get test1
-> Redirected to slot [4768] located at 10.72.14.39:7000
"2"
10.72.14.39:7000> get test
-> Redirected to slot [6918] located at 10.72.14.37:7001
"1"
10.72.14.37:7001>

 调整后,ID又变了

redis从节点数据槽 redis从节点升级主节点_redis从节点数据槽_10

 

 

 

 参考

Redis集群怎么调整节点的主从关系 - 风纳云
https://www.fengnayun.com/news/content/84255.html