Sentinel是Redis高可用的解决方案:由一个或多个Sentinel实例组成的Sentinel系统。
当主故障下线时,从会升级为主,同时和其他从同步。
当原来的主上线时,会降级为新主的从。
1、启动和初始化
- 初始化一个redis服务器:Sentinel系统本质上就是一个特殊模式的redis服务器。
- 使用Sentinel专用代码,使用专用的命令表
- 初始化Sentinel状态,初始化sentinelState结构,保存服务器中所有和Sentinel功能有关的状态
- 初始化Sentinel状态的master属性,master字典记录了所有被Sentinel监视的主服务器的相关信息。
- 创建连向主服务器的网络连接
2、获取主服务器信息
每十秒一次获取主信息,包括其中的从信息,更新Sentinel实例结构中的信息。
3、获取从服务器信息
每十秒一次获取从的详细信息,更新Sentinel实例结构中的信息。
4、向主从发送信息
发送给服务器信息的目的是什么?
5、接收主从的频道信息
订阅连接是什么?
接收到的信息是什么?
Sentinel不仅保存主从的信息,而且也会保存其他Sentinel的信息,并且相互更新。
6、检测主观下线状态
Sentinel每秒一次向主从,以及其他Sentinel发送ping命令,超过主观下线时长的服务器没有反应或者返回错误,就认为是主观下线。
7、检查客观下线状态
Sentinel向其他Sentinel发送命令询问主服务器是否下线,如果quorum 数量的Sentinel都认为主观下线,则该服务器被设置为客观下线。
sentinel发送is-master-down-by-addr
给其他 Sentinel,然后接收回复。
判断的数量由quorum 来配置
不同 Sentinel 载入 quorum 的配置不同,判断客观下线的条件不同
8、选举领头Sentinel
每个发现主服务器主观下线的 Sentinel都会要求其他 Sentinel将自己设置为局部领头 Sentinel。
先到先得,超过半数投票即为领头,由领头 Sentinel对下线的主服务器进行故障转移操作。
9、故障转移
1.先选出新的主服务器,根据层层筛选,选出最稳定的,数据最新的作为主服务器
删除断连的,没有回复的,按照优先级对剩下的进行排序。
2.让其他从服务器都去复制新的主服务器
3.将旧的主变为新的从