分布式集群中网络分区问题

article/2025/10/11 6:31:55

分布式集群中网络分区问题

  • 前言
  • 如何判断是否发生了网络分区?
    • 集中式架构的网络分区形态
    • 非集中式架构中的网络分区形态
  • 网络分区最微妙的地方在哪里?
  • 网络分区出现概率较高的场景是什么?
  • 网络分区有哪些常见的处理方法?
    • 方法一:通过 Static Quorum 处理网络分区
    • 方法二:通过 Keep Majority 处理网络分区
    • 方法三:通过设置仲裁机制处理网络分区
    • 方法四:基于共享资源的方式处理网络分区
  • 总结


前言

网络分区就是其中的一种故障类型。

通常情况下,网络分区指的是在分布式集群中,节点之间由于网络不通,导致集群中节点形成不同的子集,子集中节点间的网络相通,而子集和子集间网络不通。网络分区是子集与子集之间在网络上相互隔离了。

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

在分布式集群中,不同的集群架构网络分区的形态略有不同。要判断是否发生了网络分区,需要弄清楚不同的分布式集群架构,即集中式架构和非集中式架构中的网络分区形态是什么样的。

集中式架构的网络分区形态

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

以 Master 节点主备部署为例,如下图所示,集中式架构中的网络分区主要是主节点与备节点之间网络不通,且一部分 Slave 节点只能与主 Master 节点连通,另一部分只能与备 Master 节点连通。

在这里插入图片描述

非集中式架构中的网络分区形态

如下图所示,非集中式架构中,节点是对称的,因此网络分区的形态是形成不同子集,子集内节点间可互相通信,而子集之间的节点不可通信。比如,子集群 1 中 Node1、Node2 和 Node4 可以相互通信,子集群 2 中 Node3 和 Node5 也可以相互通信,但子集群 1 和 子集群 2 之间网络不通。

在这里插入图片描述

从集中式和非集中式这两种分布式集群架构的网络分区形态可以看出,要判断是否形成网络分区,最朴素的方法就是判断节点之间心跳是否超时,然后将心跳可达的节点归属到一个子集中

由于非集中式系统中,每个节点都是对等的、提供的服务相同,所以当多个子集群之间不可达,或部分节点出现故障后,尽管提供的服务质量(SLA)可能会下降,但并不影响这些剩余节点或子集群对外提供服务。所以,重点是集中式系统的网络分区问题

网络分区最微妙的地方在哪里?

在工作和生活中遇到一个问题,本能反应估计是有问题就解决问题好了。而网络分区最微妙的地方在于,很难通过程序去判断问题到底出在哪里,而只能通过心跳等手段知道部分节点的网络不可达了。

但导致节点不可达的原因有很多,有可能是网络的原因,也有可能是节点本身的问题。无法通过一些症状就判断出是否真的产生了分区。也很难通过程序去判断这个问题是不是很快就会被恢复。这也是应对网络分区问题最微妙的地方。

网络分区出现概率较高的场景是什么?

网络分区肯定是就同一个集群而言的。对于不同集群来说, 正是因为集群间本就没有太多的交互,才需要从逻辑上分割成不同的集群,这些逻辑上不同的集群本就是可以独立对外提供服务的。

当集群跨多个网络时,容易出现网络分区的情况, 比如一个业务集群部署在多个数据中心时。所以,集群跨多网络部署时,就是网络分区出现概率较高的场景。

网络分区有哪些常见的处理方法?

假如采用一种非常激进的方式去处理,即一旦发现节点不可达,则将不可达节点从现有集群中剔除,并在这个新集群中选出新的主。

以图 1 所示集中式集群为例,当备 Master、Slave3 和 Slave4 节点检测到主 Master、 Slave1 和 Slave2 节点不可达时,剔除这些不可达节点后,备 Master 升主,连同 Slave3 和 Slave4 节点组成一个新的集群。

如果不可达是由于节点故障导致的,那么这种策略没有任何问题。这些剩余节点组成的集群可以继续对外提供服务。但如果不可达是因为网络故障引起的,那么集群中的另一个子集,即主 Master、Slave1 和 Slave2,也会采用同样的策略,仍然对外提供服务。这时集群就会出现双主问题了。

假如采用一种保守的方式去处理,即节点一旦发现某些节点不可达,则直接停止自己的服务。这样确实解决了双主的问题,但因为不同分区之间的不可达是相互的,且所有的分区都采取了这种停服策略,就会导致系统中所有的节点都停止服务,整个系统完全不可用。 这显然也不是我们想看到的。

当系统中出现节点不可达后,不出现双主的情况下,四种均衡的网络分区处理方法,即 Static Quorum、Keep Majority、设置仲裁机制和基于共享资源的方式。

方法一:通过 Static Quorum 处理网络分区

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

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

这个策略的优点是,简单、容易实现,但却存在两个问题:

  • 对于分区数比较少的时候,比方 2 个分区时,该策略很容易选出一个唯一的活动分区。但是,当活动分区非常多的时候,由于各个分区的票数分散,不容易找到一个满足条件的分区,没有活动分区也就意味着整个集群不可用了。
  • 由于固定票数是固定不变的,所以不适用于集群中有动态节点加入的场景。

方法二:通过 Keep Majority 处理网络分区

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

假设,集群数为 n,出现网络分区后,保留的子集群为节点数 w≥n/2 的集群。为防止出现双主或两个集群同时工作的情况,通常将集群总节点数 n 设置为奇数。

若集群总数为偶数,比如图 1 集中式架构的例子中,子集群 1 和 2 都包含 2 个 Slave 节点,就会导致两个子集群同时存活,在业务场景只允许一个主的情况下,会导致业务运行不正确。

如果集群总节点数为偶数,两个子集群节点数均为总数一半时,可以在 Keep Majority 的基础上,叠加一些策略,比如保留集群节点 ID 最小的节点所在的子集群。如图 1 所示,假设集群节点总数为 6,现在因为网络故障形成网络分区子集群 1{主 Master,Slave1, Slave2}和子集群 2{备 Master,Slave3, Slave4},假设 Slave1 是 ID 最小的节点,那么此时要保留包含 Slave1 的子集群 1。

虽然 Keep Majority 方法可以解决动态节点加入的问题,但也不适用于产生多分区的场景。因为随着分区数增多、节点分散,也难以在众多分区中出现一个节点数 w≥n/2 的分区。

集群跨多个网络部署时更容易产生网络分区,因此不推荐采用 Static Quorum 和 Keep Majority 方法去处理跨多网络集群的网络分区问题。

方法三:通过设置仲裁机制处理网络分区

设置仲裁机制的核心是,引入一个第三方组件或节点作为仲裁者,该仲裁者可以与集群中的所有节点相连接,集群中所有节点将自己的心跳信息上报给这个中心节点。因此,该中心节点拥有全局心跳信息,可以根据全局心跳信息判断出有多少个分区。当出现网络分区后,由 仲裁者确定保留哪个子集群,舍弃哪些子集群。

如下图所示,假设引入 Node0 作为第三个节点,该节点 IP 为 10.12.24.35,当出现网络分区子集群 1{Node1, Node3}和子集群 2{Node2, Node4}时,每个子集群中选择一个 Leader 节点并 ping 一下 Node0 的 IP,能 ping 通则保留,否则舍弃。比如下图中,子集群 1 可以 ping 通,子集群 2 ping 不通,因此保留子集群 1。

在这里插入图片描述

方法四:基于共享资源的方式处理网络分区

分布式锁是实现多个进程有序、避免冲突地访问共享资源的一种方式。

基于共享资源处理网络分区的核心,类似于分布式锁的机制。哪个子集群获得共享资源的锁,就保留该子集群。获得锁的集群提供服务,只有当该集群释放锁之后,其他集群才可以获取锁。

这种方式的问题是,如果获取锁的节点发生故障,但未释放锁,会导致其他子集群不可用。 因此,这种方式适用于获取锁的节点可靠性有一定保证的场景。

基于仲裁和共享资源的网络分区处理方法,都是依赖一个三方的节点或组件,借助这个第三方来保证系统中同时只有一个活动分区。所以,这两种处理方法适用于有一个稳定可靠的三方节点或组件的场景。

总结

网络分区的处理方法本质是在产生分区后,选出一个分区,保证同时最多有一个分区对外提供服务。基于此的四种常见的处理方法,包括 Static Quorum、Keep Majority、设置仲裁机制和基于共享资源的方式。

  • 基于 Static Quorum 的方法,因为涉及固定票数策略,所以不适用于处理多个分区,以及有动态节点加入的场景;
  • 基于 Keep Majority 的方法,可以解决动态节点场景下分区问题,但因为要求子集群节点数≥1/2 总节点数,所以也不适用于处理多个分区的情 况;
  • 基于仲裁和共享资源的网络分区处理方法,其实都是依赖一个三方的节点或组件,所以适用于有一个稳定可靠的三方节点或组件的场景。

http://chatgpt.dhexx.cn/article/xO4ixwmV.shtml

相关文章

网络:分布式和网络的区别

单机结构 我想大家最最最熟悉的就是单机结构,一个系统业务量很小的时候所有的代码都放在一个项目中就好了,然后这个项目部署在一台服务器上就好了。整个项目所有的服务都由这台服务器提供。这就是单机结构。 那么,单机结构有啥缺点呢&#…

分布式专题(一)什么是分布式

什么是分布式? 任务分解节点通信 分布式和集群的关系? 电商平台: 用户、 商品、订单、 交易 分布式: 一个业务拆分成多个子系统,部署在不同的服务器上 集群: 同一个业务,部署在多个服务器…

分布式系统与网络分区

在OpenStack中,数据库是主要系统“状态”的主要来源。大部分Core Projects都使用传统关系型数据库作为系统数据和状态的存储,另外如Ceilometer使用了MongoDB,还有其他Incubator Projects使用了Redis作为队列或者状态存储。数据库给OpenStack提…

分布式架构网络通信

在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、Hessian、SOAP、ESB和JMS等,它们背后到底是基于什么原理实现的呢 1、基本原理 要实现网络机器间的…

企业分布式网络监控

IT 基础架构已成为提供基本业务服务的基石,无论是内部管理操作还是为客户托管的应用程序服务。监控IT基础设施至关重要,并且已经建立。SMB IT 基础架构需要简单的网络监控工具来监控性能和报告问题。通常,几个 IT 管理员配置网络设备、防火墙…

分布式网络通信框架(一)——集群和分布式

单机聊天服务器 缺点: 受限于硬件资源,服务器所能承受的用户并发量不够大; 任意模块修改,都会导致整个项目代码重新编译、部署; 系统中,有些模块是CPU密集型,有些是IO密集型,造成…

传统分布式网络架构

在同一个自治系统内,当主机A要和A主机B通讯时,需要把发给主机B的数据包先发给网关路由器A,路由器A根据路由表决定数据包下一跳发给路由器B或C,根据IP报文内携带的目的地址11.8.9.12,在路由表中查找最长匹配路由表项&am…

分布式网络基础

在分布式服务化架构设计中,服务与服务之间通信均是基于网络底层协议来实现的,于是我们需要对网络相关基础知识有一个基本的认知,这样在我们服务与服务之间进行通信(跨进程通信)过程能够在我们的脑图形成一个基本的数据传输流程以及其中的细节问题,这样对于我们在进行网络问题的…

服务计算 -- 搭建私有云

服务计算 – 搭建私有云 文章目录 服务计算 -- 搭建私有云下载VirtualBox及所需镜像安装虚拟机配置虚拟机存储位置创建虚拟机内部虚拟网络创建Base虚拟机(Centos为例)链接复制第二台虚拟机 远程桌面访问虚拟机安装图形化界面 下载VirtualBox及所需镜像 …

搭建自己的私有云盘

一、准备工作 centos8,nextcloud,mysql 二、安装docker(官方文档) $ yum install -y yum-utils $ yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo $ yum install -y https://dow…

OwnCloud私有云服务搭建教程

OwnCloud是一款开源的存储云,其作用可以像百度网盘那样存放文件到这个云当中,只要能连上网,手机,平板,电脑都可以从中下载或者上传文件,用起来非常不错,部署的过程也很简单,废话不多…

如何搭建个人私有云盘

前言 文章首发于Noah Sun’s Home 如何搭建个人私有云盘 市场上有很多云盘的产品,比如百度云盘,不过本教程主要目的是要搭建个人私有云盘。查了网上很多资料,个人云盘也有很多,比如nextcloud,owncloud,sea…

服务器上搭建私有云--owncloud

国内云盘太垃圾,各种box又要翻墙,有自己的服务器的朋友不如搭建一个自己的私有云,再也不会有任何限制。私有云的平台有seafile、owncloud等,这里我选择了owncloud。 owncloud的搭建极其简单,官方有提供一键搭建包 ht…

阿里云服务器搭建私人云盘

1、配置安全组端口 新建安全组并开放以下端口 2、利用 Git 来搭建私人云盘 1、利用 Workbench 点击立即登录 进行远程连接 2、安装 docker 容器 docker 是一款开源的容器运行工具,提供了一套便捷的服务打包、分发、部署方式。我们将要部署的服务就是通过 docker …

搭建 ownCloud 私有云教程

Nginx ownCloud PHP MySQL搭建私有云 OwnCloud概述: OwnCloud是一个开源免费专业的私有云存储项目,它可以帮你快速的在个人电脑或者服务器上假设一套专属的私有云文件同步网盘,也可以像百度网盘一样实现文件跨平台同步,共享等…

手把手教你搭建owncloud私有云平台

本来想把标题定为“基于LAMP的owncloud服务器搭建教程”,想了想,如果这么定的话,怕是都没人来看,岂不是自己砸了自己的“招牌”,废话不多说下面开始进入正文。 引言 搭建私有云的初衷不需要再花过重的篇幅去强调&#…

教你如何一招打通「公有云、私有云」,快学起来

数据灾难年年有 一不小心 下一个受害者就是你 当灾难来临时 才会发现备份的重要性 借助群晖NAS 使用 Cloud Sync 就可以将公有云上的数据 自动同步到本地 NAS 上 当然也可以将本地的文件 进行自动上传 使你的数据双倍安全 我们所支持的网盘类型如下: 本次…

私有云服务器搭建教程(保姆级)——台式电脑+ubuntu+docker+nextcloud+mysql+花生壳内网穿透

前言 随着移动互联网的发展,越来越多的人使用云网盘存储他们的文档、照片、视频等文件。不知从什么时候起,我们不知不觉开始为享受云存储的服务付费买单。一次上传,随处访问,越来越成为人们的日常需求。随之而来的是各云网盘每月…

搭建私有云的4大主流方案

随着云计算和移动办公大潮的到来,iPad、智能手机等家庭联网设备不断增多,以及搭载小容量SSD笔记本电脑的流行,能够跨平台分享的个人云服务需求不断增长;而今天的个人云服务也已经极大丰富,从2TB的百度网盘到商务人士中流行的Dropb…

阿里云虚拟私有网络的搭建及MySQL安装方式

一、阿里云虚拟私有网络的搭建 由于安全机制,无法上传,功能服务均已实现 二、通过编译、二进制安装MySQL5.7 2.1 编译安装 yum install cmake gcc gcc-c ncurses-devel bison zlib libxml openssl automake autoconf make libtool bison-devel liba…