Redis Cluster 集群选举机制

上篇文章提到了Redis Cluster,本篇文章介绍一下Redis Cluster的选举机制。主要包括选举时机,选举过程,选举策略等。

一、概述

Redis Cluster 作为 Redis 官方分布式集群方案,内置了完整的故障检测与自动选举故障转移机制 。集群不需要额外部署哨兵,依靠节点间通信与自研的改良多数派共识算法 ,实现主节点故障后,从节点自动竞选晋升为新主节点,保障集群高可用。

本次选举仅针对故障主节点的从节点晋升,并非全局领导者选举,全程围绕故障转移、票数规则、纪元版本、防脑裂设计展开。

二、节点权限划分

在选举体系中,集群节点权限严格区分:

  1. 主节点(Master)
    承担哈希槽存储、数据读写,拥有投票权,是集群投票的唯一主体。
  2. 从节点(Slave)
    同步主节点数据,仅作为参选者没有投票权,不能参与给其他节点投票。

三、第一步:集群故障判定(选举触发前提)

选举并不会在节点网络断开瞬间触发,Redis 设置了严谨的故障确认流程,避免网络抖动造成误切换:

  1. 单个节点检测到某主节点失联,将其标记为 PFAIL(疑似故障)
  2. 节点之间通过 Gossip 协议 全网广播故障信息,同步节点状态。
  3. 集群内超过半数主节点共同标记该主节点为 PFAIL ,集群正式将节点状态更新为 FAIL(真实故障)
  4. 故障状态全网确认完毕,正式启动从节点选举流程

四、核心:过半选举算法(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. 集群内所有存活主节点参与投票。
  2. 单个主节点,一轮选举周期内仅能投出 1 票,投票后本轮锁定,不再重复投票。
  3. 投票遵循先到先得原则,哪个参选从节点率先集齐规定过半票数,直接当选。
  4. 票数不足的从节点本轮竞选失败,等待下一轮选举重试。
  5. 差一票都无法完成晋升,不支持平局当选。

五、从节点竞选优先级

同一个故障主节点下存在多个从节点时,Redis 会按照固定优先级排序,决定哪个从节点优先发起选举,优先级由高到低:

  1. 复制偏移量 offset
    从节点与主节点的数据同步偏移量越大,代表数据越完整、数据丢失风险越低,优先级越高。
  2. 节点配置优先级 slave-priority
    用户配置的节点权重,数值越高,竞选优先级越高。
  3. 节点运行 ID
    当前两项均一致时,按照节点唯一 ID 字典序排序。

六、完整选举流程

  1. 过半主节点确认原主节点为 FAIL 故障状态,选举解锁。
  2. 故障主节点对应的所有从节点,按照上述优先级排序,依次发起集群选举请求。
  3. 各个存活主节点接收投票申请,遵循一轮一票规则进行投票。
  4. 某一个从节点成功集齐过半选票 ,晋升为新的主节点
  5. 新主节点接管原主节点全部哈希槽,全网更新槽位映射关系。
  6. 集群广播新主节点信息,客户端后续通过 MOVED 重定向自动访问新主。
  7. 原故障主节点恢复网络后,自动降级为新主节点的从节点,开始同步新主数据。

七、关键底层机制:Epoch 纪元号(防脑裂核心)

这是 Redis Cluster 解决旧主复活冲突、重复选举、双主并存的底层版本算法,也是绝大多数讲解忽略的核心设计。

  1. Epoch 定义
    集群全局单调递增的版本号,代表集群状态纪元,每完成一次故障转移选举,纪元号自动 +1。
  2. 权限规则
    • 节点纪元号越大,集群权限越高。
    • 新选举出的主节点,拥有全网最大的纪元号。
  3. 防脑裂作用
    若原本故障的旧主节点网络恢复,由于其纪元号小于新主节点,集群不承认其主节点身份,强制降级为从节点 ,禁止对外写入,只能被动同步新主数据。
    从根源杜绝旧主复活抢占槽位、集群双主、数据不一致的脑裂问题。

八、集群可用性约束

结合过半选举规则,可以直接推导出集群存活底线:

集群中存活的主节点数量,必须超过总主节点数量的一半,集群才能完成选举、正常对外服务。

实例分析:

  • 3 主集群:最多允许 1 个主节点故障,若 2 个主节点宕机,剩余节点不足半数,无法选举,集群进入只读不可用状态。
  • 5 主集群:最多允许 2 个主节点故障

因此生产环境 Redis Cluster 均采用奇数主节点部署(3主、5主、7主),偶数节点会造成集群容错率浪费,无额外收益。

九、算法总结

Redis Cluster 并未使用标准 Raft 算法,而是借鉴 Raft 多数派思想自研简化版故障选举算法

Quorum 过半机制 作为投票核心依据,严格限制主节点投票权,结合数据偏移量判定从节点竞选优先级,搭配全局单调递增 Epoch 纪元版本号 彻底解决脑裂问题。

在主节点故障时快速完成从节点晋升、槽位接管,实现业务无感知的自动故障转移,是 Redis 分布式集群高可用的底层基石。

相关推荐
爱学习的小囧2 小时前
ESXi/vCenter 批量开关虚拟机完整教程 | PowerCLI 一键 + 原生脚本循环,新手也能落地
运维·网络·数据库·esxi
m0_747854522 小时前
PHP 中 OR 运算符逻辑误用的典型陷阱与正确写法
jvm·数据库·python
Shorasul2 小时前
JavaScript中Symbol类型的唯一性特征与创建规范
jvm·数据库·python
王仲肖2 小时前
PostgreSQL查询执行阶段 — 总结与执行计划选择指南
数据库·postgresql
解救女汉子2 小时前
Bootstrap Gutters间距用法 Bootstrap 5中g-,gx-,gy--如何使用
jvm·数据库·python
2401_887724502 小时前
JavaScript中Object-hasOwn作为现代安全检测方案
jvm·数据库·python
qq_334563552 小时前
如何利用RETURNING获取ROWID_更新单行后快速定位物理地址
jvm·数据库·python
zhangchaoxies2 小时前
HTML怎么显示同步最后成功时间_HTML “上次同步:X分钟前”【教程】
jvm·数据库·python
m0_514520572 小时前
mysql服务器如何优化网络传输设置_调整tcp相关内核参数
jvm·数据库·python