Redis进阶 - 哨兵模式
简介
在主从复制下,redis服务器存在一个master和多个slave同时在工作。如果这时候,主机宕机,会发生什么情况,即数据写服务没人复制,且从机的数据也无法实现同步。
针对上述场景,引入了哨兵模式的概念,哨兵(sentinel) 是一个分布式系统
,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的master并将所有slave连接到新的master。
哨兵的作用:
- 监控
- 不断的检查master和slave是否正常运行。
- master存活检测、 master与slave运行情况检测
- 通知(提醒)
- 当被监控的服务器出现问题时,向其他(哨兵间,客户端) 发送通知。
- 自动故障转移
- 断开master与slave连接,选取一个slave作为master,将其他slave连接到新的master,并告知客户端新的服务器地址
Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令:
主观下线:如果某sentinel节点发现某实例未在规定时间响应,则认为该实例主观下线。
客观下线:若超过指定数量(quorum)的sentinel都认为该实例主观下线,则该实例客观下线。quorum值最好超过Sentinel实例数量的一半。
启动哨兵模式
配置哨兵:
- 配置一拖二的主从结构
- 配置三个哨兵
- 启动哨兵
启动顺序,先主机,后从机,最后哨兵
cd /home/believe123/myproject/redis/sentinel/
分别开三个窗口,启动主从机
redis-server ./redis-6379.conf
redis-server ./redis-6380.conf
redis-server ./redis-6381.conf
分别开三个窗口,启动三个哨兵
redis-sentinel ./sentinel-26379.conf
redis-sentinel ./sentinel-26380.conf
redis-sentinel ./sentinel-26381.conf
当主机宕机时,例如6379下线,6381被投票选举为主机,等待6379上线的时,它就变成了6381的从机。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
手动杀死master服务器,6381变为master:
重新连接6379,6379就作为6381的从机进行数据同步:
配置文件内容如下:
且运行过程中sentinel*.conf文件会被重写:
哨兵工作原理
哨兵在进行主从切换过程中经历三个阶段:
- 监控阶段
- 通知阶段
- 故障转移阶段
监控阶段
sentinel与master之间维持着cmd连接,来通过info获取其状态信息,通过定时ping操作维护各个 sentinel的通信。
通知阶段
每个时段,挑选出一个 sentinel 来获取master和slave的info,并通过sentinel之间的pulish和subcribe操作,将信息广播给其他sentinel。
故障转移阶段
当其中一个哨兵sentinel1发现master下线时,通知其他哨兵(sentinel2、sentinel3),然后其他哨兵尝试给master发送消息,如果发现master真的下线,则将flags:SRI_S_DOWN转换为flags:SRI_O_DOWN。
该策略实现是配置:
sentinel monitor mymaster 127.0.0.1 6379 2
说明:设置哨兵监听的主服务器信息,最后的参数决定了最终参与选举的服务器数量
2
3
4
通过投票先选举出哪个ID的sentinel去选举master:
选举新的master,选举规则:
服务器列表中挑选备选master:
- 在线的
- 响应快的
- 与原master断开时间短的
- 优先原则
- 优先级
- offset
- runid
发送指令( sentinel )
- 向新的master发送slaveof no one
- 向其他slave发送slaveof 新masterIP端口
三个阶段总结
监控阶段
- 同步信息
通知阶段
- 保持联通
故障转移阶段
- 发现问题
- 竞选负责人
- 优选新master
- 新master上任,其他slave切换master,原master作为slave故障回复后连接