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


Redis核心技术与实战

基础篇

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

如果主库发生故障,直接会影响到从库的同步,因为从库没有相应的主库可以进行数据复制操作。而且,如果客户端发送的都是读操作请求,那还可以由从库继续提供服务,这在纯读的业务场景下还能被接受。但是,一旦有写操作请求,按照主从库模式下的读写分离要求,需要由主库来完成写操作。

如果主库挂了,就需要运行一个新主库,比如说把一个从库切换为主库,把它当成主库。这就涉及到三个问题:

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

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

哨兵机制的基本流程

哨兵其实就是一个运行在特殊模式下的 Redis 进程,主从库实例运行的同时,它也在运行。哨兵主要负责的就是三个任务:监控、选主(选择主库)和通知。

  • 监控
    监控是指哨兵进程在运行时,周期性地给所有的主从库发送 PING 命令,检测它们是否仍然在线运行。如果从库没有在规定时间内响应哨兵的 PING 命令,哨兵就会把它标记为“下线状态”;同样,如果主库也没有在规定时间内响应哨兵的 PING 命令,哨兵就会判定主库下线,然后开始自动切换主库的流程。
  • 选主
    主库挂了以后,哨兵就需要从很多个从库里,按照一定的规则选择一个从库实例,把它作为新的主库。
  • 通知
    在执行通知任务时,哨兵会把新主库的连接信息发给其他从库,让它们执行 replicaof 命令,和新主库建立连接,并进行数据复制。同时,哨兵会把新主库的连接信息通知给客户端,让它们把请求操作发到新主库上。

在这里插入图片描述

在这三个任务中,通知任务相对来说比较简单,哨兵只需要把新主库信息发给从库和客户端,让它们和新主库建立连接就行,并不涉及决策的逻辑。但是,在监控和选主这两个任务中,哨兵需要做出两个决策:

  • 在监控任务中,哨兵需要判断主库是否处于下线状态;
  • 在选主任务中,哨兵也要决定选择哪个从库实例作为主库。

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

主观下线和客观下线

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

如果检测的是从库,那么,哨兵简单地把它标记为“主观下线”就行了,因为从库的下线影响一般不太大,集群的对外服务不会间断。

如果检测的是主库,那么,哨兵还不能简单地把它标记为“主观下线”,开启主从切换。因为很有可能存在这么一个情况:那就是哨兵误判了,其实主库并没有故障。可是,一旦启动了主从切换,后续的选主和通知操作都会带来额外的计算和通信开销。

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

疑问:如何减少减少误判?

通常会采用多实例组成的集群模式进行部署,这也被称为哨兵集群。引入多个哨兵实例一起来判断,就可以避免单个哨兵因为自身网络状况不好,而误判主库下线的情况。

只有大多数的哨兵实例,都判断主库已经“主观下线”了,主库才会被标记为“客观下线”。

在这里插入图片描述

“客观下线”的标准就是,当有 N 个哨兵实例时,最好要有 N/2 + 1 个实例判断主库为“主观下线”,才能最终判定主库为“客观下线”。

如何选定新主库?

一般来说,哨兵选择新主库的过程称为 “筛选 + 打分”。先按照一定的筛选条件,把不符合条件的从库去掉。然后再按照一定的规则,给剩下的从库逐个打分,将得分最高的从库选为新主库。

在这里插入图片描述

在选主时,除了要检查从库的当前在线状态,还要判断它之前的网络连接状态。 如果从库总是和主库断连,而且断连次数超出了一定的阈值,可以判定这个从库的网络状况并不是太好,就可以把这个从库筛掉。

疑问:如何判段从库网络状态?

使用配置项 down-after-milliseconds * 10。其中,down-after-milliseconds 是主从库断连的最大连接超时时间。如果在 down-after-milliseconds 毫秒内,主从节点都没有通过网络联系上,就可以认为主从节点断连。如果发生断连的次数超过了 10 次,就说明这个从库的网络状况不好,不适合作为新主库。

从库打分规则分别是从库优先级、从库复制进度以及从库 ID 号。

  1. 第一轮:优先级最高的从库得分高
    通过 slave-priority 配置项,给不同的从库设置不同优先级。
  2. 第二轮:和旧主库同步程度最接近的从库得分高
    如果在所有从库中,有从库的 slave_repl_offset 最接近 master_repl_offset,那么它的得分就最高,可以作为新主库。
  3. 第三轮:ID 号小的从库得分高
    在优先级和复制进度都相同的情况下,ID 号最小的从库得分最高,会被选为新主库。

整个选主流程:首先,哨兵会按照在线状态、网络状态,筛选过滤掉一部分不符合要求的从库,然后,依次按照优先级、复制进度、ID 号大小再对剩余的从库进行打分,只要有得分最高的从库出现,就把它选为新主库。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

久违の欢喜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值