深入检出 Redis Sentinel ②:故障转移

可实现 多个主从复制 的故障转移
主观下线: 一个 sentinel 节点主观地认为某个 redis 节点已下线,即这个主观认知可能是错误的(因网络等因素)
客观下线: 超过 quorum 个 sentinel 节点认为某个 master 节点已下线,达成共识。通过 sentinel is-master-down-by-addr 询问其他 sentinel 节点对该 master 节点的看法

sentinel monitor ${masterName} ${ip} ${port} ${quorum}

命令:

  • sentinel is-master-down-by-addr:
    • 客观下线时 sentinel 节点询问其他 sentinel 节点对该 master 节点的看法
    • 选举 sentinel 节点领导
  • sentinel failover ${masterName}: 手动故障转移

1. 定时任务监控

  1. 每 10 秒每个 sentinel 对 master 和 slave 执行 info
    1. 发现 slave 节点
    2. 确定主从关系

image.png

  1. 每 2 秒每个 sentinel 通过 master 节点的 channel 交换信息(发布 / 订阅)
    1. 通过订阅 sentinel:hello 频道实现交互
    2. 交互对节点的认知和自身信息

image.png

  1. 每 1 秒每个 sentinel 对其他 sentinel 和 redis 执行 ping

2. 过程

  1. 发现问题: 多个 sentinel 结点发现 master 出现问题(主观下线 + 客观下线)
  2. sentinel 选举领导(raft 算法): 选举出一个 sentinel 作为领导
    1. 拉票: 每个做出了主观下线的 sentinel 节点(A)会向其他 sentinel 节点(B)发送 sentinel is-master-down-by-addr 命令,以获得 B 的投票。若 B 尚未投票则投票给 A
    2. 成为领导者: 如果某个拉票的 sentinel 节点获得的票数超过 sentinel 集合的半数且超过 quorum,则成为领导者。若有选出了多个领导者,则重新进行选举
  3. redis 选举新 master: 从 slave 中选出一个新的 master,并让其余的 slave 成为新 master 的 slave
    1. 优先级: 首先选择 slave-priority(节点优先级)最高的 slave 节点
    2. 复制完整性: 其次选择复制偏移量最大的(复制最完整的) slave 节点
    3. 启动最早: 再其次选择 runId 最小的(启动最早的) slave 节点
  4. 通知客户端: 通知客户端主从变化
  5. 监听故障 master: 监听等待故障的 master 恢复,恢复后使其成为新 master 的 slave