redis哨兵模式选举机制

redis哨兵模式选举机制当 redis 集群的主节点故障时 Sentinel 集群将从剩余的从节点中选举一个新的主节点 有以下步骤 故障节点主观下线故障节点客观下线 Sentinel 集群选举 LeaderSentin 决定新主节点选举过程 1 主观下线 Sentinel 集群的每一个 Sentinel 节点会定时对 redis 集群的所有节点发心跳包检测节点是否正常 如果一个节点在 down after milliseconds 时间内没有回复 Sentinel 节点的心跳包 则该 redis 节点被该 Sentinel 节点主观下线

当redis集群的主节点故障时,Sentinel集群将从剩余的从节点中选举一个新的主节点,有以下步骤:

  1. 故障节点主观下线
  2. 故障节点客观下线
  3. Sentinel集群选举Leader
  4. Sentinel Leader决定新主节点

选举过程

1、主观下线

Sentinel集群的每一个Sentinel节点会定时对redis集群的所有节点发心跳包检测节点是否正常。如果一个节点在down-after-milliseconds时间内没有回复Sentinel节点的心跳包,则该redis节点被该Sentinel节点主观下线。

2、客观下线

当节点被一个Sentinel节点记为主观下线时,并不意味着该节点肯定故障了,还需要Sentinel集群的其他Sentinel节点共同判断为主观下线才行。

该Sentinel节点会询问其他Sentinel节点,如果Sentinel集群中超过quorum数量的Sentinel节点认为该redis节点主观下线,则该redis客观下线。

如果客观下线的redis节点是从节点或者是Sentinel节点,则操作到此为止,没有后续的操作了;如果客观下线的redis节点为主节点,则开始故障转移,从从节点中选举一个节点升级为主节点。

3、Sentinel集群选举Leader

如果需要从redis集群选举一个节点为主节点,首先需要从Sentinel集群中选举一个Sentinel节点作为Leader。

每一个Sentinel节点都可以成为Leader,当一个Sentinel节点确认redis集群的主节点主观下线后,会请求其他Sentinel节点要求将自己选举为Leader。被请求的Sentinel节点如果没有同意过其他Sentinel节点的选举请求,则同意该请求(选举票数+1),否则不同意。

如果一个Sentinel节点获得的选举票数达到Leader最低票数(quorumSentinel节点数/2+1的最大值),则该Sentinel节点选举为Leader;否则重新进行选举。

在这里插入图片描述

4、Sentinel Leader决定新主节点

当Sentinel集群选举出Sentinel Leader后,由Sentinel Leader从redis从节点中选择一个redis节点作为主节点:

  1. 过滤故障的节点
  2. 选择优先级slave-priority最大的从节点作为主节点,如不存在则继续
  3. 选择复制偏移量(数据写入量的字节,记录写了多少数据。主服务器会把偏移量同步给从服务器,当主从的偏移量一致,则数据是完全同步)最大的从节点作为主节点,如不存在则继续
  4. 选择runid(redis每次启动的时候生成随机的runid作为redis的标识)最小的从节点作为主节点
redis哨兵模式选举机制

为什么Sentinel集群至少3节点

一个Sentinel节选举成为Leader的最低票数为quorumSentinel节点数/2+1的最大值,如果Sentinel集群只有2个Sentinel节点,则

Sentinel节点数/2 + 1 = 2/2 + 1 = 2  
 

    即Leader最低票数至少为2,当该Sentinel集群中由一个Sentinel节点故障后,仅剩的一个Sentinel节点是永远无法成为Leader。

    也可以由此公式可以推导出,Sentinel集群允许1个Sentinel节点故障则需要3个节点的集群;允许2个节点故障则需要5个节点集群。

    版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

    发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233237.html原文链接:https://javaforall.net

    (0)
    全栈程序员-站长的头像全栈程序员-站长


    相关推荐

    • 只读挂载磁盘linux,linux挂载磁盘就变只读怎么解决

      只读挂载磁盘linux,linux挂载磁盘就变只读怎么解决Linux系统挂载存储变成只读的解决方案:1、mount:用于查看哪个模块输入只读,一般显示为:[root@localhost~]#mount/dev/cciss/c0d0p2on/typeext3(rw)procon/proctypeproc(rw)sysfson/systypesysfs(rw)devptson/dev/ptstypedevpts(r…

      2022年6月19日
      20
    • java redis 没密码配置_jeeplus设置Redis密码

      java redis 没密码配置_jeeplus设置Redis密码接手过来的jeeplus系统原本没有设置redis密码,近期要上线,为保证redis安全性,运维要求添加redis密码,且在线上环境为redis设置了密码。接下来我需要修改程序内容来迎合运维此项修改,方式如下:设置Redis密码涉及到以下三个文件,分别是:jeeplus.properties、spring-context-jedis.xml和JedisUtils.java。以上三个文件的含义为如下…

      2022年9月5日
      4
    • linux命令之pstack[通俗易懂]

      linux命令之pstack[通俗易懂]很多时候我们想知道在Linux下后台程序到底运行到哪里了,卡住了吗,出错了吗,最简单的我们会使用#psauxf|grep来查看后台程序的状态,可是如果想知道的更多,那就可以用到pstack这个命令了。首先举一个简单的例子(test.c)来引出这个命令 #include#include#includevoid*thread_proc(void*data)

      2022年9月14日
      1
    • JavaScript如何将Unit8Array图片数据转换为JPG图片

      JavaScript如何将Unit8Array图片数据转换为JPG图片网页端JavaScript如何将Unit8Array图片数据转换为JPG图片

      2022年9月17日
      0
    • Element.clientWidth属性

      Element.clientWidth属性内联元素以及没有CSS样式的元素的clientWidth属性值为0。Element.clientWidth属性表示元素的内部宽度,以像素计。该属性包括内边距padding,但不包括边框border、外边距margin和垂直滚动条(如果有的话)。intElemClientWidth是一个整数,表示元素的clientWidth。clientWidth是一个只读属性。…

      2022年7月22日
      17
    • Java集合篇:List总结

      Java集合篇:List总结

      2021年10月4日
      40

    发表回复

    您的邮箱地址不会被公开。 必填项已用 * 标注

    关注全栈程序员社区公众号