正常情况下,数据守护集群不会发生脑裂。最容易触发脑裂的场景是人工干预——在没有确认主库状态的情况下,强行把备库切换为主库。
一个典型的过程如下:
需要说明的是,此时重启两个"主库"中的任意一个,该库会自动降级为备库,集群仍可恢复。只有在异常状态下对两个数据库都进行了写操作(例如通过 disql 直连数据库进行操作),才会造成不可修复的损坏。因此,脑裂后的"双写"才是真正的危险所在。
预防脑裂,建议从以下几个方面入手:
DW_MODE = AUTO # 自动切换
DW_MODE = MANUAL # 手动切换(更安全,推荐)
dm.ini 中设置 ALTER_MODE_STATUS = 0,禁止人工修改数据库模式、状态以及 OGUID,从制度层面杜绝误操作。关闭主库的监控后,监视器会显示主库异常。
此时即使通过监视器强制切换主库,监视器仍会先监测主库的真实状态:如果主库功能其实正常,只是心跳网络异常,则无法执行强制切换。这正是确认监视器作为"仲裁者"的价值所在——它能有效避免因心跳误判而引发的脑裂。
一旦发生脑裂,可按照以下步骤修复:
show 命令确认哪个是正常主库、哪个是 SPLIT 分裂库。在分裂库所在机器上,必须手动删除数据目录下的 dmwatcher.ctl 文件——只要该文件存在,守护进程就会一直认为该库处于分裂状态,无法重新加入集群。Mount 方式启动恢复后的库,将其 OGUID 修改为与主库一致,并把模式改为 Standby。完成后启动该节点的守护进程,数据守护系统会自动将其作为备库重新纳入集群并开始同步数据。关键控制参数为 TARCH_WAIT_APPLY,它决定备库收到 Redo 日志后,是否要等日志重演完成再响应主库:
| 取值 | 含义 | 适用场景 |
|---|---|---|
0 |
收到即响应(高性能模式) | 实时归档的读写分离集群,默认值 |
1 |
重演完成后响应(事务一致模式) | 即时归档的读写分离集群,默认值 |
高性能模式优先保证吞吐量,事务一致模式优先保证主备数据强一致,需要根据业务对一致性的要求进行取舍。
| 参数 | 说明 | 默认值 | 建议 |
|---|---|---|---|
REDOS_PARALLEL_NUM |
并行日志重演的线程数(1–64),1 表示不并行 |
1(静态参数) | 推荐 32 |
REDOS_PRE_LOAD |
重演 Redo 日志时是否开启 RLOG_PKG 预加载,0 关闭、1 开启 |
0(动态参数) | 视环境开启 |
TRX_VIEW_MODE |
针对"连接特别多、活动会话少、空闲会话特别多"的场景,设为 1 |
0(静态参数) | 此类场景设为 1 |
问题描述:手动切换模式下,若守护进程被配置为 DW_MODE = AUTO,而环境里又没有配置确认监视器,此时停掉备机节点实例服务并继续往主节点写入数据,就会导致主节点挂起。
解决办法:
MANUAL(手动切换);在自动切换模式下,如果备库发生故障,集群会退化为单节点运行。此时若主库重启,确认监视器会先确认备库状态,导致主库一直停留在 mount 状态无法正常打开。
解决方式:在确认监视器中直接启动数据库:
open database GRP1.DW02
数据库启动后即可进行数据操作。若归档连续,则备库启动后数据一致;若归档不一致,则需要对主、备库进行备份还原操作。
文章
阅读量
获赞
