2023年伊始,南京鹏云网络科技有限公司(简称:鹏云网络)正式宣布开源ZettaStor DBS分布式块存储系统,开放了自研10年的分布式块存储技术,其中包含了数项鹏云网络几年来自主研发的创新代码与解决方案,这些技术均已取得国家专利认证。
点击查看详情:鹏云分布式块存储系统正式开源,下载即可体验成熟技术
随着业务的快速发展,业务的复杂性越来越高,目前大部分企业都在从集中式走向分布式。对于采用分布式系统的企业而言,系统出现数据丢失与损坏的情况是非常严重的,极易影响业务系统的正常稳定运行。其中,可能引起数据丢失的“脑裂(split-brain)”就是分布式系统中常会发生的问题。
一套大规模的分布式系统往往由大量的组组成,组又由来自不同机器的成员组成,每个成员可以是不同机器上的不同设备,比如存储介质上某一段存储空间,这些机器通过网络连接,形成一个分布式集群。
分布式集群在网络正常的情况下,可以顺利地选举出集群Leader。但当集群内部的网络通信出现异常时,就有可能在不同的网络分区中选举出各自的Leader。这也就是“脑裂”问题。
通俗来讲,“脑裂”即“大脑分裂”,通常会出现在分布式集群环境中,比如 ElasticSearch集群与Zookeeper集群。这些集群环境有一个统一的特点——有一个大脑,比如ElasticSearch集群中有Master节点,Zookeeper集群中有Leader节点。
由于网络通信故障、节点负载过大等原因使得心跳检测超时,主备切换后分裂出了两个或多个主节点,由此导致决策之间发生冲突,从而引发分布式系统管理混乱、数据损坏的现象。

图1
一定规模的分布式集群在运行一段时间后,可能会出现集群内部的网络异常,导致脑裂问题出现。当脑裂出现时会影响一个或多个组,受影响的组轻则无法正常进行IO操作,影响业务数据写入和读取,重则导致数据不一致,甚至数据损坏出现。同时,用户业务数据并发情况下,同一时间会通过多个数据驱动向同一组发送数据请求情况,以致出现管理混乱的现象。
数据驱动接收到用户读写数据后,将正常读写请求发送给组中所有成员,成员接收到数据请求后,对数据进行处理,接着把处理结果返回给数据驱动,数据驱动收集到成员数据处理结果后进行处理,最后返回读写数据响应给用户。
举例说明:数据驱动1简称为C1(Coordinator 1),数据驱动2简称为C2(Coordinator 2),主成员简称为P1(Primary 1),一般成员1简称为S1(Secondary 1),一般成员2简称为S2(Secondary 2):

图2
1)P1、S1写数据响应成功;
2) P1、S2写数据响应成功;
3) P1、S1、S2写数据响应成功。
上述三种情况都可认为该数据写请求成功。
而读数据请求发送到C1后,会由C1发送读数据请求到P1,同时发送检测读数据请求(不会读取任何数据,但会携带当前组信息,仅仅一次握手验证)给S1、S2,同理,由C1收集P1、S1、S2 读数据响应,出现以下3种情况:
1) P1读数据响应成功,S1 检测读数据响应成功;
2) P1读数据响应成功,S2检测读数据响应成功;
3) P1读数据响应成功,S1、S2检测读数据响应成功。
以上三种情况都可认为该读数据请求成功。
环境出现异常时,比如存储介质、节点或网络故障等,会导致成员无法正常提供服务。假设此时出现下面脑裂情况:

图3
假设网络发生故障,出现图3情况:P1和C1在一个网络分区A,new P1、S2和C2在另外一个网络分区B,网络分区A与网络分区B之间无法通信。
1) 写数据请求:
网络分区A:C1只能发送数据写请求到P1,只收到P1 数据写响应 OK,不符合之前列举的三种情况之一,写数据请求失败;
网络分区B:C2发送数据写请求到新的主成员P1(之前的S1),一般成员S2,收到新的主成员P1、一般成员S2写数据响应成功,符合三种情况之一,写数据请求成功。
由此可见,网络分区A不可进行写操作,而网络分区B可以进行正常写操作,不会存在网络故障后网络分区A、网络分区B都可以进行写操作的脑裂现象。
2) 读数据请求:
网络分区A:C1只能发送读数据请求到P1,只收到P1读数据响应成功,不符合之前列举的三种情况之一,读数据请求失败;
网络分区B:C2发送读数据请求到新的主成员P1(之前的S1),一般成员S2,收到新的主成员P1 读数据响应成功,一般成员S2 检测读数据响应成功,符合三种情况之一,读数据请求成功。
由此可见,网络分区A不可进行读操作,网络分区B可以进行读操作,不会存在网络故障后网络分区A、网络分区B都可以进行读操作的脑裂现象。这也是我们为什么设计对一般成员进行检测读请求的原因。
1、多个数据驱动并发操作时,每个数据驱动的每个数据读请求都要获得组中大多数成员支持,可从根本上杜绝脑裂情况发生,防止数据不一致、损坏情况出现;
2、第一时间在组中找出可以继续进行数据操作的大多数成员,对其发送数据操作请求并快速响应用户,以保证用户业务准确性与连续性。其具有一定的普遍性,适用于所有分布式组;同时还具备可移植性和精确性优势。
可移植性:采用程式化算法,即可杜绝脑裂产生,与系统其他模块解耦合。
精确性:准备识别脑裂后可以一起正常接受业务请求的大部分成员,即不错判,也不会漏判。
此外,在开源产品的基础上,鹏云同时针对各场景推出了开源存储解决方案,为客户核心业务运行提供全方位保障:
↓↓点击视频可查看解决方案详情↓↓




