Redis-04-哨兵架构

139 阅读6分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 7 天,点击查看活动详情

哨兵架构

上一节介绍了Redis的主从架构,可以将主节点数据自动同步到从节点中,但是其缺点则是如果主节点发生故障需要故障转移,那么就需要手动地将从节点变成主节点。那么哨兵架构就是用来解决这个问题,哨兵架构并不是一个全新的架构,而是在主从的基础上加入哨兵节点完成自动故障转移。

哨兵是什么

哨兵和主从节点一样也是一个节点,但是是运行在特殊模式下的Redis进程。它并不提供读写服务,而是用来监控Redis节点。

哨兵会每十秒向主服务器发送INFO消息,获取主服务器id和角色,以及其属下所有的从服务器信息,包括ip和端口号。也会每十秒向从服务器发送INFO消息,获取其id和角色,以及它的主服务器信息和连接状态,还会获取它的优先级和复制偏移量。并且哨兵之间还会通过sentinel:hello频道互相获取彼此的信息。

截屏2023-01-18 23.00.19.png

哨兵架构下,client第一次通过哨兵集群获得主节点信息,后续则直接和主节点进行通信,不会每一次都经过sentinel代理,但当sentinel感知到主节点发生变化的话,也会第一时间将新的主节点通知给连接的client端。

刚刚提到,哨兵并不会单独地布置一个节点,而是由最少三个节点组成哨兵集群,因为哨兵集群负责监控主从节点,这样就可以避免因为某个哨兵节点由于网络不佳,误判主节点下线。同时哨兵节点的个数最好是奇数,可以尽量避免票数相同导致选举失败。

整个哨兵要完成自动故障转移,需要经历几个阶段,分别是判断主客观下线,选举领头哨兵以及故障转移。

判断主客观下线

哨兵会每隔一秒向所有的主从节点发送ping消息,如果该节点没有在规定时间内回复哨兵的消息,那么就该哨兵就会将该节点标记为主观下线状态。规定时间配置项为down-after-milliseconds

但是主观下线并不代表着该节点一定就下线了,有可能是由于节点压力较大或者网络比较拥堵导致无法及时回复消息,那么就需要向集群内其他哨兵确认是否客观下线。

当一个哨兵判断某个节点主管下线,那么就会向其他哨兵发送命令,其他哨兵在收到该命令后会回复是否赞成客观下线。如果赞成票到达设定的quorum值,那么就会标记该节点客观下线,该值一般为总哨兵数的一半再加一,也就是说四台和五台哨兵节点那么quorum值都为3。那么这个时候就需要选举出领头节点进行故障转移。

选举领头哨兵

当一个哨兵将主节点标记为客观下线后,它就成为了一个Leader候选者,它会向其他哨兵发送命令,让其他哨兵对他进行投票。也就是说每一个在线的哨兵都有机会成为Leader,并且每一个哨兵都只有一票,先到先得。

当这个哨兵获得半数的选票并且大于quorum值,那么这个哨兵就会被选举为领头哨兵,由它负责对客观下线的主节点进行故障转移。

故障转移

当一个哨兵被选举成为领头哨兵后,它就需要去找到原来故障的主节点下哪一个从节点更适合作为主节点。首先需要排除掉下线的从节点和根据down-after-milliseconds判断网络状况不太好的从节点,其次会根据优先级去进行选择,如果优先级一致,就根据持久化篇中提到的复制偏移量进行选择,复制偏移量越大,说明与主节点同步的越多,最后会根据id去进行选择。

选择到合适的从节点后,会向节点发送slave no one指令,将其变为主节点。其他的节点则需要执行sloaveof命令,将选定的节点作为主节点,具体同步方式可以参考上一节的文章。

接下来需要通知客户端主节点发生改变,客户端和Redis之间有不同的订阅频道,主从完成同步后,Redis会在+switch-master频道发送重新设定的主节点的ip地址和端口,那么接下来客户端就会和该主节点进行通信。

最后会继续监视发生故障的主节点,当旧的主节点重新上线后,通过slaveof指令,将其设定为新主节点的从节点。至此故障转移结束。

脑裂问题

哨兵架构并不是完美的,它还会产生脑裂问题。何为脑裂问题?就是一个主从架构中有两个大脑。

客户端与主节点正常进行通信不受影响,但是因为某些原因导致主节点和所有从节点和哨兵都失联了,那么在超过设定时间后哨兵会将该节点标记为客观下线,并进行故障转移。故障转移完毕后原来的主节点会变成新主节点的从节点,那么原有的数据会被重新同步。那么这期间客户端和主节点之间的数据都会丢失。

要避免这个问题,最重要的是在主节点和其他节点失联后,要及时切断和客户端的联系,可以通过指令min-slaves-to-write 1去避免,当自己的从节点小于1时就禁止写数据。但是如果说这个主节点正常工作,但是就是没有从节点的话也无法正常运行,这就需要根据场景进行权衡。

总结

本节分析了Redis的哨兵架构,并且详细分析了哨兵架构是如何进行自动故障转移的,中间需要经历什么步骤,同时还分析了哨兵架构带来的脑裂问题和其解决方法,希望你有所收获。

感谢观看!