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 分布式集群高可用的底层基石。

相关推荐
LJianK13 小时前
服务器内存过高排查流程
数据库
李白客3 小时前
SQL Server 迁移注意事项:一次的真实复盘与经验沉淀
数据库·sqlserver·迁移学习
ZC跨境爬虫3 小时前
SQL学习日志 Day_3 :(SELECT查询语句入门)
数据库·sql·学习·oracle
lld9510273 小时前
(二)从验证到执行:策略实时运行全链路
linux·服务器·数据库
ss2733 小时前
ai编程Trae cn生成图书管理系统(1)
java·数据库·spring boot·python·flask·fastapi
AwakeFantasy3 小时前
关于Codex中转站生图比例问题的解决记录
数据库·redis·缓存
tkevinjd3 小时前
事务、ACID与隔离
java·数据库·sql
AI人工智能+电脑小能手3 小时前
【大白话说Java面试题 第91题】【Mysql篇】第21题:分布式锁的使用场景和原理?
java·数据库·分布式·mysql·面试
流星白龙4 小时前
【MySQL高阶】18.缓冲池页管理
数据库·windows·mysql
XZ-0700014 小时前
MySQL-前缀索引
数据库·mysql