上篇文章提到了Redis Cluster,本篇文章介绍一下Redis Cluster的选举机制。主要包括选举时机,选举过程,选举策略等。
一、概述
Redis Cluster 作为 Redis 官方分布式集群方案,内置了完整的故障检测与自动选举故障转移机制 。集群不需要额外部署哨兵,依靠节点间通信与自研的改良多数派共识算法 ,实现主节点故障后,从节点自动竞选晋升为新主节点,保障集群高可用。
本次选举仅针对故障主节点的从节点晋升,并非全局领导者选举,全程围绕故障转移、票数规则、纪元版本、防脑裂设计展开。
二、节点权限划分
在选举体系中,集群节点权限严格区分:
- 主节点(Master)
承担哈希槽存储、数据读写,拥有投票权,是集群投票的唯一主体。 - 从节点(Slave)
同步主节点数据,仅作为参选者 ,没有投票权,不能参与给其他节点投票。
三、第一步:集群故障判定(选举触发前提)
选举并不会在节点网络断开瞬间触发,Redis 设置了严谨的故障确认流程,避免网络抖动造成误切换:
- 单个节点检测到某主节点失联,将其标记为 PFAIL(疑似故障)。
- 节点之间通过 Gossip 协议 全网广播故障信息,同步节点状态。
- 集群内超过半数主节点共同标记该主节点为 PFAIL ,集群正式将节点状态更新为 FAIL(真实故障)。
- 故障状态全网确认完毕,正式启动从节点选举流程。
四、核心:过半选举算法(Quorum 多数派机制)
1. 当选票数计算公式
Redis Cluster 严格遵循分布式多数派原则 ,当选票数公式固定:
需要票数=⌈集群总主节点数2⌉+1 \boldsymbol{需要票数 = \left\lceil\frac{集群总主节点数}{2}\right\rceil + 1} 需要票数=⌈2集群总主节点数⌉+1
举例说明:
- 3 主节点集群:⌈32⌉+1=3\lceil\frac32\rceil+1=\boldsymbol{3}⌈23⌉+1=3 票方可当选
- 5 主节点集群:⌈52⌉+1=4\lceil\frac52\rceil+1=\boldsymbol{4}⌈25⌉+1=4 票方可当选
- 7 主节点集群:⌈72⌉+1=5\lceil\frac72\rceil+1=\boldsymbol{5}⌈27⌉+1=5 票方可当选
2. 底层设计依据
该过半机制来源于分布式共识理论,唯一目的是防止脑裂 :
在网络分区、集群割裂的场景下,无论网络如何断开,整个集群最多只会存在一个能够集齐过半票数的分区,其余小分区票数不足,无法选举出新主,不会出现双主节点、数据分裂的问题。
3. 硬性投票规则
- 集群内所有存活主节点参与投票。
- 单个主节点,一轮选举周期内仅能投出 1 票,投票后本轮锁定,不再重复投票。
- 投票遵循先到先得原则,哪个参选从节点率先集齐规定过半票数,直接当选。
- 票数不足的从节点本轮竞选失败,等待下一轮选举重试。
- 差一票都无法完成晋升,不支持平局当选。
五、从节点竞选优先级
同一个故障主节点下存在多个从节点时,Redis 会按照固定优先级排序,决定哪个从节点优先发起选举,优先级由高到低:
- 复制偏移量 offset
从节点与主节点的数据同步偏移量越大,代表数据越完整、数据丢失风险越低,优先级越高。 - 节点配置优先级 slave-priority
用户配置的节点权重,数值越高,竞选优先级越高。 - 节点运行 ID
当前两项均一致时,按照节点唯一 ID 字典序排序。
六、完整选举流程
- 过半主节点确认原主节点为 FAIL 故障状态,选举解锁。
- 故障主节点对应的所有从节点,按照上述优先级排序,依次发起集群选举请求。
- 各个存活主节点接收投票申请,遵循一轮一票规则进行投票。
- 某一个从节点成功集齐过半选票 ,晋升为新的主节点。
- 新主节点接管原主节点全部哈希槽,全网更新槽位映射关系。
- 集群广播新主节点信息,客户端后续通过 MOVED 重定向自动访问新主。
- 原故障主节点恢复网络后,自动降级为新主节点的从节点,开始同步新主数据。
七、关键底层机制:Epoch 纪元号(防脑裂核心)
这是 Redis Cluster 解决旧主复活冲突、重复选举、双主并存的底层版本算法,也是绝大多数讲解忽略的核心设计。
- Epoch 定义
集群全局单调递增的版本号,代表集群状态纪元,每完成一次故障转移选举,纪元号自动 +1。 - 权限规则
- 节点纪元号越大,集群权限越高。
- 新选举出的主节点,拥有全网最大的纪元号。
- 防脑裂作用
若原本故障的旧主节点网络恢复,由于其纪元号小于新主节点,集群不承认其主节点身份,强制降级为从节点 ,禁止对外写入,只能被动同步新主数据。
从根源杜绝旧主复活抢占槽位、集群双主、数据不一致的脑裂问题。
八、集群可用性约束
结合过半选举规则,可以直接推导出集群存活底线:
集群中存活的主节点数量,必须超过总主节点数量的一半,集群才能完成选举、正常对外服务。
实例分析:
- 3 主集群:最多允许 1 个主节点故障,若 2 个主节点宕机,剩余节点不足半数,无法选举,集群进入只读不可用状态。
- 5 主集群:最多允许 2 个主节点故障。
因此生产环境 Redis Cluster 均采用奇数主节点部署(3主、5主、7主),偶数节点会造成集群容错率浪费,无额外收益。
九、算法总结
Redis Cluster 并未使用标准 Raft 算法,而是借鉴 Raft 多数派思想自研简化版故障选举算法 :
以Quorum 过半机制 作为投票核心依据,严格限制主节点投票权,结合数据偏移量判定从节点竞选优先级,搭配全局单调递增 Epoch 纪元版本号 彻底解决脑裂问题。
在主节点故障时快速完成从节点晋升、槽位接管,实现业务无感知的自动故障转移,是 Redis 分布式集群高可用的底层基石。