zoukankan      html  css  js  c++  java
  • [redis读书笔记] 第二部分 sentinel

    1.sentinel的初始化,会制定master的IP和port,然后sentinel会创建向被监视主服务器的命令连接和订阅连接:

        -  命令连接是用来和主服务器之间进行命令通信的

        - 订阅连接,用于订阅主服务器的__sentinel__:hello 频道

       sentinelState是sentinel的功能相关状态的记录,里面有个dict *masters;它的键是master的名字,值是一个sentinelRedisInstance的结构,这个结构会有一个dict *slave,键是slave的名字(IP:PORT),值是slave的sentinelRedisInstance,也就是说master的instance里存着slave的instance。

    2. 获取主服务器信息

        sentinel是通过配置文件来获得主服务器的信息并建链的。

        sentinel以每十秒一次的频率,通过命令连接向被监视的主服务器发送INFO命令,解析回复来获取主服务器的当前信息。

        sentinel一方面可以获得主服务器的runid,自身的role(master/slave),也可以获得主服务器属下所有从服务器的信息,IP,port等信息。所以,sentinel对从服务器的发现是无需任何信息的。而从服务器的信息就会分别存在上面所属的dict *master的instance里的dict *slave对应的instance里。

      

     

    3. 获取从服务器的信息

        sentinel为从服务器创建instance后,还会创建连接到从服务器。同样也包含命令连接和订阅连接。

       命令连接创建好后,sentinel同样向从服务器每10s发送一个INFO命令,得到的回复里有slave的run id,role,复制偏移量,主从连接状态,以及master的IP Port等信息,sentinel会以此更新从服务器的instance。

    4. 向主服务器和从服务器发送消息

        默认情况下,sentinel以2s的频率,向服务器的__sentinel__:hello频道发送消息,

        包含sentinel的IP port rundi epoch,以及主服务器的name ip port epoch。

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

        sentinel与服务器建立订阅连接后,会向服务器订阅__sentinel__:hello的频道,一致持续到和服务器断链。

        也就是说,对于每个与sentinel建链的服务器,sentinel即通过命令连接向服务器的hello频道发送消息,也通过订阅连接从服务器的hello频道接收消息。

        所以,对于监视同一个服务器的多个sentinel,一个sentinel发送的消息会被其他所有的snetinel收到,更新其他sentinel对发送者的信息。

       而其他sentinel的信息,从在master 的instance结构里的dict *sentinels里,类似于dict *slave, 键是IP:port,值是sentinels的instance

        // 其他同样监控这个主服务器的所有 sentinel
        dict *sentinels;    /* Other sentinels monitoring the same master. */

        

    6 sentinel彼此间的命令连接

        sentinel发现新的sentinel后,除了在字典里创建dict,还会对新的sentinel创建命令连接,

    7. 检测主观下线状态

        默认情况下,sentinel每秒向master、slave、其他sentinel发送PING命令,通过返回来判断对方是否在线,如果在配置的时间内没有返回或者返回一直有问题,sentinel就认定这个服务器已经下线,即主观下线。

    8. 检测客观下线状态(只针对主服务器进行这个操作)

        sentinel发现一个主观下线的主服务器,会命令询问其他sentinel,看他们是否也认为主服务器下线(可以是主观也可以是客观下线),当sentinel收到足够数量的下线状态后,就判定主服务器为客观下线,进行故障转移操作。交互是通过该is-master-down-by-address 来实现。

     9. 选举领头sentinel(raft算法)

      当一个主服务器被判断为客观下线时,监视这个下线主服务器的各个sentinel会进行协商,选举出一个领头的sentinel,由它来做故障转移操作。

         - 当选取领头sentinel时,各个sentinel都往其他sentinel发送is-master-down-by-address,并在消息中指明自己的runID和current_epoch,以此通知对方自己要竞选局部领头sentinel。

         - 收到消息的sentinel,如果之前没有收到过别的请求,就选择这消息里的runID为局部领头,并把这个runID和epoch放回消息中回复给源sentinel,如果之前已经选择别的sentinel X为局部领头,就把X的runID和epoch放消息里回复

        - 收到回复的sentinel,首先看epoch和自己的是否相等,如果相等,再比较runID,如果发现消息里的runID是自己的,说明自己当选了局部领头,超过半数的snetinel选择了自己为局部领头,它就成为了领头sentinel,可以进行移除故障操作。

        - 给定时间内没有选出领头sentinel,过段时间后再次选举。

    ----------------------

    main函数中,serverCron里会启动sentinel的主函数sentinelTimer。

    createSentinelRedisInstance{

        // 选择要添加的表
        // 注意主服务会被添加到 sentinel.masters 表
        // 而从服务器和 sentinel 则会被添加到 master 所属的 slaves 表和 sentinels 表中

    }

  • 相关阅读:
    第二阶段冲刺报告(三)
    第二阶段冲刺报告(二)
    第二阶段冲刺报告(一)
    课程改进意见
    用户体验
    返回一个二维整数数组中最大联通子数组的和
    《你的灯亮着吗》阅读笔记三 ——谁的问题
    《你的灯亮着吗》阅读笔记二 ——什么是真正的问题
    《你的灯亮着吗》阅读笔记一 —— 问题是什么?
    我爱淘冲刺阶段站立会议2每天任务6
  • 原文地址:https://www.cnblogs.com/jiangz222/p/6777701.html
Copyright © 2011-2022 走看看