redis当中的sentinel

5270阅读 0评论2019-09-22 stolennnxb
分类:NOSQL

sentinel是redis的高可用性的解决方案,由一个或多个sentinel实例组成的sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态(下线时长超过用户设定的下线时长上限)时自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。
当一个sentinel启动时,
1. 会将普通的redis服务器使用的代码替换成sentinel专用的代码(自己的命令列表,端口等信息),
2. 初始化其状态(sentinelState结构)
3. 根据给定的配置文件,初始化监视列表(在状态中的master字典中记录了name->sentinelRedisInstance结构的映射)
4. 创建连向主服务器的网络连接,sentinel将成为主服务器的客户端,它可以向主服务器发送命令,并从命令回复中获取相关的信息。对于每一个被监视的主服务器来说,sentinel会创建两个连向主服务器的异步网络连接:一个是命令连接,专门用于向主服务器发送命令,接收回复;第二个是订阅连接,专门用于订阅主服务器的__sentinel__::hello频道(防止客户端丢失信息)

获取主从服务器信息

sentinel默认会以每10s一次的频率,通过命令向被监视的主服务器发送INFO命令,并通过分析INFO命令的回复来获取主服务器的当前信息(包括自身的信息和从服务信息)。并对从服务器创建连接到从服务器的命令连接和订阅连接,之后获取信息,分别更新主从服务器的结构

向主从服务器发送消息

在默认情况下,sentinel会以每两秒一次的频率,通过命令连接向所有被监视的主从服务器发送一下格式的命令

点击(此处)折叠或打开

  1. PUBLISH __sentinel__:hello ",, , ,,,,"
其中s开头的是sentinel本身的信息,m开头的是服务器的信息

接收来自主从服务器的频道信息

当sentinel与一个主服务器或者从服务器建立起订阅连接之后,sentinel会通过订阅连接,向服务器发送一下命令
SUBSCRIBE __sentinel__:hello
sentinel对这个频道的订阅会一直持续到sentinel与服务器的连接断开为止
对于监视同一个服务器的多个sentinel来说,一个sentinel发送的信息会被其他sentinel接收到,用于更新其他sentinel的信息
sentinel为主服务器创建的实例结构中的sentinels字典保存了处sentinel本身之外,所有同样监视这个主服务器的其他sentinel的资料:键是ip+port,值是对应的sentinel实例

当sentinel通过频道信息发现一个新的sentinel时,它除了在sentinels字典中创建相应的实例结构,还会创建一个连向新sentinel的命令连接,而新sentinel也会创建连向这个sentinel的命令连接,最终监视同一主服务器的多个sentinel将形成相互连接的网络


检测主观下线

默认情况下,sentinel会以每秒1次的频率向所有与它建立了命令连接的实例发送PING命令,并通过实例返回的PING命令回复来判断实例是否在线。sentinel配置文件中的down-after-milliseconds选项制定了sentinel判断实例进入主观下线所需的事件长度,如果在此期间内,连续向sentinel发送的PING命令返回无效回复,那么sentinel会修改这个实例所对应的实例结构,在结构的flags属性中打开SRI_S_DOWN标识。

检测客观下线

当sentinel将一个主服务器判断为主观下线后,为了确认这个主服务器是否真的下线了,它会向同样监视这一主服务器的其他sentinel进行询问,看它们是否也认为主服务器已经进入了下线状态。使用命令SENTINEL is-master-down-by-addr
当一个sentinel接收到另一个sentinel发来的 is-master-down-by-addr命令时,目标sentinel会分析并去除命令中的各个参数,检查指定主服务器是否已经下线,并向源sentinel回复
当sentinel从其他sentinel那里接收到足够数量的已下线判断之后,sentinel就会将服务器判定为客观下线,设置标志SRI_O_DOWN,并对主服务器执行故障转移操作。

选举领头sentinel

当一个主服务器被判断为客观下线时,监视这个下线主服务器的各个sentinel会进行协商,选举出一个领头sentinel,并由领头sentinel对下线主服务器执行故障转移操作,选举领头sentinel规则如下:
1. 每次进行领头sentinel选举之后,无论选举是否成功,所有sentinel的配置epoch都会自增一次,
2. 在一个配置epoch里面,所有sentinel都有一次将某个sentinel设置为局部领头sentinel的机会,并且 局部领头sentinel一旦设置,在这个配置epoch里面就不能更改
3. 每个发现主服务器进入客观下线的sentinel都会要求其他sentinel将自己设置为局部领头sentinel,通过再次向另一个sentinel发送SENTINEL is-master-down-by-addr命令,带不同参数
4. sentinel设置局部领头sentinel的规则是先到先得,返回参数是runid和epoch
5. 接收到返回命令的参数,如果有一半以上的sentinel将某个sentinel设置为局部领头sentinel,那么直接成为领头sentinel
6. 如果给定时间内,没有产生,则过一段事件后再次举行选举~

故障转移

选举产生领头sentinel之后,领头sentinel将对已下线的主服务器执行故障转移操作:

1. 在已下线主服务器属下的所有从服务器里面,挑选出一个从服务器,并将其转换为主服务器,slaveof no one

2. 让已下线主服务器树下的所有从服务器改为复制新的主服务器,slaveof 命令

3. 将已下线的主服务器设置为新的主服务器的从服务器,当这个就得主服务器重新上线时,就会成为新的主服务器的从服务器,slaveof命令

上一篇:redis当中的复制
下一篇:redis集群之基础概念