Redis集群模式的故障转移(failover)机制是确保集群高可用性的核心特性之一,主要由Redis Sentinel(哨兵)系统或Redis Cluster内置的机制来实现。下面分别简述两者在故障转移方面的源码解析概要:
Redis Sentinel故障转移
Sentinel是Redis的一个独立进程,用于监控Redis主服务器和从服务器的状态,并在主服务器不可用时自动执行故障转移。
-
状态检测与标记:
- Sentinel通过定时发送PING命令来检测Redis实例的状态。在
sentinel.c
中,sentinelEventLoop
函数是事件循环的入口,负责调度监控任务。 - 当Sentinel检测到主服务器不可达时,会在
sentinel.c
中的sentinelTryFailover
等函数中将主服务器标记为sdown
(主观下线)。
- Sentinel通过定时发送PING命令来检测Redis实例的状态。在
-
故障转移决策:
- 如果足够多的Sentinel(根据配置的quorum)认为主服务器下线,那么其中一个Sentinel会被选为领导者,并尝试执行故障转移。
- 这一决策过程发生在
sentinel.c
的sentinelStartFailoverIfNeeded
函数中,包括选举领导者、选择新的主服务器(优先级高的从服务器)等。
-
执行故障转移:
- 选为领导者的Sentinel将向被选中的从服务器发送
SLAVEOF NO ONE
命令使其成为新的主服务器,并通知其他从服务器改向新的主服务器同步。 - 故障转移的具体操作逻辑在
sentinel.c
的sentinelDoFailover
等函数中。
- 选为领导者的Sentinel将向被选中的从服务器发送
Redis Cluster故障转移
Redis Cluster自身也具备一定的故障转移能力,主要依靠节点间的Gossip协议来传播主节点故障信息,并通过内部的选举过程来选择新的主节点。
-
故障检测:
- 集群中的每个节点都通过定期的PING/PONG消息来检测其它节点的健康状态,这部分逻辑在
cluster.c
中的clusterCron
函数调度执行。
- 集群中的每个节点都通过定期的PING/PONG消息来检测其它节点的健康状态,这部分逻辑在
-
槽位迁移与选举新主:
- 当主节点故障被检测到后,集群中的其他节点会尝试选举一个从节点作为新的主节点,并迁移原主节点的哈希槽。
- 选举逻辑在
cluster.c
的clusterFailover
等函数中,涉及槽位迁移请求、选举新主节点的投票过程。
-
配置纪元与一致性:
- 为了保证故障转移过程的一致性,Redis Cluster使用配置纪元(configuration epoch)来跟踪每一次配置变更。
- 新主节点的选举必须基于更高的配置纪元,以防止多个节点同时尝试接管主节点的情况,这部分逻辑在
cluster.c
中的配置变更流程中体现。
源码阅读提示
- 在阅读源码时,重点关注
sentinel.c
(针对Sentinel)和cluster.c
(针对Redis Cluster)中的相关函数,特别是那些涉及状态检测、故障标记、选举、槽位迁移的逻辑。 - 理解Gossip协议在集群信息传播中的作用,以及如何通过Gossip协议确保集群状态的最终一致性。
- 注意Redis集群和Sentinel系统在设计上的不同,Sentinel适用于单个主节点加多个从节点的架构,而Redis Cluster提供了多主多从的分布式解决方案,两者的故障转移机制有所差异。