注册
DM数据守护集群脑裂故障测试
培训园地/ 文章详情 /

DM数据守护集群脑裂故障测试

Saturn 2025/02/07 174 0 0

DM数据守护集群脑裂故障测试

概要

在本文中,将模拟采取错误的人工干预进行脑裂故障,再进行恢复(方式二),并且对脑裂发生的原因进行分析阐述。
脑裂是同一个守护进程组中同时出现两个或者多个活动主库,并且这些主库都接收用户请求,提供完整数据库服务。一旦发生脑裂,将无法保证数据一致性,对数据安全造成严重后果。造成脑裂的主要原因有两个:网络不稳定或错误的人工干预。
遇到集群脑裂时,有两种方式恢复集群:
方式一,等待主库的故障解决,期间集群处于不可用状态,待主库故障解决后,按正常启动流程将集群拉起,数据会继续同步;
方式二,采取紧急措施,挑选其中一个备库进行强制切主,未完成同步的数据会丢失。

脑裂的判断规则

守护进程首先对本地和远程库的 Open 记录(SYSOPENHISTORY)进行比较,再结合数据库的模式、状态以及守护进程认定的 OK/ERROR 状态判断可加入或者分裂,这里仅对守护进程的判断规则进行大概说明,如果发现守护系统中有分裂库,可以从服务器和守护进程的 log 日志中找到具体的分裂原因。
Open 记录的比较结果分为四种:

  1. 本地库和远程库相等
    如果其中一个库是 Primary&Open 或者 Primary&Suspend 状态,则直接将其认定为主库,另一个库认定为备库。
    否则需要进一步比较两个库的 APPLY 信息,比较结果可能会选出有效的主库和备库,也可能出现分裂,需要用户干预。
  2. 远程库包含在本地库中
    使用本地库包含关系之后的第一条 Open 记录项中的 APPLY 信息和远程库的 APPLY 信息比较大小,远程库小于或等于的情况下,远程库的守护进程再继续根据模式、状态信息确定下一步动作,最终可以将其作为备库重加入守护系统。
  3. 本地库包含在远程库中
    使用远程库包含关系之后的第一条 Open 记录项中的 APPLY 信息和本地库的 APPLY 信息比较大小,本地库小于或等于的情况下,本地库的守护进程再继续根据模式、状态信息确定下一步动作,最终可以将其作为备库重加入守护系统。
  4. 本地库和远程库不相等,也没有包含关系
    如果其中一个库处于 Primary&Open 状态,另一个库是备库,或者是 Mount 状态的主库,则另一个库的守护进程会将自己设置为 Split 分裂状态,创建 dmwatcher.ctl 文件,并通知本地库强制关闭。如果守护进程无法选出有效主库,则切换为 Startup 状态,并等待用户干预。

故障模拟

初始状态
1.png

模拟备库(dw1)故障
2.png
3.png

主库插入数据
使用DM管理工具对"SYSDBA"."TEST"表插入数据1千万条
4.png5.png
6.png

备库(dw1)恢复
7.png
主库(dw2)故障
8.png
监视器显示,当前只有备库存活,且主备库的FLSN不一致
9.png
备库(dw1)强制接管主库
10.png
原主库(dw2)恢复
11.png
监视器显示,当前为脑裂状态,WCTLSTAT:SPLIT
12.png

引发故障的原因

查看DW2守护进程日志
1.png

此处显示的是强制让DW1接管成为主库的日志信息
2.png

DW2恢复服务加入原集群的过程中,守护进程接受对比发现dw1与dw2的数据不一致
3.png

显示dw2数据库为PRIMARY,实例状态为MOUNT
4.png

本地库和远程库不相等,也没有包含关系。其中一个库处于 Primary&Open 状态,另一个库是 Mount 状态的主库,则另一个库的守护进程会将自己设置为 Split 分裂状态。
5.png

故障恢复

备份主库数据(dw1)
登录disql
disql SYSDBA/'"dameng@123"'
SQL>backup database full backupset '/dmdata/dmbak/DB_DAMENG_FULL_01' compressed;
6.png

检查备份文件
/home/dmdba/dmdbms/bin/dmrman
RMAN> check backupset '/dmdata/dmbak/DB_DAMENG_FULL_01';
7.png

将备份文件传输到dw2服务器上
scp -r /dmdata/dmbak/DB_DAMENG_FULL_01/ dmdba@192.168.10.122:/dmdata/dmbak
8.png

9.png

还原恢复dw2
还原时,DW2的数据库服务和守护进程要求是关闭状态
10.png
使用dmrman对DW2进行恢复还原
/home/dmdba/dmdbms/bin/dmrman
RMAN> restore database '/dmdata/dmdb/dm.ini' from backupset '/dmdata/dmbak/DB_DAMENG_FULL_01';
RMAN> recover database '/dmdata/dmdb/dm.ini' from backupset '/dmdata/dmbak/DB_DAMENG_FULL_01';
RMAN> recover database '/dmdata/dmdb/dm.ini' update DB_MAGIC;
11.png
移走dw2的dmwatcher.ctl文件
守护进程检测到本地库是分裂时,会在本地库的 SYSTEM_PATH 路径下,自动创建dmwatcher.ctl 文件,记录的状态一定是 Split状态。在对分裂库进行重建时,需要手动将 dmwatcher.ctl 文件删除,否则守护进程仍然会认定本地库为分裂库。
mv /dmdata/dmdb/dmwatcher.ctl /dmdata/dmbak/

启动dw2数据库服务
12.png
查看监视器
集群已恢复正常
13.png

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服