目录

一、引言
承接上文内容,单纯的主从复制模式存在一个关键缺陷:当主节点发生宕机时,它无法自动将服务切换到从节点,让从节点接替主节点的工作。这意味着,仅依赖主从模式的系统潜藏着极高的“断服风险”——一旦主节点故障,整个系统将无法对外提供写操作。但又不可能让程序猿24小时不间断盯着这个系统,所以程序猿很难在故障发生瞬间立即手动介入处理。
因此,一套能在主节点宕机后,自动让从节点无缝接替主节点职责的机制,就成为了保障系统稳定性的核心需求。而哨兵模式的出现,恰好精准解决了这一痛点,为Redis主从架构的高可用性提供了关键支撑。
二、概念和作用
一个哨兵就是一个独立的进程。
哨兵的作用也可以用一句话来概括:监控所有主从节点,当发现主节点出现故障时,执行故障转移,让从节点接替主节点的工作,最后通知客户端新的主节点的地址。哨兵的作用具体分许如下:

1)监控
监控所有主从节点,每隔一定时间就给所有主从节点发送心跳检测(ping 命令),如果某一个节点的响应(pong)未能如约而至,那么该哨兵将单方面认为这个节点出现了故障。
2)故障转移
如果主节点被多数哨兵判定为出现故障,那么就可以认为主节点真的出了故障。此时,在所有哨兵节点中,推举出一个管事的,负责后续从所有从节点中选出一个来接替主节点的工作。
3)通知客户端
管事的哨兵节点告知客户端新的主节点地址。
三、细说核心工作原理
哨兵节点的核心工作就是:监控与故障判定和自动故障转移。
前面我们说过,每隔哨兵都会监控所有主从节点,而监控的手段就是定期的对所有的主从节点进行心跳检测。如果某个节点没有在规定时间内进行响应,那么对这个节点进行心跳检测的哨兵就会单方面的认为,该节点下线了。这个叫主观下线。
为什么会存在主观下线这个观念?其实也很简单,完全有可能是因为该哨兵和这个节点的网络出现的暂时性的抖动,导致哨兵没有接收到这个节点的响应,但是实际上该节点还是可以正常工作的。为了避免或者说尽可能的减少这种误判,又引入了另一个概念,叫做客观下线。
所谓的客观下线,就是当哨兵A单方面认为X节点下线了(主观下线),哨兵A会询问哨兵B、哨兵C……询问它们是否也认为X节点下线了。这个场景就可以想象成所有的哨兵开了一次常委会议,然后进行举手表决,表决内容为是否认为X节点已经下线(举手表示认为X节点已下线,反之,则认为X节点正常)。常委会统计投票结果,如果赞成票数达到某个预定值(可以设置),那么将宣布X节点已下线。这个就叫客观下线。
所以这里就顺便说明一下,哨兵节点的个数一般是奇数个,方便表决嘛。
假设X节点为主节点,也就意味着主节点被宣判下线了。这时候,就触发了故障转移。
故障转移的第一步就是要在所有哨兵节点中,选出一个领头哨兵。然后由这个领头哨兵负责后续选出一个从节点来接替原主节点的工作。
选举领头哨兵的规则是:先到先得,“先到”的哨兵向其他哨兵发送 “我要当领头” 的请求,若获得超过半数同意,该哨兵将成为领头;否则重新选举。
选出领头哨兵后,领头哨兵就开始物色所有从节点,然后根据一定的“用人”标准选举出新的主节点。
1)首先排除领头哨兵认为已经下线的从节点。
2)其次,优先选择优先级最高的从节点(值越小,优先级越高)。可以理解为优先提拔一把手钦定的人选。
3)如果所有从节点优先级都一样,选择复制偏移量(repl_offset)最大的节点,因为该从节点的数据最完整。
4)如果偏移量都相同,那么优先选择runid(节点唯一标识)最小的节点。
通过以上的层层选拔,就可以确定要将哪个从节点晋升为主节点。
假设从节点NB被选举为新晋主节点。
那么,领头哨兵就会发送slaveof no one命令给NB节点,NB节点一执行这个命令,它就成为新的主节点了。
然后,领头哨兵给剩下的所有从节点发送slaveof <NB节点IP><NB节点端口>,让这些从节点执行此命令,认NB节点为主节点。
最后,如果原主节点恢复了的话,领头哨兵也会向它发送slaveof <NB节点IP><NB节点端口>命令,让它认NB节点为主节点。
四、优缺点
1)优点
高可用:自动检测主节点故障并完成故障转移,无需人工干预,减少服务中断时间。
易用性:客户端只需连接哨兵集群,无需硬编码主节点地址,降低配置维护成本。
兼容性:完全基于 Redis 官方实现,与主从复制无缝集成,无需引入第三方组件。
可扩展性:支持增加从节点扩展读能力,支持增加哨兵节点提升故障检测的可靠性。
2)缺点
写操作单一节点:故障转移后仍只有一个主节点,无法分担写压力,不适用于写密集场景。
数据一致性风险:故障转移时,若主节点宕机前有部分数据未同步到从节点,会导致少量数据丢失。
复杂度提升:需维护哨兵集群和主从集群,增加了部署、监控和运维的复杂度。
故障转移有延迟:从主节点宕机到完成故障转移,通常需要几秒到几十秒,期间写服务不可用。
五、结语
如有错误,欢迎指出!
上一篇:主从模式
完~
594

被折叠的 条评论
为什么被折叠?



