《Redis设计与实现》学习笔记(十二) 第十六章 SENTINEL
文章目录
一. 启动并初始化Sentinel
1. 初始化服务器
- Sentinel本质上只是特殊模式下的
Redis服务器
- Sentinel不使用RDB或AOF初始化
2. 使用Sentinel专用代码
3. 初始化Sentinel状态
- 服务器初始化
sentinelState
结构
4. 初始化Sentinel状态的master属性
- Master字典记录了所有监视的主服务器信息
- 字典的键是主服务器的名字,值为sentinelRedisInstance实例结构
5. 创建连向主服务器的网络连接
- Sentinel将成为主服务器的客户端,可以发送命令,接收回复
- 会创建两个网络连接:一个
命令连接
,一个订阅连接
二. 获取主服务器信息
Sentinel会以10s一次向主服务器发送
INFO
命令
三. 获取从服务器信息
- 创建实例结构,
创建命令
和订阅连接
- 同样每十秒发送一次INFO,分析回复
四. 向主服务器和从服务器发送信息
在sentinel:hello频道publish信息
五. 接收来自主服务器和从服务器的频道信息
- 其他sentinel可以从hello频道获取发布sentinel的信息
- 更新
sentinel字典
,得到其他监视着同一主服务器的sentinel信息 -
创建连向其他sentinel的命令连接
,最终形成同一服务器的多sentinel互联网络
- 更新
六. 检测主观下线状态
- 默认情况sentinel会每秒发送一次PING命令,根据回复的信息判断主服务器是否下线
- Sentinel通过
down-after-ms
判断:如果在这个ms内没有返回有效回复
,则将该主服务器的flags里的down标识打开,主观判定为下线
七. 检测客观下线状态
- 当自己主观判断下线后,还需要向其他sentinel征询意见,如果
半数以上
也认为下线,则判定为客观下线 - 发送is-master-down-by-addr给其他sentinel,根据回复统计数量
八. 选举领头sentinel
- 当主服务器客观下线后,sentinel们需要选举产生一个
领头
sentinel进行故障转移
- 一个
配置纪元
里,所有sentinel都有一次投票机会,且领头sentinel不能更改 - 规则:先到先得,看谁先发出申请
九. 故障转移
- 三个步骤
- 将一个从服务器转换为主服务器,
slaveof no one
- 将其他从服务器复制这个新的主服务器,
slave of xxx
- 将已下线的主服务器改为新主服务器的从服务器
- 将一个从服务器转换为主服务器,