上篇博文【死磕 Redis】--- 哨兵(一):部署哨兵架构 介绍了 Redis Sentinel 是一个能够自动完成故障发现和故障转移并通知应用方,从而实现真正的高可用的分布式架构 ,他具备 监控、通知、自动故障转移等功能,同时详细演示了哨兵的架构部署和自动故障转移,相信各位小伙伴对 Redis 哨兵机制有了一个简单的认识,这篇博文将详细介绍哨兵的基本原理,包括:
- 心跳机制
- 主观下线、客观下线
- Sentinel 选举
- 故障转移
心跳检查
Sentinel 通过三个定时任务来完成对各个节点的发现和监控,这是保证 Redis 高可用的重要机制。
- 1、每隔 10 秒,每个 Sentinel 节点会向已知的主从节点发送
info
命令获取最新的主从架构。下图是info
命令的响应。
Sentinel 节点通过解析响应信息,就可以知道当前 Redis 数据节点的最新拓扑结构。如果是新增的节点,Sentinel 就会与其建立连接。
- 2、每隔 2 秒,Sentinel 节点都会向主从节点的
_sentinel_:hello
频道发送自己的信息。目的有两个:- 发现新的 Sentinel 节点
- Sentinel 节点之间交换主节点的状态,作为后面客观下线以及领导者选择的依据。
发送的消息内容格式为:
<哨兵地址>,<哨兵端口>,<哨兵的运行ID>,<哨兵的配置版本>,
<主数据库的名称>,<主数据库的地址>,<主数据库的端口>,<主数据库的配置版本>
- 3、每隔一秒,哨兵会每个主从节点、Sentinel 节点发送 PING 命令。该定时任务是哨兵心跳机制中的核心,它涉及到 Redis 数据节点的运行状态监控,哨兵领导者的选举等细节操作。当哨兵节点发送 PING 命令后,若超过
down-after-milliseconds
后,当前哨兵节点会认为该节点主观下线。
主观下线、客观下线
主观下线
在第三个定时任务中,每个一秒 Sentinel 节点会向每个 Redis 数据节点发送 PING 命令,若超过 down-after-milliseconds
设定的时间没有收到响应,则会对该节点做失败判定,这种行为叫做 主观下线。因为该行为是当前节点的一家之言,所以会存在误判的可能。
客观下线
当 Sentinel 节点判定一个主节点为主观下线后,则会通过 sentinel is-master-down-by-addr
命令询问其他 Sentinel 节点对该主节点的状态,当有超过 <quorunm>
个 Sentinel 节点认为主节点存在问题,这时该 Sentinel节点会对主节点做客观下线的决定。
这里有一点需要注意的是,客观下线是针对主机节点,如果主观下线的是从节点或者其他 Sentinel 节点,则不会进行后面的客观下线和故障转移了。
Sentinel 选举
假如一个 Sentinel 节点完成了主节点的客观下线,那么是不是就可以立刻进行故障转移呢?显然不是,因为 Redis 的故障转移工作只需要一个 Sentinel 节点来完成,所以会有一个选举的过程,选举出来一个领导者来完成故障转移工作。Redis 节点采用 Raft 算法来完成领导者写选举,该算法不是本文的重点,所以不做过多介绍,下面主要介绍 Sentinel 选举的主要流程。
- 每一个做主观下线的 Sentinel 节点都有成为领导者的可能,他们会想其他 Sentinel 节点发送
sentinel is-master-down-by-addr
,要求将它设置为领导者。 - 收到命令的 Sentinel 节点如果没有同意其他 Sentinel 节点发送的命令,则会同意该请求,否则拒绝。
- 如果该 Sentinel 节点发现自己得到的票数已经超过半数且超过
<quorum>
,那么他将成为领导者。 - 如果该过程有多个 Sentinel 成为领导者,那么将等待一段时间重新进行选择,直到有且只有一个 Sentinel 节点成为领导者为止。
加入有 A、B、C、D 四个节点构成 Sentinel 集群。加入 A 率先完成客观下线,则 A 会向 B、C、D 发出成为领导者的申请,由于 B、C、D 没有同意过其他 Sentinel 节点,所以会将投票给 A,A 得到三票。B 则向 A、C、D 发起申请,由于 C、D 已经同意了 A,所以会拒绝,但是他会得到 A 的同意,所以 B 得到一票,同理 C、D 得到零票,如下图:
节点 | 得到的票数 |
---|---|
A | B 、C、D |
B | A |
C | |
D |
所以 A 会成为领导者,进行故障转移工作。一般来说,哨兵选择的过程很快,谁先完成客观下线,一般就能成为领导者。
故障转移
当某个 Sentinel 节点通过选举成为了领导者,则他就要承担起故障转移的工作,其具体步骤如下:
- 1、从从节点列表中选择一个节点作为新的主节点,选择的策略如下:
- 过滤掉不健康的节点(主观下线、断线),5 秒内没有回复过 Sentinel 节点 ping 响应、与主节点失联超过
down-after-milliseconds * 10
秒 - 选择优先级最高级别的节点,如果不存在则继续
- 选择复制偏移量最大的节点(数据最完整),存在则返回,不存在则继续
- 选择 runid 最小的节点
- 过滤掉不健康的节点(主观下线、断线),5 秒内没有回复过 Sentinel 节点 ping 响应、与主节点失联超过
- 2、在新的主节点上执行
slaveof no one
,让其变成主节点 - 3、向剩余的从节点发送命令,让它们成为新主节点的从节点
命令详解
参考资料
- 《Redis 的开发与运维》
- https://www.cnblogs.com/kismetv/p/9609938.html#t4
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。