注册
DM主备集群脑裂场景说明及验证
专栏/问一忘二三/ 文章详情 /

DM主备集群脑裂场景说明及验证

哈哈 2023/03/29 2266 9 0
摘要 DM数据守护集群系统为预防脑裂做了大量工作,仅有在未确认原主机状态的情况下,手动进行备机强制接管才可能导致脑裂的情况。

1 基本概念

1.1 脑裂

脑裂是指同一个守护进程组中同时出现两个或者多个活动主库,并且这些主库都接收用户请求,提供完整的数据库服务。一旦发生脑裂,将无法保证数据一致性,会对数据安全造成严重后果。
DM数据守护系统为预防脑裂做了大量工作,例如故障自动切换模式的数据守护必须配置确认监视器。确认监视器启动故障切换之前,会进行严格的条件检查,避免脑裂发生。守护进程一旦检测到脑裂发生,会马上强制退出主库,等待用户干预,避免数据差异进一步扩大。

1.2 自动切换与手动切换

故障自动切换与手动切换是集群主机出现故障时两种不同的处理方式。自动切换是指当主机发生故障时,集群自行进行备机接管的操作,从现有符合接管条件的备机中挑选一台备机切换为主机状态继续对外提供服务;手动切换是指当主机发生故障时,等待人为干预,不自动进行状态的切换。
自动切换必须满足以下两个条件:

  1. dmwatcher.ini中,DW_MODE配置为AUTO;
  2. 存在存活的确认监视器进程(dmmonitor.ini中,MON_DW_CONFIRM = 1且监视器服务启动);

2 场景说明

DM数据守护集群系统为预防脑裂做了大量工作,仅有在未确认原主机状态的情况下,手动进行备机强制接管才可能导致脑裂的情况。后续挑选部分场景进行测试验证。

2.1 手动切换

故障场景 处置流程 是否会导致脑裂
备机实例故障 主机做完故障处理后继续正常对外提供服务;
主机实例故障 备机不会进行自动接管;若主机实例被守护进程成功拉起,则继续作为主机对外提供服务;若无法被守护进程拉起,则集群无法正常提供读写服务,仅备机能对外提供只读服务;
主机内网故障/备机内网故障 主机做完故障处理后正常对外提供服务;
主机内网故障,在未确认主机实例是否故障的情况下,手动进行备机强制接管 若原主机实例未故障,则集群中会出现两个open primary状态的实例,集群出现脑裂;

2.2 自动切换

故障场景 处置流程 是否会导致脑裂
备机实例故障 主机做完故障处理后正常对外提供服务;
主机实例故障 备机自动接管,成为新的主机继续对外提供服务;
主机内网故障 备机自动接管,成为新的主机继续对外提供服务;原主机变为suspend状态,待内网恢复后原主机会变为standby状态;
备机内网故障 主机做完故障处理后正常对外提供服务;
主机实例故障且监视器服务故障或未启动 主机变为suspend状态,且备机无法进行自动接管,集群无法正常对外提供读写服务;
主机内网故障且监视器服务故障或未启动,此时人为进行备机强制接管 此时会出现两个PRIMARY状态的实例,但其中一个实例为SUSPEND状态,无法正常对外提供读写服务,不构成脑裂;

3 规避手段

对于集群的故障处理,需要当成一个整体进行分析,处理一个节点时,必须清楚其他节点的状态。为了避免出现集群脑裂的情况,我们建议:

  1. 设置dm.ini参数ALTER_MODE_STATUS = 0,限制用户直接通过SQL语句修改数据库模式、状态以及OGUID;
  2. 提供稳定、可靠的网络环境;
  3. 配置自动切换的数据守护集群时,将确认监视器部署在独立的第三方机器上,不要与某一个数据库实例部署在一起;
  4. 通过人工干预,将备库切换为主库之前,一定要确认原主库已经发生故障,避免在原主库活动的情况下执行备库强制接管,人为造成脑裂;

4 测试验证

测试环境:
数据库版本: V8. 1-2-162-2022.11.14-174506-20018-ENT Pack2
服务器环境:
############## Kylin Linux Version #################
Release:
Kylin Linux Advanced Server release V10 (Sword)

Kernel:
4.19.90-24.4.v2101.ky10.aarch64

Build:
Kylin Linux Advanced Server
release V10 (SP2) /(Sword)-aarch64-Build09/20210524
###################################################

心跳网网段:192.168.18.xx
业务网网段:192.168.104.xx

4.1 手动切换

4.1.1 主机实例故障

集群不会进行状态切换,待故障主机被守护进程自动拉起后,集群正常对外提供服务,不会发生脑裂。
image.png

image.png

image.png

4.1.2 主机内网故障

主机做完故障处理后继续正常对外提供服务,不会发生脑裂。
image.png

image.png

image.png

4.1.3 主机内网故障,人为进行备机强制接管

在上述4.1.2场景的基础上手动进行备机强制接管的操作,此时会出现两个OPEN PRIMARY状态的实例,且均能正常对外提供服务,集群出现脑裂。
image.png

image.png

image.png

image.png

4.2 自动切换

4.2.1 主机实例故障

备机进行自动接管,原主机被守护进程拉起后以备机状态重加入集群,不会发生脑裂。
image.png

image.png

image.png

4.2.2 主机内网故障

备机自动接管,成为新的主机继续对外提供服务;原主机变为suspend状态,待内网恢复后原主机会以standby状态重加入集群,不会发生脑裂。
image.png

image.png

image.png

4.2.3 主机内网故障、确认监视器故障

主机变为suspend状态,且备机无法进行自动接管,集群无法正常对外提供读写服务。
image.png

image.png

image.png

4.2.4 主机内网故障、确认监视器故障、人为进行备机强制接管

在上述4.2.3场景的基础上手动进行备机强制接管的操作,会出现两个PRIMARY模式的实例,但其中一个实例状态为SUSPEND,该节点无法正常对外提供读写服务,不构成脑裂。
image.png

image.png

image.png

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服