数据中心脑裂问题,简单说就是两个数据中心间的网络和存储链路同时发生中断,导致两个数据中心内的应用、数据库或者操作系统同时抢占和利用共享的资源,造成资源的数据不一致,产生重大影响。如何避免脑裂是每个存储双活方案都需要尤为重视的问题,脑裂会带来长时间的存储读写IO HANG住,轻则导致业务性能下降,重则因磁盘IO超时,导致数据库挂起甚至宕机,对生产业务系统造成重大影响。因此,在出现脑裂故障问题时,准确定位问题根因,以及快速恢复应急处置问题尤为关键。本议题针对生产和同城存储双活架构下,发生脑裂问题影响数据库读写的情况,分析如何快速分析问题和解决问题。

本期为大家带来《迈向YB数据时代》2022年春季刊“持续运维”栏目中的议题

生产和同城存储双活架构下,发生脑裂问题影响数据库读写,如何快速分析问题和解决问题?

 

社区专家主张

议题主编 邓毓 江西农信运维技术经理:本议题由利安人寿资深工程师陈萍春,以及长安银行存储架构师张俊禧两位专家分别从脑裂产生的影响,以及脑裂产生后的应对策略出发,帮助同行更好的认识脑裂,以及如何在问题产生时,能够在第一时间解决。文中涉及到的问题分析思路及具体应对策略得到了某农商银行架构师胡海光及我本人的认同,最终达成一定共识供同行参考。

 

陈萍春 利安人寿资深工程师:

作为运维人员,我们对脑裂故障要有足够的认知,需要能够快速分析定位故障原因,并采取措施及时解决问题。

 

脑裂故障是存储双活架构一个不可避免的问题,在一定程度上也影响到了存储系统的稳定性。作为运维人员,我们对脑裂故障要有足够的认知,需要能够快速分析定位故障原因,并采取措施及时解决问题。如图1所示,脑裂故障主要是两种类型,一种是双活存储之间互联的心跳链路出现故障,另外一种则是任一存储出现了故障。根据双活方案的不同,这两种类型的脑裂故障也存在着不同的故障点,我们要结合具体的脑裂故障来排查和应急处置。

Java应用双活方案 存储双活 方案优缺点_数据一致性

▲图1 两种集群脑裂故障类型示意图

先来看故障现象,当发生脑裂故障时,存储双活集群需要仲裁故障,数据库的写IO会出现悬挂现象,从而导致大量业务超时失败,这是脑裂故障的一个基本故障现象。但故障现象还存在一次性的IO长时间悬挂与间歇性的IO悬挂的差异,一次性对应着故障的稳定状态,更加容易定位故障并修复,也会有更多的故障排查时间,而间歇性故障则对应着故障的不稳定状态,故障排查难度更大。

再来看故障触发因素和影响范围。故障触发因素方面虽然往往带有随机性,但也往往由一些日常忽视的细节所引发。比如存储方面的变更,心跳链路关联的网络设备的变更,或者其他突发事件,从故障发生前的事件,推测与故障本身存在关联关系,是一个很常见也很有效的故障排查思路。另外影响范围方面,单台存储往往对应着多个不同的应用系统,即使配置了存储双活,双活的两台也不一定会配置完全一致。如果是单台存储故障导致的脑裂故障,那么故障影响范围也会提供确定故障点的有力证据。如果是同城双活存储的心跳链路故障,可能在数据中心间SAN网络层IP网络、波分设备或者裸光纤都会受到影响。

下一步是排查可能的故障点的状态,比如存储故障,大多数在存储系统层面都会有告警事件日志,稍加分析就能确定其健康状态。心跳链路故障,则相对复杂,需要排查端口状态、收发光功率以及交换机日志等等。往往在这一步,我们已经能锁定是存储故障还是心跳链路故障。为了迅速恢复业务的数据访问,最有效的手段是从存储网络层去隔离故障,比如断开故障存储的SAN网络连接,或者彻底断开某条故障链路。

如果上述排查过程依然无法确定和隔离故障点,那么就需要考虑其他灾难恢复的应急手段,以恢复关键业务为目标。比如本地存储双活的情况下考虑同城灾备恢复方案,同城存储双活的情况下考虑其他数据复制的应急替代手段,甚至断开存储双活配置等等应急手段。总之一句话,有备无患。

 

张俊禧 长安银行存储架构师:

当前主流的存储厂商都通过强制配置优先站点或者添加仲裁在站点分离时做出干预,基本上杜绝了由于脑裂导致数据一致性损坏的可能性。

 

“脑裂”是威胁存储双活架构最危险故障场景。由两节点组成的存储双活体系,两节点间用于数据同步的复制链路通常通过裸光纤或者波分复用设备连接。当前主流的存储厂商都通过强制配置优先站点或者添加仲裁在站点分离时做出干预,基本上杜绝了由于脑裂导致数据一致性损坏的可能性。

脑裂还会造成另一个严重后果是整个双活体系被“保护”,指的是为了避免由于脑裂导致数据一致性发生不可修复的损坏,主流的存储厂商将存储预先配置成当某个存活的节点,既不能通过复制链路和对方站点通信也不能和仲裁取得通信,将进入不可对外服务状态。如果发生脑裂,两个节点都处于这种隔离状态则没有节点可以对外服务,这会导致业务中断,这种情况被称为“保护”。对当前存储双活体系而言,“保护”是比脑裂损坏数据更现实的威胁。

Java应用双活方案 存储双活 方案优缺点_数据库_02

 

 

▲图2 双活存储故障场景

以上4个示意图将展开分析存储双活体可能遇到的主要故障场景及后果。图2.1是指双活两节点没有预先配置分离规则,分离规则指定两节点断开后哪个节点优先对外提供服务,这种情况下一旦复制链路断开导致脑裂,两个站点均进入保护状态,均不能对外服务,业务中断。

图2.2是指双活两节预先配置分离规则,即指定断开后,节点1优先提供服务,这种情况复制链路断开根据分离规则,节点1对外服务,节点2的IO被抑制。可见未配置仲裁的双活体系指定分裂规则是规避脑裂严重后果的必要手段。但是只配置分离规则的不足是,一旦优先站点发生故障则第二站点也不能对外服务,因此整个体系的可用性有限。

图2.3是指添加仲裁的双活存储体系,复制链路断开后,仲裁将介入,理论上最先和仲裁取得通信的节点对外服务。通常会预先设置节点1优先级高,复制链路断开后,仲裁将等待一个超时时间,在超时时间内节点1和仲裁通信,节点1将对外服务,超过时间节点1都没能与仲裁取得联系,则节点2可对外提供服务。可见添加第三方仲裁,比只配置分离规则进一步提高了双活体系的可用性。

图2.4是指配置了仲裁也会导致保护的一种极端情况,即当发生复制链路和两个节点到仲裁的线路均中断,此时两个节点由于都不能和仲裁通信而进入保护状态。规避这种情况措施主要有三个,一是加强复制链路的冗余性保护,比如两个站点通过冗余的波分复用设备及冗余的运营商线路连接,可以最大限度降低复制链路断开的风险。二是加强站点到仲裁服务器之间线路的管理监控,如果是同城双活架构在第三站点部署仲裁服务器,尽可能避免将两站点到仲裁站点使用同一家运营商,如果是在园区内使用裸光纤或通过以太网连接存储站点和仲裁站点的,则务必加强裸光纤的保护,加强网络连接设备的管理以避免仲裁线路的故障。三是通过引入多个仲裁避免但仲裁不可用导致的故障。

存储双活体系应配置分离规则,引入仲裁甚至引入多个仲裁用于脑裂发生后进行及时准确的干预,避免数据一致性被破坏以及避免被保护,最大限度提高体系的可用性。

 

结束语

“脑裂”是威胁存储双活架构最危险的故障场景,我们事前需做好预防,事后需能第一时间解决问题,避免产生更多的影响。而预防手段,以及分析、解决问题的方案甚多,在此呼吁更多的同行能分享实践的成功经验,帮助大家彻底和脑裂绝缘。