企业容灾可能遇到的脑裂问题是什么?在容灾架构设计中,我们经常会采用一些HA、Cluster等高可用架构,一般会采用跨地域的L2网络,以跨数据中心的方式在某个功能层形成一个独立的集群。比如数据库集群,存储网关集群等。假设因为两个数据中心节点通信故障,形成了两个独立的集群,各自独立工作,那么这就是脑裂。如图1所示。图1集群脑裂问题示意图在现实环境中,最典型的可能导致集群脑裂问题的场景是网络故障区域。例如,所有集群节点之间的通信网络中断;可能导致双活数据中心脑裂的场景是两个数据中心之间的光纤线路中断。因此,在容灾设计中,脑裂问题是架构师必须考虑的关键问题。一般来说,成熟的数据库集群和存储集群都有自己的处理脑裂问题的机制,通常有优先级策略和仲裁策略。裂脑集群的后果是什么?这个问题需要回到集群的仲裁机制。一般来说,集群的仲裁算法根据每个节点可以获得多少仲裁资源来判断谁是集群的领导者。集群的仲裁资源无非就是来自网络层的心跳信息和共享存储的磁盘心跳资源。在普通节点层故障的情况下,故障节点可以获得比其他节点更少的仲裁资源,则不会发生。裂脑问题。但是在特殊情况下(两个数据中心之间的网络出现故障),两个节点可用的仲裁资源是一样的,网络之间无法互通,存储之间也看不到对方。在这种情况下,仲裁将失败,发生脑裂。那么为什么说脑裂对于容灾架构来说是灾难性的事件呢?如果将一个统一集群的调度改为两个相互独立的集群调度,意味着双方的写操作也是相互独立的,但是他们的存储空间是共享的。在AA模式下,通过锁机制控制并发,而在HA模式下,通过存储卷的所有者控制写权限。但是,独立之后,就意味着两个集群可以随时写入同一个存储地址,势必会导致脏写、脏读等一系列数据不一致,对业务来说是灾难性的。曾经有一个金融公司的HA集群,因为集群仲裁触发的时间参数和交换机上的链路切换时间参数不一致,导致了脑裂问题。几个小时的数据。因此,这类问题对企业的业务数据来说是一个巨大的风险,是容灾设计中必须考虑的关键问题。社区专家倡导者主编赵海:在对前期重要理念达成共识后,联人寿高级工程师陈平春、哈尔滨银行系统专家组存储管理员张鹏将分别倡导该主题下的相关要点。在金融科技公司高级技术总监张鹏和我本人的反复考虑下,专家们的意见最终形成了一定的共识,供同行参考。连生命高级工程师陈平春:要根据脑裂场景严格区分和正确识别三种脑裂:心跳链路中断导致的脑裂、心跳链路抖动导致的脑裂、心跳链路抖动导致的脑裂仲裁结果不一致。假设节点1和节点2组成一个跨站点的集群架构,每个站点提供一个集群入口,节点之间通过心跳连接,协调访问共享资源。心跳主要用于检查节点间相互的生存状态,协调对共享资源的访问。共享资源主要包括存储、网络和应用服务。大多数情况下需要集群的锁机制来保证一致性。脑裂场景1.心跳链路中断导致脑裂心跳链路中断故障可能是网络线路中断,也可能是心跳链路端点网络设备故障。如图2所示,一旦心跳链路中断,节点1发送的心跳检测信号长时间得不到确认,就会判断节点2不存活,从而接管共享资源;而节点2也会对节点1进行Inactive判断,从而接管共享资源,形成脑裂。一旦资源共享模式改为独占模式,两个节点可能同时提供应用服务和原本由集群协调的网络,造成应用层和网络层的冲突;关键数据也可能同时被访问和存储层访问违规,这将破坏数据的一致性,甚至导致数据损坏。图2.心跳链路中断引起的Split-brain脑裂2.心跳链路抖动引起的Split-brain脑裂心跳链路抖动故障一般是站点间光纤质量问题导致链路不稳定造成的。如图3所示,心跳链路抖动故障可能会继续触发集群仲裁。流程假设如下:链路质量不稳定。当触发第一次仲裁时,确定节点1存活,节点2不活跃;当链路恢复时,触发第二次仲裁,判断节点2已恢复,节点1会发起对节点2的信息同步过程;信息同步过程中,链路再次失效,触发第三次仲裁。如果本次判断节点2存活,则节点1不存活,节点2接管资源。由于信息没有同步,节点1和节点2之间的数据一致性无法保证,造成脑裂。图3心跳链路抖动引起的脑裂场景3.仲裁结果不一致引起的脑裂如果节点入口与共享资源分离,故障的仲裁结果不一致,也会出现脑裂发生。如图4所示,节点进入失败,仲裁结果为节点1的进入不活跃;同时,节点共享资源也失效,仲裁结果为节点1独占共享资源。此时节点1可以访问共享资源,但是没有入口;节点2有访问权限,但没有共享资源,这也形成了裂脑。图4.仲裁结果不一致导致的脑裂张鹏哈尔滨银行系统专家组存储管理员:解决脑裂问题首先要正确认识脑裂的形成,脑裂的原因,脑裂的后果,以及几个通用的解决方案。脑裂是如何形成的脑裂的概念首先广泛应用于主机集群,可以类比在灾备双活系统中持续使用该概念。假设有一个整体相同,协调动作的节点A(站点A)和节点B(站点B),A和B通过心跳检查对方的生存状态,并负责协调和保证整个系统的可用性服务。一般情况下,如果节点A无法通过心跳检测到B的存在,就会接管B的资源。同样,节点B在检测不到A的生存状态时,也会接管A的资源。如果有一旦网络故障,两个节点的“心跳线”断开,原本是一个整体的系统,数据同步,动作协调就会分裂成两个独立的节点A和节点B系统,彼此失去联系。都认为对方失败了,两个节点上的应用软件就像一个“裂脑人”,“本能地”争夺“共享资源”和“应用服务”,导致:1)共享资源被分割,两边的“服务”无法启动;2)或者两边的“服务”都起来了,但同时读写“共享存储”,导致数据损坏。这种情况称为裂脑现象。因此,SiteA和SiteB在一定的功能层面上形成了一个独立的集群,即“大脑”。”,而当一个人拥有两个大脑并且相互独立时,那么难免会出现问题,导致系统崩溃,就像一个人在前进的同时不能接受另一个大脑向后退的指令一样。脑裂的原因当灾备系统出现脑裂现象时,优先考虑心跳线上的问题,其次是心跳服务,软件层面的问题主要有以下几个原因:1)高可用存储对之间的心跳线故障,导致无法正常通信,原因如下:a.心跳线本身坏了(包括断线、老化);b.网卡和相关驱动都坏了坏了,IP配置和冲突问题;c.心跳线之间连接的设备故障(交换机故障或网卡故障);d.仲裁服务器有问题。2)在高可用存储对之间的链路上启用防火墙,阻断心跳消息的传输;3)高可用存储对上心跳网卡地址等信息配置不正确,导致无法发送心跳;4)其他服务配置不当等其他原因,如心跳方式不同、心跳广播冲突、软件bug等。图5.心跳断开导致脑裂现象的后果在灾备系统中,当split-出现脑洞现象,很容易造成以下两个问题,影响业务和数据。1)导致数据不完整:如果集群中的节点(在脑裂期间)同时访问同一个共享资源,没有机制来协调和控制,那么就存在数据不完整的可能。2)服务异常:对外提供的服务异常。脑裂问题的解决方案针对灾备系统中的脑裂问题,通常采用心跳检测作为预防脑裂问题的基础。有以下几种解决方法:1)用串口线和网线连接两条心跳线,这样一条线断了,另一条线还好,消息还能传。2)当检测到脑裂时,强行关闭心跳节点,相当于程序的备节点发现心跳故障,向主节点发送关闭命令。3)通过增加仲裁机制来决定谁应该获得资源来提供服务:a.添加仲裁机制。例如设置参考IP。当心跳完全断开时,两个节点各自ping参考IP。如果失败,则说明断点出现在这一段,从而主动放弃比赛,从而能够ping通引用IP的那一端。接管服务。b.通过第三方软件仲裁。4)启用磁盘锁定。服务方锁定共享磁盘,当发生脑裂时,对方根本无法拿走共享磁盘资源。但是使用锁盘也有很大的问题。如果占用共享盘的乙方不主动解锁,则对方永远得不到共享盘。现实中,如果介入的服务节点突然死机或死机,对方将永远无法执行解锁命令。备份节点将无法接管共享资源和应用服务。于是有人在HA中设计了一个“智能”锁,服务方只有在发现心跳线全部断开时才启用磁盘锁。
