ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Redis哨兵模式原理剖析,监控、选主,java工程师面试

2021-12-12 12:34:28  阅读:166  来源: 互联网

标签:选主 java Redis 哨兵 实例 Sentinel slave 下线 节点


Redis哨兵模式原理剖析,监控、选主、通知客户端你真的懂了吗?

1.状态感知

======

哨兵启动后只指定了master的地址,要想知道整个集群中完整的拓扑关系怎么做呢?

哨兵每隔10秒会向每个master节点发送 info 命令, info 命令返回的信息中,包含了主从拓扑关系,其中包括每个slave的地址和端口号。有了这些信息后,哨兵就会记住这些节点的拓扑信息,在后续发生故障时,选择合适的slave节点进行故障恢复。

那么有小伙伴会问,哨兵之间是如何通信的呢?

基于Redis提供的发布(pub)/订阅(sub)机制完成的。哨兵节点不会直接与其他哨兵节点建立连接, 而是首先会和主库建立起连接 ,然后向一个名为" sentinel :hello"频道发送自己的信息(IP 和端口),其他订阅了该频道的哨兵节点就会获取到该哨兵节点信息,从而哨兵节点之间互知。

2.心跳检测

======

每一秒,每个 Sentinel 对 Master、Slave、其他哨兵节点执行PING命令,检测它们是否仍然在线运行,如果有节点在规定

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

时间内没有响应PING命令,那么该哨兵节点认为此节点"主观下线"。

3.主观下线和客观下线

===========

为什么需要客观下线机制?

因为当前哨兵节点探测对方没有得到响应,很有可能这两个机器之间的网络发生了故障,而 Master 节点本身没有任何问题,此时就认为 Master 故障是不正确的。

为了解决上述问题,客观下线应运而生,Sentinel一般会集群部署,引入多个哨兵实例一起来判断,就可以避免单个哨兵因为自身网络状况不好,而误判主库下线的情况。

假设我们有N个哨兵实例,如果有N/2+1个实例判断主库“主观下线”,此时把节点标记为“客观下线”,此时就可以做主从切换了。

4.选举哨兵领导者?

==========

假设Sentinel 判断主库“主观下线”后,就会给其他 Sentinel 实例发送 is-master-down-by-addr 命令,接着,其他 Sentinel 实例会根据自己和主库的连接情况,做出赞成和反对决定。

假设我们有N个哨兵实例,如果有#{quorum}个实例赞成,此时这个 Sentinel 就会给其他 Sentinel 发送主从切换请求,其他 Sentinel 会进行投票,如果投票通过,这个 Sentinel 就可以进行主从切换了, 这个投票过程被称为Leader 选举 。其实整体思想和Zookeeper一样的。

在投票过程中,任何一个想成为 Leader 的哨兵,要满足两个条件:第一,拿到半数以上的赞成票;第二,拿到的票数同时还需要大于等于哨兵配置文件中的 quorum 值。

quorum一般我们都会配置成 实例数量/2+1

此时会有小伙伴问,如果所有Sentinel都想成为Leader执行主从切换怎么办?

哨兵选举领导者的过程类似于Raft算法,每个哨兵都设置一个 随机超时时间 ,超时后向其他哨兵发送申请成为领导者的请求,把超时时间都分散开来, 在大多数情况下只有一个服务器节点先发起选举,而不是同时发起选举,这样就能减少因选票瓜分导致选举失败的情况 。

后期我会专门写一个专栏为大家介绍所有一致性算法,例如:Paxos、Raft、Gossip、ZAB等,到时候具体给大家讲解Sentinel是如何解决上述问题的。

5.谁来做新的Master?

==============

选择新master过程也是有优先级的,在多个slave的场景下,优先级按照:slave-priority配置 > 数据完整性 > runid较小者进行选择。

用户可以通过 slave-priority 配置项,给不同的从库设置不同优先级。如果所有从节点的 slave-priority 值一致,那就看谁的数据更完整。

如何判断谁的数据更完整呢?

标签:选主,java,Redis,哨兵,实例,Sentinel,slave,下线,节点
来源: https://blog.csdn.net/m0_64867152/article/details/121885416

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有