过半机制
在ZooKeeper中只有超过半数节点在工作,集群才能正常提供服务,节点只有获得超过半数节点支持才能成为领导者。
超过半数是大于半数,而不是大于等于半数。如果集群有5个节点,最多允许有2个节点处于离线,余下的3个节点超过半数,集群可以继续工作。如果集群有6个节点,同样最多允许2个节点失效,因为只有存活4个节点才会超过半数,集群正常工作。那么5个节点和6个节点的集群都最多允许2个节点失效,从节约资源角度当然选择5个节点部署集群。所以在ZooKeeper集群中节点一般选择奇数个。
假死
由于网络或者其他原因,集群认为领导者节点不能提供服务,而实际上领导者仍旧活着,这样的领导者就是处于假死。
脑裂
当集群中其他节点发现领导者不能提供服务时,会修改自己的状态从FOLLOWING到LOOKING,尝试选举新的领导者。某个结点如果获得超过半数节点的支持就会成为新的领导者,这时假如旧的领导者又重新与集群产生联系,集群中就会存在两个领导者,这种情况称为脑裂,顾名思义,原本有一颗大脑,现在像裂开一样,变成了两颗。
如何解决脑裂或者假死呢?
ZAB协议,可参考ZooKeeper的一致性协议ZAB
- 如果只有领导者出现假死,余下的节点就认为领导者已经离线,立刻开始选举新的领导者,之后当旧的领导者再次加入到集群中,因为广播提议的zxid已经使用了新的纪元,旧的领导者发送的提议会被其他节点拒绝,不会得到执行。旧的领导者将作为新的领导者的追随者继续提供服务。
- 领导者和同机房的节点一起与其他机房的节点失去联系,这时集群中所有的节点相当于被分为两部分,至多有一部分的节点数量超过半数(或者两部分都正好一半,不满足过半原则,集群不能提供服务)。超过半数节点的那部分根据过半机制是有可能产生新的领导者,而少于等于一半节点的那部分是不会选举成功新领导的(而且因为节点总数不满足过半机制,是不可以单独提供服务的)。
从上面可以看出,无论领导者是假死还是真的挂掉了,ZooKeeper集群运用ZAB协议的广播和选择两个模式(提议的zxid和过半机制)可以最大限度避免出现脑裂的情况,即使出现脑裂旧的领导者也无法再提供写服务,因为不够半数同意,另外旧领导者与集群断开连接,大概率也无法提供客户端的访问,所以在ZooKeeper中要么选举出唯一的领导者,要么法定人数不够选举失败,并且旧的领导者重新加入集群,由于已经改朝换代使用新的纪元,旧领导者不再是领导者了。
网友评论