字节面试题:说一下哨兵机制原理是什么?
今天我们聊聊 Redis 的哨兵机制。这个机制对 Redis 的高可用性来说简直就是救命稻草,尤其是在生产环境中,不可能总指望你每天盯着 Redis 的主节点啥时候挂掉吧?
有了哨兵机制,基本就告别了“凌晨三点被电话叫醒”的生活。那么,哨兵机制到底是怎么工作的呢?咱们来一探究竟。
哨兵机制的核心作用
简单说,哨兵的作用就是监控 Redis 的主从架构,发现主节点挂了,就自动选一个从节点当主节点,同时通知所有从节点和客户端去认这个新老大。哨兵在 Redis 集群中主要做三件事:监控、选主、通知。
1. 监控:哨兵会不断检查主从节点是否正常运行。
2. 选主:如果主节点挂了,哨兵会通过选举机制选出一个新的主节点。
3. 通知:通知其他从节点和客户端去切换到新的主节点。
这三件事听着简单,但背后的机制却有点复杂。下面我们就来深入解析一下。
哨兵如何监控主节点?
哨兵本质上是运行在特殊模式下的 Redis 实例,它会定期向主节点、从节点以及其他哨兵发送 PING 命令,来确认这些节点是否存活。
# 在哨兵配置文件中配置监控的主节点
sentinel monitor mymaster 127.0.0.1 6379 2
这行配置的意思是:
mymaster是主节点的名字,可以随便起。127.0.0.1和6379是主节点的 IP 和端口。2是哨兵认为主节点宕机所需的最小投票数。
哨兵通过心跳机制判断主节点是否正常。如果一段时间内没有收到主节点的回复,它会标记这个主节点为「主观下线」(Subjective Down,简称 SDOWN)。
哨兵如何选主?
当哨兵判断主节点宕机后,会发起投票,选举一个从节点为新的主节点。这个过程被称为「故障转移」(Failover)。
Redis 的选主逻辑主要依据以下几个标准:
复制偏移量:优先选择数据最完整的从节点(复制进度最靠近主节点)。 优先级:从节点可以通过 slave-priority配置优先级,优先级低的节点被排除。网络延迟:哨兵会选择与自己网络延迟最低的从节点。
一旦新主节点确定,哨兵会做两件事:
通知其他从节点去同步新主节点。 通知客户端更新主节点地址。
# 配置从节点优先级
redis-cli -h 127.0.0.1 -p 6380 CONFIG SET slave-priority 10
redis-cli -h 127.0.0.1 -p 6381 CONFIG SET slave-priority 50
在这个配置下,如果 6380 和 6381 都是从节点,哨兵会优先选择 6380 作为新的主节点,因为它的优先级更高。
哨兵如何通知客户端?
选出新主节点后,哨兵的任务还没完。它需要告诉所有从节点和客户端:主节点已经换人了。对于从节点,哨兵会自动修改它们的复制目标;对于客户端,哨兵会通过发布订阅通知它们新的主节点地址。
哨兵会通过 Redis 的发布订阅系统,把新主节点的信息推送给所有订阅的客户端。例如,使用 SENTINEL get-master-addr-by-name mymaster 命令可以获取新主节点的 IP 和端口。
redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
# 返回新主节点的 IP 和端口,比如 [ "127.0.0.1", "6380" ]
客户端只需要在程序中实现自动更新逻辑即可。
哨兵机制的高可用性保障
一个哨兵单点可能会挂掉,所以 Redis 支持多哨兵协同工作。这种模式下,哨兵之间也会相互通信,通过 Raft 类似的选举机制选出一个「领头哨兵」(Leader Sentinel),由它负责协调故障转移。
# 启动多个哨兵实例监控同一个主节点
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel monitor mymaster 127.0.0.1 6380 2
sentinel monitor mymaster 127.0.0.1 6381 2
每个哨兵实例都可以彼此通信,确保在任何一个哨兵挂掉的情况下,系统仍然能正常工作。
最后,我们来看几道相关面试题,面试官可能会问:
哨兵的作用是什么? 哨兵如何判断主节点挂了? 哨兵如何选主? 哨兵的高可用性如何实现?
回答
哨兵机制是 Redis 提供的高可用解决方案,主要功能包括监控主从节点状态、进行故障转移以及通知客户端更新主节点信息。
监控:哨兵通过 PING命令定期检测主从节点是否存活,基于响应时间判断节点状态。选主:哨兵根据复制偏移量、优先级和网络延迟等标准选举新的主节点,保证数据一致性和快速恢复。 高可用性:通过多个哨兵协同工作,避免单点故障。 通知:哨兵利用发布订阅机制通知客户端主节点变更,确保业务无缝切换。
这套机制自动化程度高,减少了人工干预,提高了系统的稳定性和可靠性。
-END-
以上,就是今天的分享了,看完文章记得右下角给何老师点赞,也欢迎在评论区写下你的留言。