redis集群故障修复
集群故障原因有:
(1)master节点能启动,但是master节点的IP变化了,集群还是根据旧的IP去连接节点,导致集群不能自愈。
(2)master节点某种原因不能启动,slave节点坏掉,有部分槽位slot丢失
(3)master节点因为网络原因不能连接,部分分片丢失,有部分槽位slot丢失
修复步骤:
1.把dump.rdb或者appendonly.aof文件拷贝出来,目的是先恢复redis节点数据, 如果数据能恢复,可能不需要fix修复命令,集群就可能恢复。
2.连接任一集群可用节点,cluster forget掉故障节点。可以使用call命令,例如连接172.20.20.231这个节点:
[root@centos redis]# redis-cli --cluster call 172.20.20.231:6379 cluster forget <node_id>
node_id可以通过cluster nodes查看
127.0.0.1:6379> cluster nodes
1d1731591dcb0818c312787f3f6cf60a8f0eeb93 172.20.20.235:6379@16379 master - 0 1669048747865 7 connected 0-5460
ad4cc6600fd0cdef45f82674db440f4b8586210c 172.20.20.231:6379@16379 myself,slave 1d1731591dcb0818c312787f3f6cf60a8f0eeb93 0 1669048746000 7 connected
bd110bc4ee40dc387c4c4e80d7dbeb5663886ffd 172.20.20.233:6379@16379 master - 0 1669048745858 3 connected 10923-16383
8fefbff6233465acad82627cd4ae52632903f91d 172.20.20.236:6379@16379 slave - 0 1669048746862 2 connected
568a869ae9c1712c944a0811923e198a7534395d 172.20.20.234:6379@16379 slave bd110bc4ee40dc387c4c4e80d7dbeb5663886ffd 0 1669048748869 3 connected
127.0.0.1:6379>
3.添加被删除的节点,使用meet命令:172.20.20.232为刚才删除的故障节点,这里再加回来
[root@centos redis]# redis-cli -a sxlfybb --cluster call 172.20.20.231:6379 cluster meet 172.20.20.232 6379
查看集群信息是否一致
[root@centos redis]# redis-cli --cluster call 172.20.20.231:6379 cluster nodes
[root@centos redis]# redis-cli --cluster check 172.20.20.231:6379
也可以使用add-node来添加节点
[root@centos redis]# redis-cli --cluster 172.20.20.231:6379 add-node 172.20.20.232:6379
4.fix修复节点
[root@centos redis]# redis-cli --cluster fix 172.20.20.231:6379
【注意】fix修复命令,不仅可以自动删除disconnected的节点,而且会迁移没有分配的slots到正常节点,可以使集群状态fail转变为ok。我之所以手动先给集群增加一个节点,手动删除有故障节点,然后fix修复命令,fix是会迁移的slots,需要代价的,fix完成后,还需要再平衡rebalance集群。
5.平衡集群
[root@centos redis]# redis-cli --cluster rebalance --cluster-use-empty-masters --cluster-pipeline 1000 --cluster-simulate 172.20.20.231:6379
参数说明:
–cluster-weight <node1=w1…nodeN=wN> # 指定集群节点的权重
–cluster-use-empty-masters # 设置可以让没有分配slot的主节点参与,默认不允许
–cluster-timeout <arg> # 设置migrate命令的超时时间
–cluster-simulate # 模拟rebalance操作,不会真正执行迁移操作
–cluster-pipeline <arg> # 定义cluster getkeysinslot命令一次取出的key数量,默认值为10
–cluster-threshold <arg> # 迁移的slot阈值超过threshold,执行rebalance操作
–cluster-replace # 是否直接replace到目标节点
6.保存配置
[root@centos redis]# redis-cli --cluster call 172.20.20.231:6379 cluster saveconfig