美文网首页
Redis Sentinel哨兵

Redis Sentinel哨兵

作者: 剑客kb | 来源:发表于2018-12-02 11:29 被阅读0次

    Sentinel是Redis高可用的体现:通过多个Sentinel实例组成的Sentinel系统可以监视多个主服务器和这些主服务器对应的从服务器,当被监视的主服务器下线时,自动将它对应的某个从服务器升级为主服务器,继续处理请求。

    1、初始化服务器

    Sentinel本质是一个运行在特殊模式下的Redis服务器,Sentinel状态中的masters字典记录了被监视的主服务器相关信息。创建和主服务器的异步网络连接和订阅连接(订阅主服务器的Sentinel:hello频道)。异步连接是为了降低服务器压力,订阅连接是为了不丢失频道的任何信息。

    2、Sentinel和主服务器通信

    • Sentinel默认会以每10秒1次的频率向主服务器发送INFO命令,获取主服务器运行ID、主服务器下所有从服务器信息。对于每一个与Sentinel1连接的服务器,
    • Sentinel1每2秒1次会通过命令连接向被监视的主从服务器的sentinel1:hello频道发送信息,以此来向其他sentinel宣告自己的存在,又通过订阅连接从服务器sentinel1:hello接受信息,集群的其他sentinel也会接受该频道信息,从而自己对于更新Sentinel1的认知,

    3、创建和其他Sentinel的命令连接

    Sentinel通过频道信息发现新的Sentinel,多个Sentinel之间是网状连接。Sentinel集群之间会互相创建命令连接用于通信,因为已经有主从服务器作为发送和接收hello信息的中介,sentinel之间不会创建订阅连接。

    1、 检测主观下线

    Sentinel会以每秒1次的频率向所有与它建立命令连接的实例发送PING命令,根据回复判断实例是否在线;有效回复包括+PONG、-LOADING、-MASTERDOWN,除此之外的都是无效回复,或指定时间内未返回。Sentinel配置文件中down-after-milliseconds选项指定了该Sentinel判断该实例主观下线的时间长度,多个Sentinel判断实例下线的时间长度可能不尽相同

    2、检测客观下线

    当Sentinel判断某个主服务器主观下线之后,为了确认,会向同样监视该主服务器的Sentinel询问,当足够多的Sentinel都判断主服务器主观下线,该主服务器就会被Sentinel判断为客观下线,并进行故障转移。

    2.1、发送Sentinel is-master-down-by-addr

    Sentinel发送 SENTINEL is-master-down-by-addr <ip> <port> <current_epoch> <runid>询问其他Sentinel,该主服务器是否下线。

    2.2、接受 is-master-down-by-addr

    当目标Sentinel接收到源Sentinel发来的命令时,会根据ip和port判断对应主服务器是否下线,并回复<down_state>(1表示认为下线) <leader_runid> (*表示只是普通的回复,源Sentinel的运行ID,表示在该leader_epoch中,目标Sentinel把源Sentinel设为局部Leader)<leader_epoch>(当前纪元,用在选举Leader Sentinel)

    2.3、接受回复

    在sentinel启动时配置sentinel monitor master 127.0.0.1 6379 2 ; 表示2个sentinel主观认为主服务器下线,就可以表示该主服务器客观下线了,每个sentinel判断的条件可能不一致。

    选举领头Sentinel

    在一个配置纪元current_epoch里,每一个sentinel都有一次把某个sentinel置为局部领头sentinel的机会
    -- 当一个sentinel A向另一个sentinel B发送is-master-down-by-addr命令时,B返回是A的runid,表明B已经把A选为当前纪元的局部Leader,并且拒绝其他设置请求
    -- A会取出回复的runid和current_epoch和自己这边的参数进行比对,当一致时,则记录A已被B选为局部Leader,当A被半数以上的sentinel设为局部Leader,它就是Leader Sentinel。
    -- 如果给定时间内,没有一个sentinel满足要求,则在一段时间之后继续选举,知道选出Leader Sentinel为止。

    故障转移

    从已下线的主服务器的从服务器选取一个作为主服务器;让其他的从服务器复制新的主服务器,把已下线的旧主服务器设置为新主服务器的从服务器,以便重新上线时作为从服务器服务。
    1、向一个从服务器发送SLAVEOF no one命令,将这个从服务器转换为主服务器。挑选原则:首先删除处于断线状态和下线的从服务器;然后删除最近5秒内没有回复过Leader Sentinel的INFO命令的从服务器;最后删除和已下线服务器连接断开超过down-after-milliseconds*10时间的从服务器,这个可以保证剩下的从服务器数据都比较新。如果这时候还有多个从服务器,则挑选出复制偏移量最大的从服务器;如果还有多个从服务器,则挑选出runID最小的从服务器;
    2、假设挑选出来的从服务器为A,已下线的旧的主服务器为D,则向剩余的D的从服务器B、C发送SLAVEOF A_ip A_port,把B、C指定为A的从服务器;
    3、故障转移的最后就是把D设置为A的从服务器,因为D已经下线,所以在下线状态时,D内部的数据结构会记录主服务器A,待到D重新上线,Sentinel会向它发送SLAVEOF命令,使其复制A的数据。

    相关文章

      网友评论

          本文标题:Redis Sentinel哨兵

          本文链接:https://www.haomeiwen.com/subject/eqmrcqtx.html