Redis深入学习 —— 哨兵模式实现原理
1. 哨兵模式为什么能高可用
“高可用性”(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。这是百度对高可用性的解释。减少或者消除服务的停工时间,redis的主从架构下,缓存的停工时间是主节点发生故障到人工切换主节点并通知客户端应用重启重新连接。
这一个过程就没达到高可用性要求了。
不满足高可用的几点:
- 主从模式下,主节点切换对调用方客户端是不透明的,客户端能感知到!
- 在从节点升级为主节点期间,缓存服务是不可用的,而且因为是人工恢复故障的时间是很长的。
但是在sentinel模式下,从节点升级成为主节点的过程对访问调用方是透明的,而且客户端是维护一个redis连接池的,sentinel监控集群将从节点升级为主节点后,会通知客户端连接池,连接池连接自动切换成新的节点,然后一切就正常了。
整个过程对调用方是透明的!
2. 哨兵架构有哪些部分组成
哨兵模式有哪些功能?
- 主节点下线判断
- 故障发现
- sentinel集群领导者节点选举
- 从节点选举
- 故障恢复
- 通知客户端
sentinel的这些功能的作用结果就是:故障恢复对调用方透明且无时间感知!
sentinel架构下的定时任务机制
- 每秒都触发的心跳检测定时任务
- 隔2s,每个sentinel节点通过redis订阅方式交流主节点信息以及sentinel集群信息
- 隔10s,每个sentine节点从主节点和从节点获取redis拓扑图
定时任务与功能关系:
- 某个sentinel节点宕机以及redis从节点宕机,其他还在工作的sentinel节点经过一段时间后更新主从拓扑信息以及sentinel集群信息。
- 主节点宕机,sentinel集群中的某个sentinel节点通过心跳检测优先感知到,就会发送信息给sentinel集群,超过某个数量的sentinel确认主节点下线后,最先发现主节点下线的sentinel节点被选出领导者节点,主持后续的故障恢复工作。
- 选出主节点后,sentinel集群通知客户端,连接池自动切换redis连接,调用缓存服务,sentinel集群更新redis拓扑结构信息,更新主节点信息。
3. 心跳检测定时任务
- 主观下线:sentinel集群每个节点会对所有redis节点和sentinel节点进行心跳检测,如果主节点下线了,就会立马被其中一个sentinel节点感知到。
- 客观下线:当sentinel节点主观下线主节点后,会通知所有集群中sentinel节点,sentinel所有节点对主节点进行判断,如果超过半数的sentinel节点主节点主观下线,则认定redis主节点客观下线。
- 其他节点下线,就自然而然更新节点信息就可,不用做其他工作。
4. 主节点判断及sentinel节点判断定时任务
隔一段时间通过redis的发布订阅方式,交换主节点信息
同样的sentinel节点交换sentinel集群信息(所有的sentinel节点)
5. 获取主从最新拓扑信息定时任务
每10秒每个sentinel对master和slave执行info
- 发现slave节点:当有新的redis节点接入集群时候,最先发现的应该是主节点,sentinel集群从主节点获取新的slave信息
- 确认主从关系:发送info命令,redis节点返回这个主从集群的主从关系拓扑结构信息。
请关注公众号“前沿科技bot“ , 关注Java架构师方案宝典系列。
正文到此结束