1 简介
Sentinel是Redis的高可用性的解决方案:由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线的状态时,自动将下线的主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。
2 启动并初始化Sentinel
1) 初始化服务器
2) 将普通的Redis服务器使用的代码代替成Sentinel专用代码
3) 初始化Sentinel状态
4) 根据给定的配置文件,初始化Sentinel的监视主服务列表
5) 创建连向主服务器的网络连接。Sentinel将成为主服务器的客户端,它可以向主服务器发送命令,并从命令回复中获取相关的信息,对于每个被Sentinel监视的主服务器来说,Sentinel会创建两个连向主服务器的异步网络连接:
1, 一个是命令连接,这个连接专门用于向主服务器发送命令,并接收命令回复
2, 一个是订阅连接,这个连接专门用于订阅主服务器的_sentinel_:hello频道
3 获取从服务器信息
当Sentinel发现主服务器有新的从服务器出现时,Sentinel除了会为这个新的从服务器创建相应的实例结构之外,Sentinel还会创建连接到从服务器的命令连接和订阅连接。
当Sentinel通过频道信息发现一个新的Sentinel时,它不仅会为新的Sentinel在sentinels字典中创建相应的实例二结构,还会创建一个连向新的Sentinel的命令连接,而新的Sentinel也同样创建连向这个Sentinel的命令连接,最终监视同一主服务器的多个Sentinel将形成相互连接的网络。
4 检测下线状态
1) 在默认情况下,Sentinel会以每秒一次的频率向所有与它创建了命令连接的实例发送PING命令,并通过实例返回的PING命令回复判断实例是否主观下线。
2) 当Sentinel将一个主服务器判断为主观下线之后,为了确认这个主服务器是否真的下线了,它会向同样监视这一主服务器的其他Sentinel进行询问,看它们是否也认为主服务器已经进入下线状态。当Sentinel从其他Sentinel那里接收到足够数量的已下线的判断之后,Sentinel就会将从服务器判定为客观下线,并对主服务器执行故障转移操作。
5 选举领头的Sentinel
当一个主服务器被判断为客观下线时,监视这个下线主服务器的各个Sentinel会进行协商,选举出一个领头的Sentinel,并由领头的Sentinel对下线主服务器执行故障转移操作。
规则如下:
1) 所有在线的Sentinel都有被选举为领头的资格
2) 每次进行领头Sentinel选举之后,不论选举成功与否,所有Sentinel的配置纪元的值都会自增一次
3) 在一个配置纪元里面,所有Sentinel都有一次将某个Sentinel设置为局部领头Sentinel的机会,并且局部头领一旦设置在这个配置纪元里面就不能更改
4) 每个发现主服务器进行客观下线的Sentinel都会要求其他Sentinel将自己设置为局部领头Sentinel
5) Sentinel设置局部头领Sentinel规则是先到先得,最先向目标Sentinel发送设置要求的元Sentinel将会被设置成Sentinel的局部领头Sentinel
6) 如果某个Sentinel被半数以上的Sentinel设置为局部领头Sentinel,那么这个Sentinel将成为领头Sentinel。
7) 如果在给定的时间内,没有一个Sentinel被选举为Sentinel,那么各个Sentinel将在一段时间之后再次选举,直到选出来为止。
6 故障转移
领头的Sentinel将对已下线的主服务器执行故障转移操作,该操作分为三步:
1) 在已下线的主服务器属下的所有从服务器里面,挑选出一个从服务器,并将其转换为主服务器
2) 让已下线主服务器属下的所有从服务器改为复制新的主服务器
3) 将已下线主服务器设置为新的主服务器的从服务器,当这个旧的主服务器重新上线的时候,它就会成为新的主服务器的从服务器。