Redis 源码解析 - Redis 集群模式failover

Redis集群模式的故障转移(failover)机制是确保集群高可用性的核心特性之一,主要由Redis Sentinel(哨兵)系统或Redis Cluster内置的机制来实现。下面分别简述两者在故障转移方面的源码解析概要:

Redis Sentinel故障转移

Sentinel是Redis的一个独立进程,用于监控Redis主服务器和从服务器的状态,并在主服务器不可用时自动执行故障转移。

  1. 状态检测与标记

    • Sentinel通过定时发送PING命令来检测Redis实例的状态。在sentinel.c中,sentinelEventLoop函数是事件循环的入口,负责调度监控任务。
    • 当Sentinel检测到主服务器不可达时,会在sentinel.c中的sentinelTryFailover等函数中将主服务器标记为sdown(主观下线)。
  2. 故障转移决策

    • 如果足够多的Sentinel(根据配置的quorum)认为主服务器下线,那么其中一个Sentinel会被选为领导者,并尝试执行故障转移。
    • 这一决策过程发生在sentinel.csentinelStartFailoverIfNeeded函数中,包括选举领导者、选择新的主服务器(优先级高的从服务器)等。
  3. 执行故障转移

    • 选为领导者的Sentinel将向被选中的从服务器发送SLAVEOF NO ONE命令使其成为新的主服务器,并通知其他从服务器改向新的主服务器同步。
    • 故障转移的具体操作逻辑在sentinel.csentinelDoFailover等函数中。

Redis Cluster故障转移

Redis Cluster自身也具备一定的故障转移能力,主要依靠节点间的Gossip协议来传播主节点故障信息,并通过内部的选举过程来选择新的主节点。

  1. 故障检测

    • 集群中的每个节点都通过定期的PING/PONG消息来检测其它节点的健康状态,这部分逻辑在cluster.c中的clusterCron函数调度执行。
  2. 槽位迁移与选举新主

    • 当主节点故障被检测到后,集群中的其他节点会尝试选举一个从节点作为新的主节点,并迁移原主节点的哈希槽。
    • 选举逻辑在cluster.cclusterFailover等函数中,涉及槽位迁移请求、选举新主节点的投票过程。
  3. 配置纪元与一致性

    • 为了保证故障转移过程的一致性,Redis Cluster使用配置纪元(configuration epoch)来跟踪每一次配置变更。
    • 新主节点的选举必须基于更高的配置纪元,以防止多个节点同时尝试接管主节点的情况,这部分逻辑在cluster.c中的配置变更流程中体现。

源码阅读提示

  • 在阅读源码时,重点关注sentinel.c(针对Sentinel)和cluster.c(针对Redis Cluster)中的相关函数,特别是那些涉及状态检测、故障标记、选举、槽位迁移的逻辑。
  • 理解Gossip协议在集群信息传播中的作用,以及如何通过Gossip协议确保集群状态的最终一致性。
  • 注意Redis集群和Sentinel系统在设计上的不同,Sentinel适用于单个主节点加多个从节点的架构,而Redis Cluster提供了多主多从的分布式解决方案,两者的故障转移机制有所差异。
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值