Redis集群主从切换的核心是通过cluster failover命令实现的,当主节点故障时,从节点会自动检测并竞选成为新主节点。操作指南:使用redis-cli连接从节点,执行CLUSTER FAILOVER命令即可手动触发从转主。原理是基于Raft-like的共识算法,从节点通过ping-pong心跳检测主节点存活,超时后发起选举,获得多数票后执行failover。
主从切换流程详解
1. 从节点定时发送PING到主节点和其他节点,检测超时。2. 超时后,从节点进入FAILOVER状态,增加epoch值。3. 广播FAILOVER_AUTH_REQUEST给其他从节点,收集票数。4. 获得半数以上票后,执行CLUSTER FAILOVER,生成新配置epoch,并通知所有节点更新槽映射。5. 成功后,从节点升级为主节点,原主节点若恢复则成为从节点。
手动从转主命令操作
连接到从节点:redis-cli -h slave_ip -p 6380 -c 执行:CLUSTER FAILOVER 可选参数:CLUSTER FAILOVER TAKEOVER(强制接管,用于所有从节点故障时)。注意:需确保主节点已故障,否则会失败。验证:CLUSTER NODES查看节点角色变化。
故障切换原理科普
Redis Cluster使用Gossip协议传播状态,每个节点维护clusterState,包括节点表、槽表、epoch等。主从切换时,epoch递增确保配置版本一致。pfkey用于从节点优先级排序,配置cluster-node-timeout控制超时时间,默认15秒。切换后,客户端通过MOVED/ASK重定向到新主。
常见问题处理
切换失败原因:1. 票数不足(少于半数从节点)。2. epoch不一致。3. 超时配置不当。解决方案:调整cluster-node-timeout,增加从节点数量,手动清理旧配置。
实际案例分享
在生产环境中,部署3主3从,模拟主节点kill -9后,从节点自动切换约10秒完成。日志显示:"Become candidate... Got enough votes"。手动切换用于维护:先CLUSTER FAILOVER,再MIGRATE槽到新主。
配置优化建议
redis.conf中设置cluster-require-full-coverage no,避免单节点故障全集群下线。cluster-migration-barrier 1,确保有从节点才迁移。监控脚本:watch -n1 "redis-cli -c cluster nodes | grep myself"。
FAQ
Q: 从节点如何知道主节点故障?
A: 通过PING超时,超过cluster-node-timeout的一半时间未收到PONG。
Q: 手动CLUSTER FAILOVER什么时候用?
A: 主节点计划维护或网络分区恢复时强制切换。
Q: 切换后客户端如何感知?
A: 收到MOVED错误后自动重定向到新主节点IP:端口。
Q: 多从节点如何选举?
A: 优先级高的(runid小)、最近PONG快、epoch小的从节点获胜。