2016年6月29日星期三

Architect_023:怎样解决集群的脑裂问题?(摘录+整理)

脑裂问题说的是一个集群如果发生了网络故障,很可能出现一个集群分成了两部分,而这两个部分都不知道对方是否存活,不知道到底是网络问题还是机器宕机了,所以这两部分各自继续服务,即使在网络恢复后,还是会出现两个大脑各自分而治之,而导致整个集群的行为不一致。
解决脑裂有三种方式:
1. 超过半数的法定代表人选举 Leader 制度(Quorums)
2. 集群中采用多种冗余通信方式,防止一种通信方式失效导致集群中的节点无法通信。
3. 共享资源的方式(Fencing),能看到共享资源就表示在集群中,能够获得共享资源的锁的就是 Leader,看不到共享资源的,就不在集群中。

这里只介绍 Quorums。
Quorums 是怎么解决脑裂的问题的呢?
比如 100 个节点组成的集群,按照 Quorums的方式至少要 51 个节点才能保证选出 Leader。
如果网络问题导致分为两个部分,比如 50 个节点和 50 个节点,这样,因为无法选举出 Leader,整个集群是不可用的。
从而避免了脑裂问题。

// TODO 对客户端来说.....

那么为什么使用 Quorums,集群中的节点数为奇数?
回答:因为奇数的节点数组成的集群的容忍度(允许宕机的节点数)更高。
比如 3 个节点的集群,Quorums=2,集群允许 1 个节点失效,这时候还能选举出 Leader,集群还可用,如果2个节点失效,集群失效。
比如 4 个节点的集群,Quorums=3,集群允许 1 个节点失效,这时候还能选举出 Leader,集群还可用,如果2个节点失效,集群失效。
所以 4 个节点的集群的容忍度 = 3 个节点的集群的容忍度,但是 4 个节点的集群多了 1 个节点,相当于浪费了资源。

小结:使用 Quorums,整个集群是否可用,取决于整个集群是否能够选举出 Leader。

参考文献:
1. http://suroot.cn/306.html
2. http://blog.chinaunix.net/uid-20726500-id-5473292.html

没有评论: