redis哨兵

哨兵的作用

哨兵用于监视主服务器及主服务器下的从服务器的情况,当主服务器下线时,选择一个从服务器升级为主服务器,来接替下线的主服务器的工作

img

哨兵如何发现从服务器和其他哨兵

发现主服务器下的从服务器

哨兵只配置了主服务器的连接信息.哨兵首先会向主服务器创建一个命令连接.每隔10秒,哨兵会向主服务器发送INFO命令,用于获取主服务器的信息.在主服务器返回的信息中,有主服务器本身的信息以及主服务器下所有从服务器的信息,通过这些信息,哨兵就可以发现从服务器.哨兵会创建与从服务器之间的命令连接,通过这个命令连接,哨兵可以主动向从服务器发送INFO命令,进而获取从服务器的最新信息.

发现哨兵

除了向主服务器和从服务器创建命令连接之外,哨兵还会向主服务器和从服务器创建订阅连接.哨兵会通过命令连接定期向主服务器和从服务器的频道中发布一条消息.对于主服务器,哨兵发送自身的信息,加上这个主服务器的信息.对于从服务器,哨兵发送自身的信息加上这个从服务器所复制的主服务器的信息.,其他哨兵由于通过订阅连接订阅了同样的频道,那么通过这个频道的消息就能知道其他哨兵的信息以及所监视的主服务器的最新信息.当哨兵知道了其他哨兵的信息之后,就可以互相创建之间的命令连接,之后可以主动发送INFO命令来获取其它哨兵的信息.

主观下线

哨兵会每隔1s向主服务器,从服务器及哨兵发送PING命令,如果在down-after-milliseconds毫秒内,没有返回有效回复,那么哨兵会认为对应的服务器处于主观下线状态.由于不同哨兵配置的主观下线时间不同,那么可能存在一个哨兵认为某个服务器处于主观下线状态,但是另外一个哨兵并不认为该服务器处于主观下线状态.

客观下线

  1. 当哨兵发现一个主服务器处于主观下线状态,那么哨兵会向其他哨兵发送命令SENTINEL is-master-down-by-addr 征求它对这个主服务器下线状态的看法
  2. 当哨兵收到其它哨兵询问某个服务器是否下线的看法时,哨兵会根据传来的ip和port找到对应的服务器,并确定其是否下线(认为其主观下线或者客观下线),然后向询问的哨兵返回响应,如果down_state为1,则表示认为服务器已下线,否则认为服务器未下线.
  3. 当哨兵征求完其他哨兵对服务器下线状态的看法后,会统计认为服务器已下线的哨兵的数量,当这个数量大于等于当前哨兵所配置的客观下线所需数量,则哨兵认为该服务器处于客观下线状态

由于不同哨兵配置的客观下线所需数量不同,那么可能存在一个哨兵认为某个服务器为客观下线状态,而另外一个哨兵认为该服务器不处于客观下线状态

领头哨兵选举

  1. 哨兵发现一个服务器处于客观下线状态后,会向其他哨兵发出SENTINEL is-master-down-by-addr 来请求其他哨兵将自己作为它的局部领头哨兵.
  2. 在一个配置纪元里,一个哨兵只可以将另外一个哨兵作为自己的局部领头哨兵一次,并且规则是先到先得.如果一个哨兵被超过半数的哨兵作为局部领头哨兵,那么该哨兵将成为此次选举的首领,负责对下线的主服务器执行故障转移操作

哨兵如何选出一个新的主服务器

  1. 删除从服务器列表中不在线的从服务器
  2. 删除最近5秒没有通信过的从服务器
  3. 删除所有连接断开超过down-after-milliseconds*10毫秒的从服务器
  4. 选出偏移量最接近主服务器的从服务器
  5. 将从服务器升级为主服务器

参考资料

  • Redis设计与实现 16章 哨兵

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!