09.哨兵机制-Sentinel
约 994 字大约 3 分钟...
哨兵(观察者)
哨兵特征:
- 哨兵是一个运行在特殊模式下的 Redis 进程
- 每个哨兵都需要和所有的主、从库建立连接
- 哨兵相当于"观察者节点",观察的对象是主、从节点
- 哨兵之间互相发现:
主库的发布/订阅 机制
:通过主库的__sentinel__:hello
- 哨兵在主库发布自己的信息、订阅其他哨兵信息
- 哨兵如何发现从库:
- 哨兵会每
10秒一次的频率
向主库发送INFO
命令,获取从库列表
- 哨兵会每
- 哨兵如何通知客户端:
- 每个哨兵对外提供
发布/订阅机制
- 客户端从哨兵订阅消息,关注主、从故障转移中的关键事件
- 每个哨兵对外提供
哨兵机制作用:
- 主库挂了之后,实现主从库
自动切换
(故障转移
) - 主从模式是读写分离的,主节点挂了,没有主节点来服务客户端的写操作请求
哨兵如何工作:
哨兵的主要职责:
- 监控
- 选主
- 通知
监控:
- 通信机制:
- 通过发送PING命令给主、从节点,进行心跳检测
故障判断
:主观下线
:主节点或者从节点
没有在规定的时间内响应哨兵的PING命令
客观下线
:(投票、可信网络)- 发起者:
- 当一个哨兵判断主节点为
主观下线
后,向其他哨兵发起投票
- 当一个哨兵判断主节点为
- 参与者:
- 其他哨兵根据自己和主节点的网络状况,做出【赞成/拒绝】投票
客观下线条件
:- 发起者获得的赞同票数 >=
quorum
值,主节点会被该哨兵标记为客观下线
- 发起者获得的赞同票数 >=
- 发起者:
选取哨兵leader:
- 目的:选择哨兵集群中的节点进行
主从故障转移
(主、从切换指挥) - 候选者:
- 判断主节点
客观下线
的那个哨兵节点(候选者就是想当Leader的哨兵)
- 判断主节点
- 发起投票:
候选者
向其他哨兵发起投票,表明自己希望成为Leader来执行主从切换
竞选成功条件
:- 获得 1/2以上的赞成票
- 获得的票数 > quorum值
quorum 建议:
- quorum 的值建议设置: (哨兵个数/2) + 1
故障转移
全过程:
- 故障转移过程由
哨兵leader
负责,主要工作:- 通过规则选出主库
- 通知从库的主库变更
- 通知客户端主库变更
- 修改重新上线的旧主库为从库
1. 选主:
- 选主规则:
过滤+打分
过滤
:- 过滤已下线的主库、网络差的从库
打分
优先级:- 从库的优先级,越小越靠前(
slave-priority配置项
) - 从库复制进度,越小越靠前(
slave_repl_offset
和master_repl_offset
的差值) - 从库ID号,越小越靠前(
runID
)
- 从库的优先级,越小越靠前(
2. 修改从库的主库IP信息:
哨兵leader
通过向所有从库
发送SLAVEOF
命令实现从库更换主库IP- 获取集群内所有从库信息(IP):
- 哨兵向主库发送
INFO
命令(主库未故障前获取) - 主库返回
从库列表
- 哨兵向主库发送
3. 通知客户端主库变更:
哨兵集群
将新主库的信息(IP等)通知给客户端- 哨兵和客户端通信:
发布/订阅机制
:- 每个
哨兵节点
提供发布者/订阅者机制
,客户端可以从哨兵订阅消息,关注主、从故障转移中的关键事件
- 每个
4. 修改重新上线的旧主库为从库
- 故障转移操作最后要做的是,继续监视旧主节点
- 当旧主节点重新上线时,哨兵集群就会向它发送
SLAVEOF
命令,让它成为新主库的从库