zookeeper脑裂问题研究

zookeeper脑裂问题研究

 

  1. 什么是脑裂?

脑裂(splite-brain)就是“大脑分裂”,也就是本来一个“大脑”被拆分成了两个或多个“大脑“。

脑裂通常会出现在集群环境中,比如Zookeeper集群,而这些集群环境有一个同一个的特点,就是它们有一个大脑,zookeeper集群有Leader节点。

  1. 出现情况

 

左边右边一分为二,产生两个集群,出现了两个大脑,这就是脑裂。

 

要解决Split-Brain的问题,一般有3种方式:

Quorums(ˈkwôrəm 法定人数) ,比如3个节点的集群,Quorums = 2, 也就是说集群可以容忍1个节点失效,这时候还能选举出1个lead,集群还可用。比如4个节点的集群,它的Quorums = 3,Quorums要超过3,相当于集群的容忍度还是1,如果2个节点失效,那么整个集群还是无效的
采用Redundant communications,冗余通信的方式,集群中采用多种通信方式,防止一种通信方式失效导致集群中的节点无法通信。
Fencing, 共享资源的方式,比如能看到共享资源就表示在集群中,能够获得共享资源的锁的就是Leader,看不到共享资源的,就不在集群中。

  1. zookeeper中的解决方案

ZooKeeper默认采用了Quorums这种方式,即只有集群中超过半数节点投票才能选举出Leader。这样的方式可以确保leader的唯一性,要么选出唯一的一个leader,要么选举失败。内部选举算法默认使用FastLeaderElection选举策略,QuorumVerifier使用QuorumMaj,进行选举。意思就是说 只有当集群内节点超过半数存活并且当前节点得到超过半数的票(包括自己)才可以选举出leader。

Quorums有2个作用:

集群中最少的节点数用来选举Leader保证集群可用
通知客户端数据已经安全保存前集群中最少数量的节点数已经保存了该数据。一旦这些节点保存了该数据,客户端将被通知已经安全保存了,可以继续其他任务。而集群中剩余的节点将会最终也保存了该数据。
假设某个leader假死,其余的followers选举出了一个新的leader。这时,旧的leader复活并且仍然认为自己是leader,这个时候它向其他followers发出写请求也是会被拒绝的。因为每当新leader产生时,会生成一个epoch,这个epoch是递增的,followers如果确认了新的leader存在,知道其epoch,就会拒绝epoch小于现任leader epoch的所有请求。那有没有follower不知道新的leader存在呢,有可能,但肯定不是大多数,否则新leader无法产生。Zookeeper的写也遵循quorum机制,因此,得不到大多数支持的写是无效的,旧leader即使各种认为自己是leader,依然没有什么作用。

 

  1. 客户端脑裂

还有一种情况是当zookeeper集群因为网络问题,心跳超时,造成leader假死,此时集群内其他节点认为leader挂了,重新选举出新的leader,这个时候网络恢复正常,在短暂的时间内有可能会存在新老两个leader,如果这个时候,有客户端恰好连接在老leader上,并且客户端在zookeeper集群切换通知各个客户端之前发生操作,就有可能会出现数据不一致的情况。

这种情况需要leader节点与Zookeeper集群网络断开,但是与其他集群角色(比如客户端)的网络没有问题,还要满足以上情况。

解决方式:

增加心跳线: 当当前节点与任意两个节点不通时,根据所设置策略(10次以上或者什么什么),触发以后,将当前节点停止,释放相关资源,并重启。(此方案风险较大,待评估)

  1. 部署方案

3机房5节点。采用2 2 1 节点的方式部署。最大限度上增加集群可用性。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值