Redis哨兵核心选举算法-通过开车理解quorum和majority的意义

楔子:刚好在整Redis缓存高可用,阿汤哥的一句话Redis哨兵集群只有2个节点无法正常工作把俺给说晕了,网上也没找到比较通俗易懂的文章,所以自己理解了一下哨兵选举算法,为啥两个结点就是一个死局?。才疏学浅有错误的地方还望指出,多多包涵

一、类比开车举报算法

1.1、假如kitty萌新来到了一个不允许开车的世界,人们互相监督其他人是不是在开车,最开始大家都没有证据

假如一旦确认为了周某开车了,并且有了证据,那么我们将对这个老司机判刑,但是还是需要人民在法院投票确定是否周某犯了开车罪,所有人民同时拥有举报和投票的权利,但是如果你被举报,你将剥夺投票自己是否入刑的权利(总不能说我认为我没开车嘛

当然,我们假设这个世界只要有人民指出一个人在开车我们就可以说有证据了,就可以交往法院裁决,由人民投票,假如这个世界有n个人.
那么问题来了,多少个人举报才算有证据,多少人投票同意判刑周某才能入狱
于是这个世界的老大在《不允许开车法》中写入一下几条
(首先给出一些定义,n表示世界总人数,quorum代表举报周某开车的人数,majority代表大多数人-可以理解为这个值代表了大多数人民的选择-在n确定的时候为定值)

1
2
3
4
5
6
7
8
9
1、首先quorum一定要大于等于1
2、如果quorum<majority,那么法院投票同意入刑的人要多于majority才能入刑
3、如果quorum>=majority, 那么需要法院投票同意入刑的人要多于quorum才能入刑
4、majority取值如下:
n= 2,majority=2
n= 3,majority=2
n= 4,majority=2
n= 5,majority=3
......

我们来讨论一下这三条
1、第一条肯定是没问题的,必须要有人举报才能送温暖嘛
2、第二条意思就是如果是少数人举报周某开车,那么需要大多数人投票入刑才能生效、
3、第三条就是如果举报的人数已经多与了国家的majority都认为周某开车,那么仅仅是majority投票法院是不够的,可能是因为入刑生效是严肃的,具体细节去问那个世界的扛把子
4、这个算法其实类似于(n+1)/2向下取整,但是除了2个人的时候,法律就是法律吧。

1.2、所以现在模拟两个场景

场景1、这个世界只有两个人,A举报B开车是否有效

分析:

  • 这个环境中n=2,majority=2,quorum=1(世界人数2,根据法律majority人数为2,只有A一个人举报了B所以quorum=1
  • 因为quorum>0,所以举报生效
  • 根据规则quorum<majority,所以需要majority(2)个人投票有罪
  • 但是现在只有A一个人拥有投票权限,所以无效
场景2、假如这个世界有三个人,A,B,C中有人举报了C开车,并且A,B都愿意将C投票入狱

分析1:假如A,B中有一个人举报了C

  • 这个环境中n=3,majority=2,quorum=1(世界人数2,根据法律majority人数为2,有一个人举报了C所以quorum=1
  • 因为quorum>0,所以举报生效
  • 根据规则quorum<majority,所以需要majority(2)个人投票有罪
  • 现在有A,B两个个人拥有投票权限,所以投票有效

分析2:假如A,B中两个人都举报了C

  • 这个环境中n=3,majority=2,quorum=2(世界人数2,根据法律majority人数为2,两个人都举报了C所以quorum=1
  • 因为quorum>0,所以举报生效
  • 根据规则quorum>=majority,所以需要quorum(2)个人投票有罪
  • 现在有A,B两个个人拥有投票权限,所以投票有效

(以上则是经典的Redis三节点哨兵集群

二、Redis哨兵核心选举算法分析(严肃脸

这个需要先了解Redis主从架构,如果您还不熟悉,可以先移步Redis主从架构以及vm-centOS-7-minimal版本网络配置小记

2.1、哨兵的主要功能如下

1
2
3
4
5
6
7
(1)集群监控,负责监控redis master和slave进程是否正常工作

(2)消息通知,如果某个redis实例有故障,那么哨兵负责发送消息作为报警通知给管理员

(3)故障转移,如果master node挂掉了,会自动转移到slave node上

(4)配置中心,如果故障转移发生了,通知client客户端新的master地址

2.2、Redis哨兵核心知识

(1)哨兵至少需要3个实例,来保证自己的健壮性

(2)哨兵 + redis主从的部署架构,是不会保证数据零丢失的,只能保证redis集群的高可用性

(3)对于哨兵 + redis主从这种复杂的部署架构,尽量在测试环境和生产环境,都进行充足的测试和演练

2、3:sdown和odown两种宕机

sdown和odown两种失败状态

sdown是主观宕机,就一个哨兵如果自己觉得一个master宕机了,那么就是主观宕机 。

odown是客观宕机,如果quorum数量的哨兵都觉得一个master宕机了,那么就是客观宕机 。
sdown达成的条件很简单,如果一个哨兵ping一个master,超过了is-master-down-after-milliseconds指定的毫秒数之后,就主观认为master宕机 。

sdown到odown转换的条件很简单,如果一个哨兵在指定时间内,收到了quorum指定数量的其他哨兵也认为那个master是sdown了,那么就认为是odown了,客观认为master宕机 。

在这里宕机可以类比于上面的开车了

2.4、quorum和majority

算法中的核心参数,如果看了上面的类比就很容易理解,quorum表示认为某机子宕机的哨兵数量(举报开车的人数),majority表示授权进行主从切换的最少的哨兵数量(最少投票入刑的人数) 。

2.5、主备切换工作

1、首先至少一个哨兵认为某机宕机了
2、如果quorum < majority,那么最少majority个哨兵授权就可以执行切换
3、如果quorum >= majority,那么必须quorum数量的哨兵都授权才能执行切换
4、majority取值如下:
n= 2,majority=2
n= 3,majority=2
n= 4,majority=2
n= 5,majority=3
你会发现这个规则和上面的开车判断一模一样

问题回答阿汤哥:为什么Redis哨兵集群只有2个节点无法正常工作?

和场景1一模一样,A哨兵,举报了B机

  • 这个环境中n=2,majority=2,quorum=1(2机子,根据规定majority为2,只有A举报了B所以quorum=1
  • 因为quorum>0,所以举报生效
  • 根据规则quorum<majority,所以需要majority(2)授权
  • 但是现在只有A台机拥有授权权限,所以无效

那么为什么三台以上就行呢,自己看场景2吧。

ps:从Redis经典三节点哨兵集群看得出来,最少3个人才拥有维持规矩的基础,如果最后只剩下2个人,那么规则系统必定崩塌