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)       将已下线主服务器设置为新的主服务器的从服务器,当这个旧的主服务器重新上线的时候,它就会成为新的主服务器的从服务器。