1,Sentinel是Redis的高可用性解决方案:由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替一下线的主服务器继续处理命令请求。
2,启动并初始化Sentinel的步骤:
1)初始化服务器
Sentinel的本质只是一个运行在特殊模式下的Redis服务器,所以启动Sentinel的第一步就是初始化一个普通的Redis服务器。但是其执行的工作和普通的Redis服务器执行的工作并不相同,因此初始化过程并不完全相同。普通服务器初始化时会通过载入RDB文件或者AOF文件来恢复数据库状态,但是Sentinel并不使用数据库,所以不会这么做。
2)将普通Redis服务器使用的代码替换成Sentinel专用代码。Redis服务器有Sentinel模式下专用的代码。
3)初始化Sentinel状态
在应用了Sentinel的专用代码后,接下来,服务器会初始化一个sentinel.c/sentinelState结构,这个结构保存了服务器中所有和Sentinel功能有关的状态。
4)根据给定的配置文件,初始化Sentinel的监视主服务器列表
Sentinel状态中的masters字典记录了所有被Sentinel监视的主服务器的相关信息,其中字典的键是被监视主服务器的名字,而字典的值则是被监视主服务器对应的sentinel.c/sentinelRedisInstance结构(每一个实例结构可以是主服务器、从服务器、或者另外一个Sentinel)。需要注意的是这个master字典的初始化是根据被载入的Sentinel配置文件来进行的。
5)创建连向主服务器的网络连接
Sentinel会创建两个连向主服务器的异步网络连接:一个是命令连接,这个连接专门用于向主服务器发送命令,并接收命令回复;另一个是订阅连接,这个连接专门用于订阅主服务器的__sentinel__:hello频道。
3,获取主服务器信息,Sentinel默认会以每10秒一次的频率,通过命令连接向被监视的主服务器发送INFO命令,并通过分析INFO命令的回复来获取主服务器的当前信息。
4,获取从服务器信息,当Sentinel发现主服务器有新的从服务器出现时,Sentinel除了会为这个新的从服务器创建相应的实例结构之外,Sentinel还会创建连接到服务器的命令连接和订阅连接。创建连接之后,Sentinel会以每10秒一次的频率通过命令连接向从服务器发送INFO命令。向主服务器和从服务器发送信息,在默认情况下,Sentinel会以每秒一次的频率,通过命令连接向所有被监视的主服务器和从服务器发送命令。
5,Sentinel为主服务器创建的实例结构中的sentinels字典保存了除Sentinel本身之外,所有同样监视这个主服务器的其他Sentinel的资料。Sentinel之间只会创建命令连接,而不创建订阅连接。
6,检查主管下线状态,在默认情况下,Sentinel会以每秒一次的频率向所有与它创建了命令的实例发送PING命令,并通过实例返回的PING命令回复来判断实例是否在线。Sentinel中配置文件的down-after-milliseconds选项指定了Sentinel判断实例进入主观下线所需的时间长度。
7,当Sentinel将一个主服务器判断为主观下线之后,为了确认这个主服务器是否真的下线了,它会向同样监视这个服务器的其他Sentinel进行询问,看它们是否也认为这个服务器已经下线了,当收到足够数量的已下线判断之后,Sentinel就会将从服务器判定为客观下线,并对主服务器执行故障转移操作。
1)发送SENTINEL is-master-down-by-addr命令
2)接收SENTINEL is-master-down-by-addr命令
3)接收SENTINEL is-master-down-by-addr命令的回复
8,选举领头Sentinel,当一个服务器被判断为客观下线时,监视这个下线服务器的各个Sentinel会进行协商,选举出一个领头Sentinel,并由领头Sentinel对下线主服务器执行故障转移。
9,领头Sentinel执行故障转移操作的步骤:
1)在已经下线主服务所属的所有从服务器里面,挑选出一个从服务器,并将其转换为主服务器
2)让已经下线主服务器的所有从服务器改为复制新的主服务器
3)将已下线的主服务器设置为新的主服务器的从服务器,当这个旧的主服务器重新上线时,它就会成为新的主服务器的从服务器。