ZooKeeper集群脑裂问题,如何解决?

脑裂现象的定义与影响

脑裂(split-brain)是指在分布式系统中,因网络分区或其他故障导致系统被切割成两个或多个相互独立的子系统,每个子系统可能独立选举出自己的领导节点。这一现象在依赖中心领导节点(如Elasticsearch的Master节点或ZooKeeper的Leader节点)的集群环境中尤为常见。当这种情况发生时,原本应该由单一领导节点控制的集群突然出现了多个领导者,导致数据不一致和操作冲突。

脑裂的直接后果是数据一致性的丧失,这对于依赖精确数据来进行操作的系统来说是致命的。例如,银行系统中的账户余额记录如果因为脑裂而不一致,可能导致用户资金被错误处理。此外,资源的浪费也是脑裂的一个重要影响,因为同一操作可能在多个分区中重复执行,消耗大量计算和存储资源。

解决脑裂的策略 

过半原则和领导者选举

为了有效防止脑裂,许多分布式系统采用了“过半原则”进行领导者选举。这一机制要求在选举过程中,候选节点必须获得超过半数节点的支持才能成为领导者。ZooKeeper集群就是采用这种策略,确保即使在网络分区的情况下,也不会有多于一个领导者被选举出来。此外,系统可以通过引入代数概念来帮助在网络恢复后迅速确定当前有效的领导者,避免因“假死leader”而引发的混乱。

场景分析

假设一个ZooKeeper集群由6台服务器组成,分布在两个不同的机房。在ZooKeeper的过半原则下,一个节点要成为Leader,需要获得超过半数节点的支持。因此,对于6台服务器的集群,计算过半数需要的票数为 `half = 6 / 2 = 3`,意味着至少需要4票来成功选举出一个Leader。

1.两个机房网络正常连接时:

所有6台服务器能够互相通信,选举过程中任何一个节点都有机会获得至少4票,从而成功成为Leader

2.两个机房网络断开的情况: 

每个机房内的3台服务器只能在本地进行通信。由于每个机房内的服务器数只有3台,不足以达到过半数4票的要求,因此无法在任一机房内部独立选举出Leader。这种情况下整个集群将没有Leader,从而防止了脑裂情况的发生,因为没有两个不同的Leader同时存在。

3.不对称部署的情况(例如,机房1有3台服务器,机房2有2台服务器): 

① 若网络连接正常,整个集群可以正常选举出一个Leader。

② 若网络断开,机房1内的3台服务器可以通过内部投票选出一个Leader(因为3票已经超过了5台总数的半数,即2.5向上取整为3),而机房2因只有2台服务器,无法独立选举出Leader。这保证了整个集群在任何时候最多只有一个有效的Leader。

心跳检测和辅助通信线路 

心跳检测是监控节点状态的一种有效机制,可以帮助及时发现并处理故障节点。通过定期发送心跳信号,系统可以监控每个节点的响应状态。一旦节点未能在预定时间内回应心跳,系统便可触发故障恢复机制,如重新选举领导者。此外,建立辅助通信线路可以确保在主通信路径出现问题时,节点之间仍能通过备用路径进行通信,维持集群的操作一致性。

使用磁盘锁和仲裁机制

在某些情况下,为了确保集群中只有一个有效的领导者,可以采用磁盘锁或仲裁机制。磁盘锁确保在任何时候,只有一个领导者能够控制对关键资源的访问。仲裁机制则通过引入一个外部决策者来帮助解决集群内部的领导权争议。这个外部决策者可以是一个独立的服务或系统,它根据预设的规则来判断哪个节点应当担任领导者。

ZooKeeper集群节点为什么要部署成奇数

上面讲了过半原则,由于Zookeeper默认采用的就是这种策略,那就带来另外一个问题。集群的数量设置为多少合适呢?而我们所看到的Zookeeper节点数一般都是奇数,这是为什么呢?

首先,只要集群中有过半的机器是正常工作的,那么整个集群就可对外服务。那么我们列举一些情况,来看看在这些情况下集群的容错性。

如果有2个节点,那么只要挂掉1个节点,集群就不可用了。此时,集群对的容忍度为0;

如果有3个节点,那么挂掉1个节点,还有剩下2个正常节点,超过半数,可以重新选举,正常服务。此时,集群的容忍度为1;

如果有4个节点,那么挂掉1个节点,剩下3个,超过半数,可以重新选举。但如果再挂掉1个,只剩下2个,就无法正常选举和服务了。此时,集群的容忍度为1;

依次类推,5个节点,容忍度为2;6个节点容忍度同样为2;

既然3个节点和4个节点、5个节点和6个节点,也就是2n和2n-1的容忍度是一样的,都是n-1。那么,为了节省资源,为了更加高效(更多节点参与选举和通信),为什么不少一个节点呢?这就是为什么集群要部署成奇数的原因。

解决脑裂的常见方法

上面提到了Zookeeper使用的过半原则,这里再把解决脑裂问题的场景方式总结一下。

方法一,Quorums(法定人数)方式

比如3个节点的集群,Quorums = 2,也就是说集群可以容忍1个节点失效,这时候还能选举出1个lead,集群还可用。比如4个节点的集群,它的Quorums = 3,Quorums要超过3,相当于集群的容忍度还是1,如果2个节点失效,那么整个集群还是无效的。这是ZooKeeper防止“脑裂”默认采用的方法。

方法二,添加心跳线

集群中采用多种通信方式,防止一种通信方式失效导致集群中的节点无法通信。

比如,添加心跳线。原来只有一条心跳线路,此时若断开,则接收不到心跳报告,判断对方已经死亡。若有2条心跳线路,一条断开,另一条仍然能够接收心跳报告,能保证集群服务正常运行。心跳线路之间也可以 HA(高可用),这两条心跳线路之间也可以互相检测,若一条断开,则另一条马上起作用。正常情况下,则不起作用,节约资源。

方法三,启动磁盘锁定方式。

使用磁盘锁的形式,保证集群中只能有一个Leader获取磁盘锁,对外提供服务,避免数据错乱发生。但是,也会存在一个问题,若该Leader节点宕机,则不能主动释放锁,那么其他的Follower就永远获取不了共享资源。于是有人在HA中设计了"智能"锁。正在服务的一方只有在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁。平时就不上锁了

方法四,仲裁机制方式。

脑裂导致的后果是从节点不知道该连接哪一台Leader,此时有一个仲裁方就可以解决此问题。比如提供一个参考的IP地址,心跳机制断开时,节点各自ping一下参考IP,如果ping不通,那么表示该节点网络已经出现问题,则该节点需要自行退出争抢资源,释放占有的共享资源,将服务的提供功能让给功能更全面的节点。

以上方式可以同时使用,可以减少集群中脑裂情况的发生,但不能完全保证,比如仲裁机制中2台机器同时宕机,那么此时集群中没有Leader 可以使用。此时就需要人工干预了。

  • 14
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Zookeeper集群脑裂是指集群中的节点在网络通信出现问题时,导致无法达成一致的状态,进而影响数据的一致性。引用中提到了Zookeeper集群中的脑裂问题以及解决方法。 Zookeeper集群中通过部署成奇数个节点来避免脑裂问题的发生。引用指出,只要有过半的机器是正常工作的,整个集群就被视为可用。也就是说,如果集群中有2n+1个节点,那么只要n个节点正常工作,集群就可以正常运行。 尽管Zookeeper集群通过奇数个节点来提高容错能力,但如果在网络通信中发生了问题,仍然可能导致脑裂问题。引用中提到,主要原因是集群和客户端的超时判断无法完全同步,可能出现一前一后的情况。此外,切换后通知各个客户端的速度也可能存在差异。 为了解决脑裂问题Zookeeper采取了一系列措施。具体的解决方法可以在引用中找到。总的来说,Zookeeper会通过leader选举机制选择一个节点作为leader,其他节点作为follower,leader负责处理客户端的请求,并将数据变更广播给follower。当发生脑裂问题时,Zookeeper会尝试重新选举leader,并将集群中的节点切换到新的leader上,以实现数据的一致性。 综上所述,脑裂是指Zookeeper集群中节点在网络通信出现问题时导致无法达成一致的状态。为了解决脑裂问题Zookeeper通过部署奇数个节点和leader选举机制来提高容错能力,并确保数据的一致性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [关于ZooKeeper集群脑裂及其解决方案](https://blog.csdn.net/qq_31960623/article/details/119713311)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值