分布式系统中的网络分区问题

网络分区问题

什么是网络分区?

网络分区只在分布式集群中,节点之间由于网络不通,导致集群中节点形成不同的子集,子集中节点之间网络互通,而子集与子集之间网络不通。

如何判断是否发生了网络分区?

不同的集群架构网络分区的形态会有不同,可以从集中式架构和非集中式架构两方面考虑。

集中式架构下的网络分区

集中式架构中,Master节点通常以一主多备的形式部署,Slave和Master节点相连接,Master节点的主和备之间会通过心跳互相通信。

集中式架构中的网络分区主要是主节点与备节点之间网络不通,且一部分Slave节点只能与主Master节点联通,另一部分只能与备Master节点联通。

非集中式架构下的网络分区

非集中式架构中,节点是对称的,网络分区的形态是形成不同子集,子集内节点间可以互相通信,而子集之间不能通信。

上述两种架构中,要判断是否形成了网络分区,最朴素的方式就是判断节点之间心跳是否超时,然后将心跳可达的节点归属到一个子集中。

网络分区问题的处理方法

在检测到网络分区后,我们可以有不同的解决办法。

  • 激进的办法,一旦发现节点不可达,则将节点从集群中删掉,并在新集群中选出新的主。
  • 保守的办法,一旦发现某些节点不可达,则直接停止自己的服务,这样可以避免双主问题,但是使用这种方式,容易导致系统中所有的节点都停止服务,真个系统完全不可用。

Static Quorum方法

Static Quorum是一种固定票数的策略,在系统启动前,先设置一个固定票数,当发生网络分区后,如果一个分区中节点数大于等于这个固定的票数,则该分区为活动分区。

为了保证分区分区后,不会出现多个活动分区,引发双主或者多主问题,需要对固定票数的取值做一些约束,即:固定票数≤ 总节点数≤2* 固定票数 - 1。

这种方法的优点是简单易实现,缺点是:

  1. 分区数较少时,该方法工作得很好,但是当活动分区特别多时,由于各个分区的票数分散,不容易找出一个满足条件的分区,没有活动分区也就意味着集群不可用了。
  2. 由于票数是固定不变的,所以不适用于集群中有动态节点加入的场景。

Keep Majority方法

Keep Majority是指保留具有大多数节点的子集群。由于不限定每个分区的节点数超过一个固定的票数,所以可以应用于动态节点加入的场景。

这种方法不适用于生产多分区的场景,随着分区数量增加,节点分散,也很难在众多分区中出现1个节点数 w≥n/2 的分区。

仲裁机制方法

设置仲裁机制的核心是引入一个第三方组件或者节点作为仲裁者,该仲裁者和集群中的所有节点相连,集群中所有节点都将自己的心跳信息报这个这个中心节点。因此该中心节点用于全局心跳信息,可以根据全局心跳情况信息判断出有多少个分区。

基于共享资源的方法

基于共享资源方法的核心,就类似于分布式锁机制。即哪个子集群获得共享资源锁,就保留这个子集。

    
出处:http://wing011203.cnblogs.com/
    
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。