注册
达梦 DM8 异步主备集群搭建
专栏/技术分享/ 文章详情 /

达梦 DM8 异步主备集群搭建

文橘本可 2026/07/23 74 0 0
摘要

一、项目背景

在达梦数据守护集群中,主备同步模式分为实时主备(REALTIME)、即时主备(TIMELY)和异步主备(ASYNC)。本次实践目标:在原有实时主备环境改造为纯异步主备集群,验证异步同步延迟特性。

异步主备核心价值:主库事务提交不等待备库,性能接近单机,适用于异地容灾、备库只读查询等对数据实时性要求较低场景。

二、环境信息

项目 主库 异步备库
操作系统 CentOS 7 CentOS 7
数据库版本 DM8 DM8
IP地址 192.168.200.208 192.168.201.128
数据库端口 5236 5237
实例名 GRP1_RT_01 GRP1_RT_02
数据目录 /data/dmdata/DAMENG /data/dmdata_STB/DAMENG_STB
MAL端口 61141 61142
守护进程端口 52141 52142
实例监听守护端口 33141 33142
OGUID 453331 453331

说明:两个IP部署在同一物理机,单机双实例测试环境。

三、异步主备核心原理

异步主备依靠定时器机制完成日志同步,流程:

  1. 主库将Redo日志写入本地归档文件
  2. 定时器按指定间隔触发归档发送任务
  3. 主库通过MAL链路批量推送归档日志至备库
  4. 备库接收日志后重演,完成数据同步

四、配置文件改造

基于现有实时主备改造,核心改动:归档类型改为ASYNC,新增定时器配置。

4.1 主库配置

4.1.1 dm.ini 开启定时器

TIMER_INI = 1 # 启用定时器,异步归档必填

4.1.2 dmarch.ini 异步归档配置

[ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL ARCH_DEST = /data/dmdata/dmarch ARCH_FILE_SIZE = 2048 ARCH_SPACE_LIMIT = 51200 [ARCHIVE_ASYNC] ARCH_TYPE = ASYNC ARCH_DEST = GRP1_RT_02 ARCH_TIMER_NAME = ASYNC_TIMER

4.1.3 dmtimer.ini 定时器配置

[ASYNC_TIMER] TYPE = 2 FREQ_MONTH_WEEK_INTERVAL = 1 FREQ_SUB_INTERVAL = 0 FREQ_MINUTE_INTERVAL = 1 START_TIME = 00:00:00 END_TIME = 23:59:59 DURING_START_DATE = 2026-07-14 10:00:00 DURING_END_DATE = 9999-12-31 23:59:59 NO_END_DATE_FLAG = 1 DESCRIBE = ASYNC TIMER IS_VALID = 1

4.1.4 dmmal.ini 通信配置(主备完全一致)

MAL_CHECK_INTERVAL = 10 MAL_CONN_FAIL_INTERVAL = 10 MAL_BUF_SIZE = 8192 MAL_COMPRESS_LEVEL = 1 MAL_VPOOL_SIZE = 10240 [MAL_INST1] MAL_INST_NAME = GRP1_RT_01 MAL_HOST = 192.168.200.208 MAL_PORT = 61141 MAL_INST_HOST = 192.168.200.208 MAL_INST_PORT = 5236 MAL_DW_PORT = 52141 MAL_INST_DW_PORT = 33141 [MAL_INST2] MAL_INST_NAME = GRP1_RT_02 MAL_HOST = 192.168.201.128 MAL_PORT = 61142 MAL_INST_HOST = 192.168.201.128 MAL_INST_PORT = 5237 MAL_DW_PORT = 52142 MAL_INST_DW_PORT = 33142

4.2 备库配置

4.2.1 dmwatcher.ini 本地守护(纯异步专用)

[GRP1_RT_02] DW_TYPE = LOCAL DW_MODE = MANUAL INST_OGUID = 453331 INST_INI = /data/dmdata_STB/DAMENG_STB/dm.ini INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver INST_ERROR_TIME = 10 INST_RECOVER_TIME = 60 INST_AUTO_RESTART = 0 RLOG_SEND_THRESHOLD = 0 RLOG_APPLY_THRESHOLD = 0

4.2.2 dmarch.ini 仅本地归档

[ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL ARCH_DEST = /data/dmarch_STB/DAMENG_STB ARCH_FILE_SIZE = 2048 ARCH_SPACE_LIMIT = 51200

五、集群启动流程

5.1 清理残留进程

pkill -9 -f dmserver pkill -9 -f dmwatcher pkill -9 -f dmmonitor sleep 3 ps aux | grep -E "dmserver|dmwatcher|dmmonitor" | grep -v grep

5.2 备库启动并初始化角色

# Mount启动备库 nohup ./dmserver /data/dmdata_STB/DAMENG_STB/dm.ini mount \ > /data/dmdata_STB/DAMENG_STB/log/dmserver_mount.log 2>&1 & sleep 5 # 设置OGUID与备库角色 ./disql SYSDBA/Wei050210@192.168.201.128:5237 <<EOF alter system set 'ALTER_MODE_STATUS'=1; SP_SET_OGUID(453331); ALTER DATABASE STANDBY; alter system set 'ALTER_MODE_STATUS'=0 both; EXIT EOF

5.3 主库启动校验

# Mount启动主库 nohup ./dmserver /data/dmdata/DAMENG/dm.ini mount \ > /data/dmdata/DAMENG/log/dmserver_mount.log 2>&1 & sleep 5 # 校验主库状态 ./disql SYSDBA/Wei050210@192.168.200.208:5236 <<EOF SELECT INSTANCE_NAME, MODE\$, STATUS\$, OGUID FROM V\$INSTANCE; EXIT EOF # 预期输出:GRP1_RT_01 | PRIMARY | MOUNT | 453331

5.4 启动守护进程

# 主库守护 nohup ./dmwatcher /data/dmdata/DAMENG/dmwatcher.ini \ > /data/dmdata/DAMENG/log/dmwatcher.log 2>&1 & # 备库守护 nohup ./dmwatcher /data/dmdata_STB/DAMENG_STB/dmwatcher.ini \ > /data/dmdata_STB/DAMENG_STB/log/dmwatcher.log 2>&1 &

5.5 校验实例运行状态

# 主库状态 ./disql SYSDBA/Wei050210@192.168.200.208:5236 <<EOF SELECT INSTANCE_NAME, MODE\$, STATUS\$ FROM V\$INSTANCE; EXIT EOF # 预期:GRP1_RT_01 | PRIMARY | OPEN # 备库状态 ./disql SYSDBA/Wei050210@192.168.201.128:5237 <<EOF SELECT INSTANCE_NAME, MODE\$, STATUS\$ FROM V\$INSTANCE; EXIT EOF # 预期:GRP1_RT_02 | STANDBY | OPEN

5.6 校验MAL链路

./disql SYSDBA/Wei050210@192.168.200.208:5236 <<EOF SELECT * FROM V\$MAL_LINK_STATUS; EXIT EOF # 预期:CTL_LINK_STATUS=CONNECTED,DATA_LINK_STATUS=CONNECTED

六、异步同步延迟测试

6.1 主库写入测试数据

CREATE TABLE ASYNC_TEST (ID INT, MSG VARCHAR(100)); INSERT INTO ASYNC_TEST VALUES (1, 'ASYNC DATA TEST'); COMMIT;

image.png

6.2 验证延迟现象

事务提交立刻查询备库,无数据:

SELECT * FROM ASYNC_TEST;

等待1分钟后校验发送状态与备库数据:

sleep 60 # 主库查看归档发送情况 ./disql SYSDBA/Wei050210@192.168.200.208:5236 <<EOF SELECT ARCH_DEST, LAST_SEND_CODE, LAST_SEND_DESC, LAST_SEND_LSN FROM V\$ARCH_SEND_INFO; EXIT EOF # LAST_SEND_CODE=0 代表发送成功 # 备库查询数据 ./disql SYSDBA/Wei050210@192.168.201.128:5237 <<EOF SELECT * FROM ASYNC_TEST; EXIT EOF

延迟说明:
总延迟 = 定时器等待间隔(0~60s) + 传输耗时 + 重演耗时。事务刚提交时距离下一次触发越久,延迟越高。
image.png

七、踩坑记录

7.1 定时器未加载 报错-803/-823

现象:启动提示异步归档未配置定时器、定时器不存在,实例启动失败。
根因:

  1. dmarch.ini ARCH_TIMER_NAME 与dmtimer.ini段名不一致
  2. dmtimer.ini缺失必填字段
  3. dm.ini TIMER_INI=0
    解决:
  • 定时器名称大小写完全匹配
  • FREQ_MONTH_WEEK_INTERVAL、FREQ_SUB_INTERVAL必须存在,填0也不能省略
  • TIMER_INI=1后重启数据库

7.2 GLOBAL守护无法搭配纯异步集群

现象:守护进程启动直接退出,提示GLOBAL必须配置REALTIME/TIMELY归档。
根因:GLOBAL守护要求集群至少一个实时/即时备库,纯异步不支持。
解决:纯异步集群备库dmwatcher.ini设置DW_TYPE=LOCALDW_MODE=MANUAL
补充:若主库同时存在实时+异步归档,GLOBAL守护可正常运行。

7.3 MAL守护端口连接失败

现象:守护日志报无法连接33141,端口访问拒绝。
端口区分:

  • MAL_DW_PORT:守护进程间集群通信端口
  • MAL_INST_DW_PORT:本地实例与本地守护通信端口
    解决:dmmal.ini完整配置两类端口,放行防火墙,端口无占用。

7.4 定时器TYPE参数说明

TYPE=1:高频自定义调度,参数繁琐,不推荐异步归档;
TYPE=2:按日循环调度,适配异步归档,配置简单稳定。

八、总结

核心配置清单

文件 关键参数 作用
主库dm.ini TIMER_INI = 1 开启定时器,异步归档必备
主库dmarch.ini ARCH_TYPE=ASYNC、ARCH_TIMER_NAME 定义异步归档并绑定定时器
主库dmtimer.ini TYPE=2、FREQ_MINUTE_INTERVAL=1 定时推送归档日志
备库dmwatcher.ini DW_TYPE=LOCAL 纯异步集群本地守护模式
dmmal.ini 两端完全一致 MAL通信底层依赖

关键部署要点

  1. 定时器是异步同步核心,配置缺失会直接同步失效;
  2. GLOBAL守护仅支持混合归档,纯异步必须LOCAL守护;
  3. ini配置校验严格,字段缺失、名称不匹配会静默异常;
  4. 禁止手动FORCE OPEN备库,会破坏LSN导致同步失败;
  5. 同步异常优先排查MAL链路连通状态;
  6. 异步延迟可控,调整定时器间隔可控制最大延迟上限。
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服