2.哨兵模式
2.1 哨兵简介
| 哨兵(sentinel) 是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 |
| master,并将所有slave连接到新的master。 |

哨兵的作用
| 监控 |
| 不断的检查master和slave是否正常运行。 |
| master存活检测、master与slave运行情况检测 |
| |
| 通知(提醒) |
| 当被监控的服务器出现问题时,向其他(哨兵间,客户端)发送通知。 |
| |
| 自动故障转移 |
| 断开master与slave连接,选取一个slave作为master,将其他slave连接到新的master,并告知客户端新的服务器地址 |
| |
| 注意: |
| 哨兵也是一台redis服务器,只是不提供数据服务 |
| 通常哨兵配置数量为单数 3 5 7 9 最少3 |
| |
2.2 启用哨兵模式
配置哨兵
| 配置一拖二的主从结构 |
| 配置三个哨兵(配置相同,端口不同) |
| (先启主机,再启从机,最后启动哨兵) |
参看sentinel.conf

启动哨兵
| redis-sentinel sentinel-端口号.conf |

2.3 哨兵工作原理
主从切换
| 哨兵在进行主从切换过程中经历三个阶段 |
| 监控 |
| 通知 |
| 故障转移 |
| |
阶段一:监控阶段
| 用于同步各个节点的状态信息 |
| 1.获取各个sentinel的状态(是否在线) |
| |
| 2.获取master的状态 |
| master属性 |
| runid |
| role:master |
| 各个slave的详细信息 |
| |
| 3.获取所有slave的状态(根据master中的slave信息) |
| slave属性 |
| runid |
| role:slave |
| master_host、master_port |
| offset |
| …… |
| |

工作顺序(重点)

| ① sentinel先连接master获取信息,发一个info指令,拿到信息,知道master和slave的状况。 /ˈsentɪnl/ |
| ② sentinel与master建立cmd连接用于命令交换。sentinel保存所有哨兵信息记录,master记录redis实例对应的的信息 |
| ③ sentinel根据从master获取的slaves的信息接着去连每一个slave,发送info指令又把信息拿到了 |
| |
| 下一个sentinel进来了,也会发送info给master获取信息建立cmd连接,并根据master发现已经有sentinel连过,sentinel也保存信息,并且保存的sentinels是两个sentinel信息,为了保证与前一个sentinel保存的信息同步,两个sentinel之间建立沟通桥梁->发布、订阅。为了保证两个sentinel信息能够长期对称,它们两个会互发ping命令查看对方是否存在。 |
| |
| 当第三个sentinel进来再连接master等操作,除此之外三个sentinel之间互连,三者之间形成一个内部网络,谁拿到信息快速扩散给其他sentinel,它们之间是信任的,发现新的信息与自己的不一样就会把自身的信息更新掉,这样信息同步速度非常快。 |
| |
| 简单来说,sentinel会向master、slave、其他sentinel要状态,sentinel之间会组建一个对应的频道,大家在里面发布信息,订阅信息,收信息,同步信息。 |
阶段二:通知阶段

| sentinel通过与master建立的命令连接获取master与slave的工作状态,无论哪个sentinel获取到,都会把信息回传,各个sentinel进行信息同步 |
阶段三:故障转移阶段

| sentinel1给master发送命令,master没回应,sentinel1不停的给master发送命令,达到一定阶段(默认30s)未回应就给master标记一个SDOWN状态,把master状态信息传播到sentinel之间的内网中,说master宕机了。(如果是sentinel自己断了,也会标记SDOWN状态,但是这个指令不能发布到内网中),当内网中其他的sentinel接收到指令,都会去给master发送命令,master都未回应,也把它们接收到的结果信息发布到内网里确认sentinel1说的对,master真宕机了。当sentinel数量一半加一的sentinel说master宕机了,说明master真宕机了标记为ODOWN。 |
| 一台sentinel认为master挂了标记SDOWN叫主观下线 |
| 半数以上的sentinel认为master挂了标记ODOWN叫客观下线 |

| 所有sentinel同时向它们的频道发一个指令:内容是宕机的ip、端口、竞选次数、自己的run id。 |
| 内部有投票机制,各个sentinel既是参选者也是投票者,例如有5个sentinel,sentinel1和sentinel4同时给sentinel2发送消息,sentinel2先收到谁的消息就把票投给谁。若没有选出,就再重新投票一次,每增加一次,竞选次数增加1,投票完毕会推选出一个sentinel进行处置工作。 |

| 推选出的sentinel在服务器列表中挑选备选master |
| 筛选条件: |
| 1.不在线的 |
| 2.响应慢的 |
| 3.与原master断开时间久的 |
| 4.优先原则 |
| 优先级 |
| offset |
| runid小 |
| |
| 发送指令( sentinel ) |
| 向新的master发送slaveof no one 让它与之前的master断开连接 |
| 向其他slave发送slaveof 新master IP 端口 |
| 监控 |
| 同步信息 |
| 通知 |
| 保持联通 |
| 故障转移 |
| 发现问题 |
| 竞选负责人 |
| 优选新master |
| 新master上任,其他slave切换新master,原master故障恢复后作为slave连接 |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步