哨兵机制:主库挂了,如何不间断服务?
我们都了解 Redis主从库集群模式。在这个模式下,如果从库发生故障了,客户端可以继续向主库或其他从库发送请求,进行相关的操作,但是如果主库发生故障了,那就直接会影响到从库的同步,因为从库没有相应的主库可以进行数据复制操作了。
而且,如果客户端发送的都是读操作请求,那还可以由从库继续提供服务,这在纯读的业务场景下还能被接受。但是,一旦有写操作请求了,按照主从库模式下的读写分离要求,需要由主库来完成写操作。此时,也没有实例可以来服务客户端的写操作请求了,如下图所示:
无论是写服务中断,还是从库无法进行数据同步,都是不能接受的。所以,如果主库挂了,我们就需要运行一个新主库,比如说把一个从库切换为主库,把它当成主库。这就涉及到三个问题:
主库真的挂了吗?
该选择哪个从库作为主库?
怎么把新主库的相关信息通知给从库和客户端呢?
这就要提到哨兵机制了。在 Redis 主从集群中,哨兵机制是实现主从库自动切换的关键机制,它有效地解决了主从复制模式下故障转移的这三个问题。
哨兵机制的基本流程
哨兵其实就是一个运行在特殊模式下的 Redis 进程,主从库实例运行的同时,它也在运行。哨兵主要负责的就是三个任务:监控、选主(选择主库)和通知。
我们先看监控。监控是指哨兵进程在运行时,周期性地给所有的主从库发送 PING 命令,检测它们是否仍然在线运行。如果从库没有在规定时间内响应哨兵的 PING 命令,哨兵就会把它标记为“下线状态”;同样,如果主库也没有在规定时间内响应哨兵的 PING 命令,哨兵就会判定主库下线,然后开始自动切换主库的流程。
这个流程首先是执行哨兵的第二个任务,选主。主库挂了以后,哨兵就需要从很多个从库里,按照一定的规则选择一个从库实例,把它作为新的主库。这一步完成后,现在的集群里就有了新主库。
然后,哨兵会执行最后一个任务:通知。在执行通知任务时,哨兵会把新主库的连接信息发给其他从库,让它们执行 replicaof 命令,和新主库建立连接,并进行数据复制。同时,哨兵会把新主库的连接信息通知给客户端,让它们把请求操作发到新主库上。
我画了一张图片,展示了这三个任务以及它们各自的目标。
在这三个任务中,通知任务相对来说比较简单,哨兵只需要把新主库信息发给从库和客户端,让它们和新主库建立连接就行,并不涉及决策的逻辑。但是,在监控和选主这两个任务中,哨兵需要做出两个决策:
在监控任务中,哨兵需要判断主库是否处于下线状态;
在选主任务中,哨兵也要决定选择哪个从库实例作为主库。
接下来,我们就先说说如何判断主库的下线状态。
你首先要知道的是,哨兵对主库的下线判断有“主观下线”和“客观下线”两种。那么,为什么会存在两种判断呢?它们的区别和联系是什么呢?
主观下线和客观下线
哨兵进程会使用 PING 命令检测它自己和主、从库的网络连接情况,用来判断实例的状态。如果哨兵发现主库或从库对 PING 命令的响应超时了,那么,哨兵就会先把它标记为“主观下线”。
如果检测的是从库,那么,哨兵简单地把它标记为“主观下线”就行了,因为从库的下线影响一般不太大,集群的对外服务不会间断。
但是,如果检测的是主库,那么,哨兵还不能简单地把它标记为“主观下线”,开启主从切换。因为很有可能存在这么一个情况:那就是哨兵误判了,其实主库并没有故障。可是,一旦启动了主从切换,后续的选主和通知操作都会带来额外的计算和通信开销。
为了避免这些不必要的开销,我们要特别注意误判的情况。
首先,我们要知道啥叫误判。很简单,就是主库实际并没有下线,但是哨兵误以为它下线了。误判一般会发生在集群网络压力较大、网络拥塞,或者是主库本身压力较大的情况下。
一旦哨兵判断主库下线了,就会开始选择新主库,并让从库和新主库进行数据同步,这个过程本身就会有开销,例如,哨兵要花时间选出新主库,从库也需要花时间和新主库同步。而在误判的情况下,主库本身根本就不需要进行切换的,所以这个过程的开销是没有价值的。正因为这样,我们需要判断是否有误判,以及减少误判。
那怎么减少误判呢?在日常生活中,当我们要对一些重要的事情做判断的时候,经常会和家人或朋友一起商量一下,然后再做决定。
哨兵机制也是类似的,它通常会采用多实例组成的集群模式进行部署,这也被称为哨兵集群。引入多个哨兵实例一起来判断,就可以避免单个哨兵因为自身网络状况不好,而误判主库下线的情况。同时,多个哨兵的网络同时不稳定的概率较小,由它们一起做决策,误判率也能降低。
如何选定新主库?
一般来说,我把哨兵选择新主库的过程称为“筛选 + 打分”。简单来说,我们在多个从库中,先按照一定的筛选条件,把不符合条件的从库去掉。然后,我们再按照一定的规则,给剩下的从库逐个打分,将得分最高的从库选为新主库,如下图所示:
第一轮:优先级最高的从库得分高。
用户可以通过 slave-priority 配置项,给不同的从库设置不同优先级。比如,你有两个从库,它们的内存大小不一样,你可以手动给内存大的实例设置一个高优先级。在选主时,哨兵会给优先级高的从库打高分,如果有一个从库优先级最高,那么它就是新主库了。如果从库的优先级都一样,那么哨兵开始第二轮打分。
第二轮:和旧主库同步程度最接近的从库得分高。
这个规则的依据是,如果选择和旧主库同步最接近的那个从库作为主库,那么,这个新主库上就有最新的数据。
第三轮:ID 号小的从库得分高。
每个实例都会有一个 ID,这个 ID 就类似于这里的从库的编号。目前,Redis 在选主库时,有一个默认的规定:在优先级和复制进度都相同的情况下,ID 号最小的从库得分最高,会被选为新主库。
总结
哨兵机制,它是实现 Redis 不间断服务的重要保证。具体来说,主从集群的数据同步,是数据可靠的基础保证;而在主库发生故障时,自动的主从切换是服务不间断的关键支撑。
Redis 的哨兵机制自动完成了以下三大功能,从而实现了主从库的自动切换,可以降低 Redis 集群的运维开销:
监控主库运行状态,并判断主库是否客观下线;
在主库客观下线后,选取新主库;
选出新主库后,通知从库和客户端。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
一文带你重温去年最难忘的10个数据泄露事件
大数据文摘出品 来源:gizmodo 编译:陈之炎 数据泄露犹如网络噩梦。 近几年来,数据泄露事件与日俱增,无论你将数据存储在何处,大部分均会被泄露。 然而,实际上, 2020年公开报告的数据漏洞要比过去几年少得多。这似乎听起来运气不错,因为在这一年里,几乎所有的事情似乎都出了问题。 尽管如此,实际发生的事件均比以往任何时候都要多得多,也就意味着公开记录的比例上升了。来盘点一下去年最令人难忘的数据泄露事件:有大,有小,所有这一切都是痛。 众名流推特被盗,黑客赚到比特币12.1万 去年,黑客的大规模入侵激怒了杰克·多尔西,黑客们闯入Twitter,通过劫持账户来窃取比特币。 当埃隆·马斯克开始喋喋不休地谈论“慷慨”时,用户首先注意到一些奇怪的事情正在发生——这是一个明确的警示。他的帐户叽叽喳喳地说道:“COVID-19使我觉得很慷慨。在接下来的一个小时里,我将把寄到我的BTC地址的任何BTC付款加倍。祝你好运!“ 巴拉克·奥巴马和乔·拜登、坎耶·韦斯特和金·卡戴珊、杰夫·贝佐斯等其他人的账户同样受损。据报道,涉嫌黑客在最终被逮捕之前赚到了12.1万比特币。 数十亿用户的面部照片被盗 人人...
- 下一篇
谈谈职场中的 target miss
首先定义一下这里所谓的 “target miss” 指的是啥: 没有明确目标的忙忙碌碌 没有找到 root cause 的想当然 把过程和手段当成目标而不是关注收益 目标没有对齐,或者走着走着越来越发散 我讲几个亲身经历的故事。 ## 仅凭 “猜想” 而定下目标换来的一定是无效的投入 小 A:目前咱们的直播延时比较高,想想有啥办法降低延时到 3s 内 ? 小 B:我猜应该是我们使用的 RTMP 协议底层是基于 TCP 的,所以延时比较大,我们启动一个新的项目,设计一套基于 UDP 的协议来替换 TCP 吧 小 C:确定要启动这个新项目麽?我们要不要先调研一下当前直播的延时具体主要来自哪里? 小 D:小 C 说得对,其实我前面有调研过的,目前咱们的延时主要来自播放器默认在开始播放前有 5s 的缓冲呢,底层的 TCP 协议并不是真正的瓶颈呢 ! 小 B:………… ## 什么是 “手段”,什么是 “目标”? 小 A:听说咱们自研的 video codec 不错,国际比赛都拿奖了,我本双月的目标就去完成它的对接和上线吧? 小 B:我们当前产品和用户体验的主要问题有哪些?这个自研的 codec ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7设置SWAP分区,小内存服务器的救世主
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS关闭SELinux安全模块
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题