redis之Sentinel的实现原理:三个定时监控任务、主观下线和客观下线、领导者节点选举、故障转移
1、三个定时监控任务
每隔10s
sentinel每隔10s向所有主从节点发送info命令
作用
1、发现最新加入的slave节点,并且确认主从关系
2、还可以通过info命令来获取该节点的最新信息。
每隔2s
master节点上有一个发布订阅的频道(sentinel:hello),Sentinel节点每隔2s发送该Sentinel节点对于主节点的判断以及当前Sentinel节点的信息 ,同时每个Sentinel节点也会订阅该频道
作用
1、因为Sentinel他到__sentinel__:hello上会保存自己Sentinel节点信息所以可以发现新的sentinel节点,并和新的Sentinel简历连接
2、会交换对主节点的状态,为以后的客观下线和领导者选举做准备
每隔1s
每隔1s,每个Sentinel向master节点、所有的slave节点和其余的Sentinel节点发送一条ping命令来做心跳检测,确认这些节点是否可达(相互监控)
作用
1、实现了对每个节点的监控,这个定时任务是sentinel对节点判断是否下线的依据
主观下线和客观下线
主观下线:
上面介绍的第三个定时任务(每隔一秒),当这些节点超过down-after-milliseconds(设置的有效回复时间)没有进行有效的回复,Sentinel节点就会对该节点做失败判定,这个行为叫做主观下线
客观下线:
当Sentinel主观下线的节点是主节点时,该Sentinel节点会通过sentinel ismaster-down-by-addr命令向其他Sentinel节点询问对主节点的判断,当超过个数,Sentinel节点认为主节点确实有问题,这时该Sentinel节点会 做出客观下线的决定
这样客观下线的含义是比较明显了,也就是大部分Sentinel节点都对主节点的下线做了同意的判定,那么这个判定就是客观的
当判定完客观下线后是不是就可以进行故障转移了?当然不是,实际上至于要一个sentinel节点来执行,所以要先进行领导者的选择,由这个领导者来进行。
领导者节点的选举
Redis使用了Raft算法实 现领导者选举,因为Raft算法相对比较抽象和复杂,以及篇幅所限,所以这里给出一个Redis Sentinel进行领导者选举的大致思路:
1)每个在线的Sentinel节点都有资格成为领导者,当它确认主节点主观下线时候,会向其他Sentinel节点发送sentinel is-master-down-by-addr命令, 要求将自己设置为领导者
2)收到命令的Sentinel节点,如果没有同意过其他Sentinel节点的sentinel is-master-down-by-addr命令,将同意该请求,否则拒绝
3)如果该Sentinel节点发现自己的票数已经大于等于max(quorum, num(sentinels)/2+1),那么它将成为领导者
4)如果此过程没有选举出领导者,将进入下一次选举
选举的过程非常快,基本上谁先完成客观下线,谁就是领导者
其实这个过程就是一个投票的过程,sentinel中先完成客观下线的就向其他sentinel节点询问是否同意自己当领导,假如票数大于一半,自己将成为领导者,如果没有足够的票数,就重新进行选举
故障转移
故障转移就是当master宕机,选择一个合适的slave节点来升级为master节点的操作,sentinel会自动完成这个,不需要手动实现
具体步骤:
1)在从节点列表中选出一个节点作为新的主节点,选择方法如下:
- a)过滤:“不健康”(主观下线、断线)、5秒内没有回复过Sentinel节 点ping响应、与主节点失联超过down-after-milliseconds*10秒
- b)选择slave-priority(从节点优先级)最高的从节点列表,如果存在则 返回,不存在则继续
- c)选择复制偏移量最大的从节点(复制的最完整),如果存在则返回,不存在则继续
- d)选择runid最小的从节点
2)Sentinel领导者节点会对第一步选出来的从节点执行slaveof no one命令让其成为主节点
3)Sentinel领导者节点会向剩余的从节点发送命令,让它们成为新主节点的从节点,复制规则和parallel-syncs参数有关
4)Sentinel节点集合会将原来的主节点更新为从节点,并保持着对其关注,当其恢复后命令它去复制新的主节点
参考链接:
https://blog.csdn.net/qq_41453285/article/details/106383157
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
