07 哨兵机制:主库挂了,如何不间断服务?

极客时间 | 《Redis核心技术与实战》学习笔记目录

从库切换为主库,涉及三个问题

  • 主库真的挂了吗?
  • 该选择哪个从库作为主库?
  • 怎么把新主库的相关信息通知给从库和客户端呢?

在 Redis 主从集群中,哨兵机制是实现主从库自动切换的关键机制,它有效地解决了主从复制模式下故障转移的这三个问题。

哨兵机制的基本流程

哨兵其实就是一个运行在特殊模式下的 Redis 进程,主从库实例运行的同时,它也在运行。哨兵主要负责的就是三个任务:

  • 监控
  • 选主(选择主库)
  • 通知

image

主观下线和客观下线

哨兵对主库的下线判断有“主观下线”和“客观下线”两种

主观下线

哨兵进程会使用 PING 命令检测它自己和主、从库的网络连接情况,用来判断实例的状态。如果哨兵发现主库或从库对 PING 命令的响应超时了,那么,哨兵就会先把它标记为“主观下线”。

误判

主库实际并没有下线,但是哨兵误以为它下线了。误判一般会发生在集群网络压力较大、网络拥塞,或者是主库本身压力较大的情况下。

哨兵集群

采用多实例组成的集群模式进行部署

  • 引入多个哨兵实例一起来判断,就可以避免单个哨兵因为自身网络状况不好,而误判主库下线的情况。
  • 同时,多个哨兵的网络同时不稳定的概率较小,由它们一起做决策,误判率也能降低。

“客观下线”的标准

  • 当有 N 个哨兵实例时,最好要有 N/2 + 1 个实例判断主库为“主观下线”,才能最终判定主库为“客观下线”。
  • 这样一来,就可以减少误判的概率,也能避免误判带来的无谓的主从库切换。

如何选定新主库?

哨兵选择新主库的过程称为“筛选 + 打分”

  • 首先,在多个从库中,先按照一定的筛选条件(在线状态、网络状态),把不符合条件的从库去掉。
  • 然后,我们再按照一定的规则(优先级、复制进度、ID 号大小),给剩下的从库逐个打分,将得分最高的从库选为新主库

在选主时,除了要检查从库的当前在线状态,还要判断它之前的网络连接状态

可以分别按照三个规则依次进行三轮打分

  • 第一轮:从库优先级
    • 用户可以通过 slave-priority 配置项,给不同的从库设置不同优先级
  • 第二轮:从库复制进度
  • 第三轮:从库 ID 号
    • 在优先级和复制进度都相同的情况下,ID 号最小的从库得分最高,会被选为新主库。
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus