Redis集群节点失联重连修复实操指南
问题场景
Redis集群中某个节点因网络抖动、机器重启或资源耗尽导致与主节点及集群内其他节点失联,集群状态变为PFAIL或FAIL,部分槽位无法服务。本文提供一套标准修复流程,帮助运维人员快速恢复集群完整性。
一、检查集群当前状态
登录任意正常节点,执行:
redis-cli -h <正常节点IP> -p <端口> cluster nodes观察输出:失联节点状态通常为disconnected或fail。同时检查集群是否大部分槽位正常:
redis-cli cluster info关注cluster_state字段,若为ok(但某节点标记为fail),则仍可进行修复。
二、诊断失联原因
先排查基础链路:
- ping 失联节点IP是否可达
- 检查节点端口(默认6379+集群总线端口16379)是否被防火墙或安全组拦截
- 查看失联节点日志(如
/var/log/redis/redis.log),确认是否有OOM、too many open files或timeout错误
三、修复步骤
3.1 强制移除失效节点
若节点确定无法恢复(如硬件损坏),需先将其从集群中剔除,再补全新节点。使用cluster forget命令在集群中所有正常节点上执行:
redis-cli -h <正常节点> cluster forget <失联节点ID>其中节点ID从cluster nodes输出中获取。
3.2 重启并重新加入集群
若节点仅临时失联,尝试重启服务:
systemctl restart redis(或对应启动命令)重启后该节点会自动尝试与集群中剩余节点握手。若集群剩余节点已将其标记为FAIL,需手动执行cluster meet重新加入:
redis-cli -h <失联节点IP> -p <端口> cluster meet <任意正常节点IP> <该节点端口>3.3 分配槽位并同步数据
若被移除的节点原有槽位,需重新分配。使用redis-cli --cluster rebalance或手动cluster addslots。更推荐用redis-trib.rb(集群3.x早期)或redis-cli --cluster fix(集群5.x+)自动修复:
redis-cli --cluster fix <任意正常节点IP:端口>脚本会自动检查槽位分布并迁移。
3.4 调整超时参数
为防止频繁失联,可调整cluster-node-timeout(默认15000ms)。在redis.conf中修改后重启节点:
cluster-node-timeout 30000 # 若网络不稳定可适当增大四、验证恢复
重新执行cluster nodes,确认失联节点状态变为connected且正确处于master或slave角色。使用cluster info确认cluster_state:ok,槽位覆盖率达到100%。最后执行redis-cli --cluster check <任意节点IP:端口>进行完整校验。
五、注意事项
- 任何时候不要手动修改节点运行文件(如nodes.conf),否则可能导致集群元数据错乱。
- 若节点是slave,可先提升其他slave或手动故障转移,避免数据丢失影响业务。
- 生产环境建议先进行备份(如BGSAVE)再操作。