详细介绍:Redis集群中的故障判定和故障迁移流程

故障判定

集群中的所有节点, 都会周期性的使⽤⼼跳包进⾏通信.
  1. 节点 A 给节点 B 发送 ping 包,B 会返回 pong 包。ping 和 pong 除message type属性外其他部分一致,包含集群配置信息(节点 id、所属分片、主从节点类型、从属关系、持有 slots 的位图等)。
  2. 每个节点每秒钟给一些随机节点发起 ping 包,而非全量发送,以避免节点多时间心跳包呈 N² 级别增长(如 9 个节点全发会有 72 组心跳)。
  3. 节点 A 发 ping 包给 B,B 未如期回应时,A 尝试重置与 B 的 tcp 连接,若仍失败,A 将 B 设为 PFAIL 状态(主观下线)。
  4. A 判定 B 为 PFAIL 后,通过 Redis 内置的 Gossip 协议与其他节点沟通,确认 B 的状态(每个节点维护自己的 “下线列表”,因视角不同列表可能不同)。
  5. 此时 A 发现其他很多节点, 也认为 B 为 PFAIL, 并且数⽬超过总集群个数的⼀半, 那么 A 就会把 B 标记成 FAIL (相当于客观下线), 并且把该消息同步给其他节点(其他节点收到之后, 也会把 B 标记成 FAIL).
    ⾄此, B 就彻底被判定为故障节点了.

故障迁移

所谓故障迁移, 就是指把从节点提拔成主节点, 继续给整个 redis 集群提供⽀持

上述例子中,B 故障,A 把 B FAIL 的消息告知集群中其他节点。

  • 从节点,不要求进行故障迁移。就是倘若 B
  • 要是 B 是主节点,由 B 的从节点(如 C 和 D)触发故障迁移。
  1. 从节点判定自己是否具有参选资格。若从节点和主节点太久没通信(认为数据差异过大),时间超过阈值,就失去竞选资格。
  2. 具有资格的节点(如 C 和 D)先休眠一定时间。休眠时间 = 500ms 基础时间 + [0, 500ms] 随机时间 + 排名 * 1000ms。offset 的值越大,排名越靠前(越小)。
  3. 如 C 的休眠时间到了,C 会给集群中所有节点拉票,但只有主节点才有投票资格。
  4. 主节点把票投给 C(每个主节点只有 1 票)。当 C 收到的票数超过主节点数目的一半,C 晋升成主节点。C 自行执行slaveof no one,并让 D 执行slaveof C
  5. 同时,C 把自己成为主节点的消息同步给其他集群节点,大家更新保存的集群结构信息。

上述选举过程称为Raft 算法,是分布式系统中广泛使用的算法。在随机休眠时间的加持下,基本是谁先唤醒,谁就能竞选成功。

posted on 2025-12-05 12:12  ljbguanli  阅读(0)  评论(0)    收藏  举报