# Redis实战:Redis哨兵机制

请添加图片描述

# Redis哨兵

简单来说,Redis 哨兵(Sentinel)机制就是 Redis 的“自动维稳团队”

在普通的主从复制(Master-Slave)架构中,如果主节点(Master)挂了,系统是不会自动恢复的,需要运维人员半夜爬起来手动把一个从节点(Slave)切换为主节点。而哨兵机制,就是把这个“手动切换”的过程完全自动化

# 哨兵的核心职责

监控: 哨兵会不断地给主节点和从节点发送 PING 命令,看看它们是不是还活着。

通知: 如果发现某个节点出问题了,哨兵可以通过 API 通知管理员或者其他应用程序。

自动故障转移: (最核心的功能) 当主节点真的挂了,哨兵们会开会投票,从未节点里选出一个优秀的“提拔”为新主节点。

配置提供者: 客户端(你的业务代码)不再直接连接固定的 Redis 主节点 IP,而是先连接哨兵。哨兵会告诉客户端:“当前谁是主节点,你们往哪读写。”

# 故障转移是怎么发生的?

这个过程非常严谨,为了防止“误判”(比如某个哨兵自己网络卡了一下,误以为主节点挂了),哨兵采用了“民主投票制”,主要分为三个步骤:

# 第一步:主观下线 vs 客观下线

主观下线: 单个哨兵发现主节点 PING 不通了,它自己认为主节点挂了。

客观下线: 发现主节点挂了的哨兵会去询问其他哨兵。如果有足够数量(这个数量叫 Quorum,通常配置为哨兵总数的一半以上)的哨兵都认为主节点挂了,这时候主节点才被判定为“客观下线”。

# 第二步:选出“班长”(Leader 选举)

主节点确定挂了后,哨兵们要开始干活了。但不能大家都去指挥,容易乱套。所以它们会通过 Raft 协议 类似的机制,在内部选出一个“领头哨兵”(Leader)来具体执行换主节点的任务

# 第三步:挑选新主节点(Failover)

当选择主节点的时候,并不是随便选择一个从节点让其变成主节点,而是通过一定的策略筛选出来的,筛选策略主要分为2个阶段

淘汰阶段:去掉网络状况不好的从节点,例如断开连接,上一次正常回复ping距当前时间超过5s等

筛选阶段:剩下的节点中选优先级高的(slave-priority 数值越小,优先级越高),优先级相同选复制偏移量大的,复制偏移量相同,选runId小的(每个redis实例启动都会分配一个全局唯一的runId)

具体筛选淘汰策略参见sentinel.c/sentinelSelectSlave

选出新主节点后,哨兵会向它发送 SLAVEOF NO ONE 让其自立门户,并通知其他从节点向新主节点“拜码头”同步数据

# 流程演示

在这里插入图片描述