集群和脑裂_为什么集群都是奇数台机器?集群中的脑裂问题白话理解

今天在部署的问题上与同事发生了点不同的意见,偶数台机器,同事说因为redis选举要奇数台机器,

不能部署? 纳尼? 不可能啊...redis,咋不能偶数台部署...

印象中redis自组集群,几台都可以的吧,但是一般都建议奇数台机器做集群,是这样的:

redis只能是奇数个节点。这是一种错误的说法,Redis只不过是推荐奇数个节点,从来没有过必须是奇数节点的说法,那么这是为什么呢?

为什么redis推荐奇数个节点:其主要原因还是从成本上考虑的,因为奇数个节点和偶数个节点允许宕机的节点数是一样的,比如3个节点和4个节点都只允许宕机一台,那么为什么要搞4个节点去浪费服务资源呢?那么话又说回来了,为什么三个节点和四个节点都只允许宕机一个节点呢?这是因为redis规定集群中,半数以上,也就是投票获得比重超过百分之50的节点认为主节点故障了,才会选举新的节点。

举个例子:

集群和脑裂_为什么集群都是奇数台机器?集群中的脑裂问题白话理解

集群和脑裂_为什么集群都是奇数台机器?集群中的脑裂问题白话理解

​编辑

比如有3个节点,他们的比重分别是33.33%,100/3 对吧,那么如果 A节点down掉了,

那么这个时候选举:

1.如果B投票给自己,C投票给自己,那么B占有比重还是33.33的票,C还是33.33的票,没有一台机器比重是超过百分之50的,需要重新选举

2.如果B,C都投给对方,那么各自还是33.33的票,没有一台机器比重是超过百分之50的,需要重新选举

3.如果B投给自己,C投给B ,那么B的比重就是33.33+33.33 >50了,所以B成为新的主机,系统恢复

4.如果C投给自己,B投给C,那么C的比重就是33.33+33.33>50了,所以C就成为了新的主机,系统恢复

所以说可以看到,只要是多选举几次,总能找到一个新的主机.就那么几种组合对吧.

上面是3台的情况.可以看到3台机器,只允许1台宕机,如果2台宕机,就无力回天了.

如果4台呢?

集群和脑裂_为什么集群都是奇数台机器?集群中的脑裂问题白话理解

集群和脑裂_为什么集群都是奇数台机器?集群中的脑裂问题白话理解

​编辑

可以看到如果是4台,我们分成2种情况分析,

如果 只有一台机器宕机,比如A宕机了.那么选举情况:

首先要知道A,B,C,D的比重都是百分之25对吧 100/4 =25

1.B和C和D都投给自己,那么各自占比25%,没有一台机器满足比重超过百分之50的约定,需要重新选举

2.B和C和D都投给对方,各占比25%%,没有一台机器满足比重超过百分之50的约定,需要重新选举3.C和D投给了B,B投给了C。这个时候B占比50%,C占比25%。还是没有一台机器满足比重超过百分之50的约定,需要重新选举4.C和D投给了B,B投给了自己,B占比75%。这个时候B机器被选举为主节点,整个系统恢复正常

还有其他情况,排列组合而已自己考虑一下.

然后还有一种情况:

如果宕机了两台机器:

那么:坏了两个节点如果是A和B坏了,剩下的C和D投票最多只能投到50%。没有一台机器满足比重超过百分之50的约定,需要重新选举,所以他会不停的选举,系统始终不能恢复正常.

可以看到,不管是3台奇数台机器,还是4台偶数台机器,组成的集群,都是只允许1台机器宕机,系统才能有恢复的可能,否则系统就永远选举,不能恢复,那么,既然奇数,偶数台都是只能允许一台机器宕机,

那么为什么还要用偶数台呢?省下一台就省下一台的钱啊...哈哈,对就是这样,所以,推荐是推荐奇数台构成集群的..

其实这里还有个公式:就是:

就是说 N/2 这里N表示集群中有N台机器,那么

1.集群中有1台机器,那么如果1台机器宕机那么也就是

1-1 > 1/2 我们带入公式,发现不满足,那么说明不能组成集群,如果宕机一台机器,集群永远无法通 过选举机制恢 复

2.集群中有2台机器,那么如果1台机器宕机那么也就是

2-1 > 2/2 我们带入公式,发现不满足,那么说明不能组成集群,如果宕机一台机器,集群永远无法通 过选举机制恢 复

3.集群中有3台机器,那么如果1台机器宕机那么也就是3-1 > 3/2 我们带入公式,发现满足,那么说明这个时候就可以组成集群,如果宕机一台机器,集群通 过选举机制可以恢复正常.

节点数 (宕机后) 					    是否满足公式
      1-1        > 1/2   ??    		     no
      2-1        >2/2    ??      		 no
      3-1        >3/2   ??				yes
      4-1        >3/2   ??               yes


三个几点最多能宕机    1台(3-1>3/2    3-2>3/2不满足)
四个几点最多能宕机    1台  (4-1>4/2    4-2>4/2 不满足)

集群和脑裂_为什么集群都是奇数台机器?集群中的脑裂问题白话理解

可以看到,上面3,台机器集群,和四台机器集群,都是只能允许1台机器宕机,1台机器宕机后,3台机器组成的集群和4台机器组成的集群,都可以自己通过选举机制进行恢复.

好的,明白了上面的内容,然后再来看脑裂:

脑裂现象,是指在多机房(网络分区)部署中,若出现网络连接问题,形成多个分区,则可能出现脑裂问题,会导致数据不一致。(严重故障,违反实现一致性原则)

脑裂:在主从集群中,同时有两个主节点他们都能接收写请求。而脑裂最直接影响的就是客户端不知道往哪个主节点写入数据,结果就是不同的客户端往不同的主节点写入数据。而且严重的会导致数据丢失。

我们知道,在集群中读是所有的集群中的机器都可以提供读服务的,但是写只能由主机,决定怎么去写入数据,集群中一般都是有一个主机,多个从机的,如果集群中有了2个主机,那么来了新数据,到底是往哪里写呢?听哪一个主机的呢? 这个时候就好像出现了2个大脑,一个大脑说,往A机器写数据,一个大脑说往B机器写数据,这就是所谓的脑裂.

来理解一下脑裂吧,下面的例子也不是特别贴切,但是可以解释:

集群和脑裂_为什么集群都是奇数台机器?集群中的脑裂问题白话理解

集群和脑裂_为什么集群都是奇数台机器?集群中的脑裂问题白话理解

​编辑

比如有3个机房里他们相互通信,然后机房A做为主机,机房B,C做为从机,如果上面左边网络连接断了,这个时候B,接受不到主机A的消息了就认为A宕机了,这个时候发出选举请求给C,但是C这个时候,还可以跟A进行通信,这个时候C不会接受B,发来的选举请求,B自己进行选举,不会达成,某个机器获得票的比重达到超过百分之50的情况.比如,A,B,C都占有33.33的比重, 100 /3 =33.33

如果A断了,那么B投给自己,B是33.33 C是33.33不能重新选举成功,如果B投给C,注意B只能投给C,因为和A的通信断了,如果投给C,但是C会拒绝,因为C认为还是有主机的,因为C跟主机没有断,所以

这时候出现B,一直想进行选举,但是C一直拒绝,这个时候B不能提供服务,但是A和C 可以一直提供服务不会出现脑裂.

集群和脑裂_为什么集群都是奇数台机器?集群中的脑裂问题白话理解

集群和脑裂_为什么集群都是奇数台机器?集群中的脑裂问题白话理解

​编辑

如果B,C和A都断了呢?

这个时候,B,C就会投票选举了,B发送选举请求给C,C也会接受,C发送选举请求B也会接受,那么

肯定会存在,B投票给自己,C投票给B这样的情况,这样就会产生一个新的主机,在B和C之间.

那么因为主机A,现在断开了所以A可以提供读服务,如果这个时候有写请求到A,那么A,因为网络断开的原因要通过选举找到新的主机,那么这个时候,因为网络断开无法进行选举,无法满足投票比重超过百分之50的情况,也就是A怎么投票也不会让,A,B,C某个获得超过百分之50的比重的票,因为A,已经

没办法给B,C投票了.投给自己的话,始终都是33.33的比重.

但是B,C可以通过投票产生一个新的主机,并且,B,C又组成了一个新的集群,也有自己的leader,那么

这个时候,A,B,C就相当于出现了2个主机,A原来的主机,还有,B或者是C,新选举的主机,这个时候就脑裂了,写请求来了B,C这个集群后,可以正常写入,而写请求如果到了A,虽然A能接收,但是不能选举找到新的leader所以它只能拒绝写入,但是B,C的写入的数据,又无法和A进行同步,所以就导致,数据

出现不一致了..

这个就是脑裂的理解...

而如果集群的机器个数是偶数的话,比如4个,那么选举的时候不容易出现投票过半数的情况,因为有很多情况可能是,正好是百分之50.所以更容易出现脑裂.

而奇数的集群的话,选举出现过半数的情况,就是肯定会出现一次选举,超过百分之50,所以不会出现脑裂.所以集群的话一般是建议奇数台机器的.