深入检出 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. 定时任务监控
- 每 10 秒每个 sentinel 对 master 和 slave 执行 info
- 发现 slave 节点
- 确定主从关系
- 每 2 秒每个 sentinel 通过 master 节点的 channel 交换信息(发布 / 订阅)
- 通过订阅 sentinel:hello 频道实现交互
- 交互对节点的认知和自身信息
- 每 1 秒每个 sentinel 对其他 sentinel 和 redis 执行 ping
2. 过程
- 发现问题: 多个 sentinel 结点发现 master 出现问题(主观下线 + 客观下线)
- sentinel 选举领导(raft 算法): 选举出一个 sentinel 作为领导
- 拉票: 每个做出了主观下线的 sentinel 节点(A)会向其他 sentinel 节点(B)发送 sentinel is-master-down-by-addr 命令,以获得 B 的投票。若 B 尚未投票则投票给 A
- 成为领导者: 如果某个拉票的 sentinel 节点获得的票数超过 sentinel 集合的半数且超过 quorum,则成为领导者。若有选出了多个领导者,则重新进行选举
- redis 选举新 master: 从 slave 中选出一个新的 master,并让其余的 slave 成为新 master 的 slave
- 优先级: 首先选择 slave-priority(节点优先级)最高的 slave 节点
- 复制完整性: 其次选择复制偏移量最大的(复制最完整的) slave 节点
- 启动最早: 再其次选择 runId 最小的(启动最早的) slave 节点
- 通知客户端: 通知客户端主从变化
- 监听故障 master: 监听等待故障的 master 恢复,恢复后使其成为新 master 的 slave