Redis-cluster调整主从关系

一、概述

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查看主从关系

 用Excel整理出主从关系

调整前

 调整后

 

从图一、表一可见,其中一对主从节点(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:700210.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为集群中任意节点
这俩条命令执行后,查看相应的redis进程已被停止,后续直接启动就行。不用单独停止10.72.14.39:7002、10.72.14.38:7003

[root@k8s-master1 redis-3.2.3]# ps -ef|grep redis
root 11222 26373 0 15:04 pts/0 00:00:00 grep --color=auto redis
root 30378 1 0 14:21 ? 00:00:04 bin/redis-server 10.72.14.39:7000 [cluster]
root 30386 1 0 14:21 ? 00:00:03 bin/redis-server 10.72.14.39:7001 [cluster]
root 30390 1 0 14:21 ? 00:00:03 bin/redis-server 10.72.14.39:7003 [cluster]
root 30394 1 0 14:21 ? 00:00:03 bin/redis-server 10.72.14.39:7004 [cluster]
root 30398 1 0 14:21 ? 00:00:03 bin/redis-server 10.72.14.39:7005 [cluster]


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

调整后

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

 

 

 用redisinsight查看集群状态正常

 

 

 

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

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

2023/4/4 模拟数据写入

还是删除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

 

 

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

[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集群怎么调整节点的主从关系 - 风纳云
https://www.fengnayun.com/news/content/84255.html

redis集群在线迁移第二篇(redis迁移后调整主从关系,停掉14机器上的所有从节点)-实战二 - jinzi - 博客园
https://www.cnblogs.com/aozhejin/p/15958573.html

redis cluster 集群畅谈(三) 之 水平扩容、slave自动化迁移
https://www.bbsmax.com/A/A2dm1EL4de/

posted @ 2023-04-04 10:26  paul_hch  阅读(927)  评论(0编辑  收藏  举报