redis sentinel

redis sentinel

sentinel如何获取master, slave,其他sentinel信息

// sentinel数据结构
struct SentinelStatus {
    Dict* masters;
}

// master数据结构
struct SentinelRedisInstance {
    Dict* sentinels;
    Dict* slaves;
}
  • 获取master信息:
    • sentinel监控的master信息事先写入了sentinel的配置文件
    • sentinel启动时载入配置文件,初始化master字典
    • sentinel对master建立命令连接及订阅连接
  • 获取slave信息:
    • sentinel定时向master及已发现的slave发送INFO命令,获取master及slave信息,更新master的slave字典
    • sentinel对新发现的slave建立命令及订阅连接
  • 获取其他sentinel信息:
    • sentinel向所有被监视服务器(master和slave)的__sentinel:hello__频道发送消息。
      • 该消息包含sentinel信息,sentinel监视的master信息
    • sentinel订阅__sentinel:hello__频道,从中得到与自己监视相同master的sentinel信息,更新master的sentinel字典
    • sentinel发现新的sentinel后,立刻与新sentinel建立命令连接

小结:为什么sentinel不采用配置的方式获取slave及其他sentinel信息

  • sentinel只读取必要的信息,提高启动速度
  • 通过发布/订阅的方式,可以不需要在sentinel启动前就获取集群中所有sentinel信息。当添加新的sentinel或slave时,集群可以动态发现。

sentinel如何判断master是否下线

  • sentinel定时向所有与它连接的实例(master, slave, sentinel)发送PING命令,根据命令返回值判断实例是否在线
  • 主观下线
    • 在一定时间内,sentinel没有从实例获得有效回复,sentinel认为实例主观下线
    • sentinel认为master主观下线后,会向其他sentinel群发命令,询问他们是否认为master下线
    • 有超过quorum个sentinel认为master下线后,master状态将变成客观下线
  • 客观下线
    • master状态变成客观下线后,sentinel会对master实施故障转移

sentinel如何实施故障转移

为了防止多个sentinel同时监听到master客观下线,并同时对master实施故障转移,sentinel们需要先选举出领头的sentinel, 由领头sentinel负责实施。

如何选择领头的sentinel(Raft选举算法)

  • Raft选举算法介绍
  • 每个sentinel都有机会成为领头sentinel
  • 每个sentinel向其他sentinel发起投票邀请,要求其他sentinel将自己选举为局部领头sentinel
  • sentinel接收到第一个投票邀请后,将发起投票邀请的sentinel设置为自己的局部领头sentinel,并回复对方。拒绝后面到达的投票邀请
  • sentinel收到选民的回复后,统计自己的票数,如果过半数,自己就成为领头sentinel
    • 不过半数的话,可能会出现多个sentinel认为自己是leader
  • 如果选举失败,将进入下一轮选举,直至选出leader sentinel

如何实施故障转移

  • 选举出领头sentinel后,领头sentinel筛选下线master的从服务器,从中选出一个作为新的master。
  • sentinel向新master发送slaveof no one命令。在新master身份转换成功后,向其他从服务器发送slave of newMaster命令,向下线master的数据结构里记录slaveof newMaster命令
  • 新master筛选规则:
    • 根据sentinel与slave的通信时延,slave与旧master的失联时间,过滤不合格slave
    • 根据优先级>复制偏移量>slave id的顺序选出新master
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章