Redis中的Sentinel哨兵

Redis中的Sentinel哨兵

        Sentinel(哨兵)是Redis的高可用性解决方案:由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。

 

Redis中的Sentinel哨兵

Redis中的Sentinel哨兵

 

        当server1的下线时长超过用户设定的下线时长上限时,Sentinel系统就会对server1执行故障转移操作:

        首先,Sentinel系统会从server1的下属中选择一个从服务器升级为主服务器。

        之后,Sentinel系统会向server1属下的所有从服务器发送新的复制指令,让它们成为新的主服务器的从服务器。

        另外,Sentinel还会继续监视已经下线的server1,当它重新上线时,将它设置为新的主服务器的从服务器。

 

启动并初始化Sentinel

1.初始化服务器

Sentinel本质上是一个运行在特殊模式下的Redis服务器

2.将普通Redis服务器使用的代码替换成Sentinel专用代码

Sentinel能执行的七个命令:

Redis中的Sentinel哨兵

3.初始化Sentinel状态

Sentinel状态中的masters字典记录了所有监视的主服务器相关信息。

Redis中的Sentinel哨兵

4.根据给定的配置文件,初始化Sentinel的监视主服务器列表

Sentinel默认会以10秒一次的频率,通过命令连接向被监视的主服务器发送INFO命令,通过分析INFO命令的回复来获取主服务器的当前信息。

Redis中的Sentinel哨兵

5.创建连向主服务器的网络连接

 

检测主观下线状态

        在默认情况下,Sentinel会以每秒一次的频率向所有与它创建了命令连接的实例(包括主服务器、从服务器、其他Sentinel在内)发送PING命令,并通过实例返回的PING命令回复来判断实例是否在线。

        如果一个实例在down_after_milliseconds毫秒内连续向Sentinel返回无效回复,那么任务这个实例已经进入主观下线状态。

        但是每个Sentinel可能设置的时间限制不同,所有在有的Sentinel看来实例还没有下线。

 

检查客观下线状态

        当Sentinel将一个主服务器判断为主观下线后,为了确认这个主服务器是否真的下线了,它还会向同样监视这个主服务器的其他Sentinel询问,当Sentinel从其他Sentinel那里获取到足够数量的已下线判断之后,Sentinel就会将主服务器判定为客观下线,并对主服务器执行故障转移操作。

 

 

选举领头Sentinel

        当一个主服务器被判断为客观下线时,监视这个下线主服务器的各个Sentinel会协商选举一个领头Sentinel对下线主服务器执行故障转移操作。

 

故障转移

1.选出新的主服务器

        领头Sentinel会将已下线的主服务器所有从服务器保存到一个列表,然后过滤。过滤的主要是处于下线或者断线状态的从服务器,删除列表中最近五秒没有回复领头Sentinel的INFO命令的从服务器,删除所有与已下线主服务器连接断开超过down_after_milliseconds*10毫秒的从服务器。

        然后按照服务器优先级,对列表中的从服务器进行排序,找出优先级最高的。

        如果优先级相同,找出从服务器复制偏移量最大的那个(数据最新)

 

2.修改从服务器的复制目标

        选出新的主服务器之后,领头Sentinel会让剩下的服务器去复制新的主服务器,这可以通过向从服务器发送SLAVEOF命令来实现。

3.将旧的主服务器变为从服务器

        当旧的主服务器上线时,领头Sentinel会向它发送SLAVEOF命令,让它成为新的主服务器的从服务器。

 

总结:

Redis中的Sentinel哨兵

Redis中的Sentinel哨兵