前段时间我在一套达梦数据库集群上做了一次“在线剔除异步备库”的实验。简单说,就是把一台仍然在运行、仍然承担同步任务、但已经不需要继续留在集群里的异步备库节点,在不重启主库、不中断主库业务的前提下安全摘掉。很多人听到“在线剔除”第一反应是:直接把备库停掉不就行了?实际操作下来真没这么简单,如果顺序错了、命令先后反了,备库会被守护进程分分钟自动拉起来,甚至可能把集群状态搞乱,吓得人一身冷汗。
这篇文章就把整个实验过程完整复盘一遍,从“为什么需要在线剔除异步备库”到环境准备、操作步骤、配置文件清理、踩坑记录全部写出来。如果你正在用达梦数据库,做过主备集群,或者马上要处理类似“机房节点回收”“备库报废”“一个多余的异步备库要下线”这类事情,这篇内容应该能帮你少走不少弯路。我这里用的是达梦8(DM8)环境,配置方式和命令在DM7上略有差异,但只要理解了思路,换版本也不难套用。
1. 先弄清楚:为什么要单选“异步备库”剔除
1.1 异步备库在集群里到底是个什么角色
达梦数据库集群的主备架构里,主库负责业务读写,备库负责实时或者准实时拿日志做冗余。通常大家说的“同步备库”,主要是实时归档模式,主库事务提交前日志至少要送到备库侧,主备之间数据一致性非常强,主库故障时数据不丢。而“异步备库”就不一样,它允许主备之间有一定延迟,备库可以定时去拿主库的归档日志,或者主库发送日志后不强制等待备库确认,主库该提交提交、该返回返回,哪怕备库网络抖动都不会拖累主库性能。
正因为它“不拖累主库”,很多团队会把异步备库放在跨机房、边缘机房或者一些性能一般的老机器上,用来做异地容灾、报表数据源、数据演练副本这类要求不高的场景。但运行时间长了问题就来了:
- 异步备库硬件老旧,磁盘、内存已经跟不上新版本的集群要求。
- 该节点所在机房要网络整改或上收,这台机器要么报废,要么挪作他用。
- 节点已经长期失联或同步延迟越来越大,监控里一直告警,与其留着还不如彻底踢出去。
- 集群里实际保留的备库数量已经足够,冗余度过高,继续维护纯粹是负担。
这时候就出现了一个问题:怎么把备库摘掉?粗暴做法是什么?有人直接在备库上把服务停了,有人干脆把备库网线拔了。但达梦的高可用集群不是这么玩的,后面我会详细讲为什么这些做法会踩坑。
1.2 在线剔除的真正难点在哪里
我一开始也以为“在线剔除备库”就是把备库相关进程停掉、配置文件删一删就完事。真动手做实验才发现,难点有两层。
第一层是达梦的守护机制。达梦主备集群中,每个节点上都有数据库实例 dmserver,同时还有一个守护进程 dmwatcher 在看着它,核心监控进程则是确认监视器 dmmonitor。如果备库的 dmserver 异常退出,dmwatcher 会在很短的时间内自动把它重新拉起来,甚至尝试重新加入集群。所以你要是直接 kill 备库实例,不出十几秒它自己又启动并恢复 standby 状态了,根除不了。
第二层是配置链路上的关系。主库、备库之间通过 dmmal.ini 里的 MAL 条目通信,主库的 dmarch.ini 里还保留着向这个备库发送日志的归档配置,监视器一侧也记录了这个节点的信息。光把备库停了没有用,主库侧还在继续往这个节点发送日志,只是发不出去,时间一长本地待发送日志越堆越多,最终受影响的反而是主库。
所以真正干净利落的剔除,必须分两个层面来做:先把节点从集群的“运行态”里摘掉,让守护进程不再管它、监视器不再盯着它;再处理配置文件,让这个节点从“配置态”里也消失。这两个层面拆开想通了,后面的操作就不会乱。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 实验环境与开始之前的准备工作
2.1 实验集群的基本构成
我这边的实验环境比较简单,一主一备,外加一个独立部署的确认监视器。主备库的同步方式配置成了异步归档,也就是说备库是一台典型的异步备库。
| 角色 | 主机IP | 实例名 | 实例服务 | 数据库模式 | OGUID |
|---|---|---|---|---|---|
| 主库 | 192.168.10.11 | GRP1_01 | DmServiceGRP1_01 | PRIMARY | 45331 |
| 待剔除异步备库 | 192.168.10.12 |
