sentinel

sentinel的概述

  • 1.是解决redis高可用的方案:由一个或多个sentinel实例组成的sentinel系统
    1. 可以监视任意多个主服务器以及这些主服务器属下的所有从服务器。
  • 3.可以在被监视的主服务器下线时候,自动将下线主服务器属下的某个从服务器升级为新的主服务器

     

    sentinel

    image.png

如何进行故障转移

当server1下线时长超过用户设定的下线时长上限,sentinel系统就会对server1进行故障转移

  • 1.首先从slaves里面挑选一个升级为主服务器
  • 2.sentinel系统会向server1属下的所有从服务器发送新的复制指令,让他们成为新的服务器从服务器,当所有从服务器都开始复制新的主服务器时候,故障转移操作执行完毕
    1. sentinel 还会继续监视已下线的server1,在他从新上线(上线后只能变为从服务器)

       

      sentinel

      image.png

启动Sentinel

  • 命令redis-sentinel /path/to/your/sentinel.conf或者命令redis-server /path/to/your/sentinel.conf --sentinel。这两个命令都可以启动sentinel

初始化Sentinel

  • 1.初始化服务器
  • 2.将普通redis服务器使用的代码替换成sentinel专用代码
  • 3.初始化sentinel状态
  • 4.根据给定的配置文件,初始化sentinel的监视主服务器列表
  • 5.创建连向主服务器的网络连接

初始化服务器

  • 首先sentinel本质上是一个运行在特殊模式下的redis服务器
  • sentinel模式下的redis服务器主要功能如下:

     

    sentinel

    image.png

使用sentinel专用代码

  • 1.使用redis.h/REDIS_SERVERPORT的常量值作为服务器端口
  • 2.使用redis.c/redisCommandTable作为服务器的命令表

初始化sentinel状态

  • 1.在使用sentinel专用代码后,接下来服务器会初始化一个sentinel.c/sentinelState结构。
  • 2.sentinelState保存了服务器中所有和sentinel有关的状态

     

    sentinel

    image.png

初始化sentinel状态的master属性

sentinel状态中的masters字典记录了所有被sentinel监控的主服务器相关属性

  • 1.其key是被监视服务器的名字
  • 2.而字典的值则是被监视主服务器对应的sentinel.c/sentinelRedisInstance结构。
  • 3.一个sentinelRedisInstance代表一个呗sentinel监视的redis服务器实例,该实例可能是主服务器,从服务器或者另外一个sentinel

     

    sentinel

    image.png

  • 4.addr属性保存着ip和port

     

    sentinel

    image.png

  • 5.对sentinel状态的初始化将引发对masters字典的初始化,而对masters字典的初始化是根据被载入的sentinel配置文件来进行的,具体如下:

     

    sentinel

    image.png

  • 6.具体的数据结构如下

     

    sentinel

    image.png

sentinel

image.png

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

  • 1.sentinel将成为主服务器的客户端
  • 2.对于每个被sentinel监视的主服务器来说,sentinel唬创建两个连向主服务器的异步网络连接
  • 3.一个是命令连接,这个专门用于向主服务器发送命令并接受命令回复
  • 4.一个是订阅连接,这个连接是专门用于订阅主服务器的sentinel:hello频道
  • 5.采用两个连接是因为万一客户端不在线后者断线 那么客户端就会丢失这条信息,采用订阅消息可以不丢失。

     

    sentinel

    image.png

获取主服务器信息

sentinel

image.png

  • 1.sentinel默认每十秒一次通过命令连接向被监视的主服务器发送INFO命令。

     

    sentinel

    image.png

  • 2.sentinel通过解析INFO命令返回可以得到该主服务器自身的关键信息,run_id,以及role域

  • 3.根据得到该主服务器的从服务器的相关信息

  • 4.sentinel根据检测到的主服务器id不同 会更新实例结构(sentinel持有这个结构)

  • 5.至于从服务器会被用于更新主服务器实例结构(sentinel持有这个结构)的slaves字典,字典的键是sentinel设置以ip:port形式,值则对应服务器的实例结构

     

    sentinel

    image.png

  • 6.主服务器和从服务器的在sentinel中的实例结构的区别是1.主服务器的flags的属性值为SRI_MASTER,而从服务器的属性为SRI_SLAVE。2.主服务器实例结构的name属性是用于使用sentinel文件设置的而从服务器的实例结构的name属性则是根据ip+port设置的

获取从服务器信息

  • 1.sentinel除了会为新的从服务器建立相应的实例结构之外。还会建立到从服务器的命令连接和订阅连接。
    1. 命令连接info到从服务器的指令回复如下:

       

      sentinel

      image.png

  • 3.根据上述回复进行更新

向主从服务器发送信息

  • 1.默认以2秒一次向所有被监视的主服务器
  • 2.命令是发往订阅连接,具体如下图:

     

    sentinel

    image.png

sentinel

image.png

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

  • 1.所以我们会发送订阅消息也会接受订阅消息
  • 2.多个sentinel监视一个服务器,当有sentinel发送命令,其他sentinel(自己本身也会接收到)会接收到这个消息
  • 3.接受到信息的sentinel会更新其他sentinel对该sentinel和其监视服务器的认知

     

    sentinel

    image.png

  • 4.接收到信息的sentinel 会对sentinel运行id进行判断如果与自己一致,说明是自己发送的直接抛弃
  • 5.否则sentinel将对信息中的各个参数和主服务器的实例结构进行更新
  • 6.在sentinel给主服务器创建的实例结构中的sentinels字典除了保持自身之外,还保存了其他监视该主服务器的资料
  • 7.sentinels字典的key就是sentinel的ip+port,value就是sentinel的实例结构(也就是sentinelRedisInstances)

     

    sentinel

    image.png

创建连向其他sentinel的命令连接

  • 当sentinel发现一个其他sentinel(即都监控同一个sentinel)不仅会在该sentinel内部会创建一个对应的实例,还会创建一个连向该sentinel的命令连接

     

    sentinel

    image.png

  • sentinel之间不会创建订阅连接,因为sentinel需要从主服务器获取其他监视的sentinel才创建的订阅频道

检测主观下线

  • 1.默认情况下sentinel会以每秒一次的频率向所有与他创建了命令连接发送PING命令。包括主从和sentinel

     

    sentinel

    image.png

  • 2.有效回复包括:+PONG,-LOADING,-MASTERDOWN,除了这三个回复都不是有效回复
  • 3.down-after-milliseconds选项指定了sentinel判断实例进入主观下线所需要的时间长度,如果一个实例在指定毫秒内连续返回无效回复,那么sentinel会修改这个实例所对应的实例结构,在结构的flags属性中打开SRI_S_DOWN标识,以此来表示实例进入主观下线状态。
  • 4.down-after-milliseconds 不仅仅是用来标识master下线,其从服务器和其他监控这个sentinel的时长也是采用这个down-after-milliseconds
  • 5.会存在两个sentinel加载不同的down-after-milliseconds 导致主观下线标准不同

检测客户下线状态

  • 1.当sentinel判断为主观下线后,该sentinel会收集其他监控该实例的sentinel的是否下线信息。
  • 2.当收集的数量超过一定的阈值之后 sentinel就会将从服务器切换为主服务器。
  • 3.sentinel使用SENTINEL is-master-down-by-addr <ip> <port> <current_epoch> <run_id>询问其他sentinel是否同意主服务器是否已经下线

     

    sentinel

    image.png

  • 4.当接收到该命令的sentinel 会根据传递的参数去寻找对应的实例信息并返回给请求者

     

    sentinel

    image.png

  • 5.当sentinel收集到主观下线数量(可以通过quorum参数配置)超过一定的数量后该sentinel会打开实例结构SRI_O_DOWN标识,标识已经进入主观下线

     

    sentinel

    image.png

  • 6.同理不同的sentinel判断客户下线的标准不同

选举领头Sentinel

当一个主服务器下线时候,监视这个下线主服务器的各个sentinel会进行协商,选举出一个领头sentinel,并由领头sentinel对下线主服务器进行故障转移

 

sentinel

image.png

故障转移

选出新的服务器

  • 选择一个状态好,数据完整的从服务器,然后像这个从服务器发送SLAVEOF no one 将其转换为主服务器

     

    sentinel

    image.png

     

    sentinel

    image.png

修改从服务器的复制目标

  • 领头sentinel,让剩余的从服务器去赋值新的服务器,通过SLAVEOF命令

     

    sentinel

    image.png

将已经下线的主服务器设置为新的主服务器的从服务器,当其从新上线就是从服务器