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

达梦DM8实时同步主备集群搭建

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

一、主备集群概述

1.1 什么是主备集群?

达梦主备集群(数据守护集群)基于实时日志传输实现高可用,核心特性:

  1. 一主多备架构:主库承载读写,备库同步Redo日志,支持只读或故障切换
  2. 双副本存储:主备各存完整数据,依靠MAL链路同步日志
  3. 自动故障切换:守护进程+确认监视器协同,故障后备库自动升主,保障业务连续

本文采用单机双实例演示;生产推荐双物理机部署,硬件故障隔离。

1.2 核心组件

  • dmserver:数据库实例(主/备分别运行)
  • dmwatcher:守护进程,监控实例、执行故障切换
  • dmmonitor:确认监视器,故障仲裁、下发切换指令
  • MAL:消息访问层,主备日志传输、心跳通信
  • dmarch:归档模块,REALTIME实时归档实现数据同步

二、环境检查与准备

2.1 软硬件环境

项目 配置
操作系统 CentOS 7
数据库版本 DM8 V8
安装目录 /home/dmdba/dmdbms
运行用户/组 dmdba:dinstall
主库IP 192.168.200.208
备库IP 192.168.201.128

2.2 端口规划(单机双实例)

实例名 数据库PORT_NUM MAL_INST_DW_PORT MAL_PORT MAL_DW_PORT
GRP1_RT_01(主) 5236 33141 61141 52141
GRP1_RT_02(备) 5237 33142 61142 52142

端口说明:

  1. PORT_NUM:客户端连接数据库端口
  2. MAL_INST_DW_PORT:实例与本地守护通信端口,对应dm.ini DW_PORT
  3. MAL_PORT:主备间日志、心跳传输端口
  4. MAL_DW_PORT:跨节点守护、监视器通信端口

2.3 目录规划

# 主库目录
/data/dmdata/DAMENG/
├── dm.ini
├── dmmal.ini
├── dmarch.ini
├── dmwatcher.ini
├── arch/
└── log/

# 备库目录
/data/dmdata_STB/DAMENG_STB/
├── dm.ini
├── dmmal.ini
├── dmarch.ini
├── dmwatcher.ini
├── arch/
└── log/

# 公共目录
/data/dmback/                     # 备份集存放
/home/dmdba/dmmonitor.ini        # 监视器配置
/home/dmdba/monitor_log/          # 监视器日志

部署前创建目录并授权:

mkdir -p /data/dmdata /data/dmdata_STB /data/dmback /home/dmdba/monitor_log chown -R dmdba:dinstall /data /home/dmdba/monitor_log

三、实例初始化

3.1 软件安装

单机双实例仅安装一次达梦软件;双物理机两台均安装。

3.2 主库dminit初始化

su - dmdba cd /home/dmdba/dmdbms/bin ./dminit path=/data/dmdata \ db_name=DAMENG \ instance_name=GRP1_RT_01 \ page_size=32 \ log_size=2048 \ port_num=5236 \ case_sensitive=1 \ charset=1

关键参数:

  • PAGE_SIZE:数据页,创建后不可改,推荐16/32
  • LOG_SIZE:日志文件大小,生产2048M
  • CASE_SENSITIVE=1:兼容Oracle;0兼容MySQL
  • CHARSET=1:UTF-8;0:GB18030

3.3 主库备份+备库还原(标准生产流程)

规范:禁止独立初始化备库,必须主库备份还原保证DB_MAGIC一致

  1. 前台启动主库后退出
cd /home/dmdba/dmdbms/bin ./dmserver /data/dmdata/DAMENG/dm.ini # 输出SYSTEM IS READY后输入exit退出
  1. RMAN全量备份
mkdir -p /data/dmback/full ./dmrman BACKUP DATABASE '/data/dmdata/DAMENG/dm.ini' FULL BACKUPSET '/data/dmback/full/fullbak_first' COMPRESSED LEVEL 1; EXIT;
  1. 备库还原恢复
./dmrman RESTORE DATABASE '/data/dmdata_STB/DAMENG_STB/dm.ini' FROM BACKUPSET '/data/dmback/full/fullbak_first'; RECOVER DATABASE '/data/dmdata_STB/DAMENG_STB/dm.ini' FROM BACKUPSET '/data/dmback/full/fullbak_first'; RECOVER DATABASE '/data/dmdata_STB/DAMENG_STB/dm.ini' UPDATE DB_MAGIC; EXIT;

四、集群完整配置

4.1 dm.ini 关键参数

主库 /data/dmdata/DAMENG/dm.ini

INSTANCE_NAME = GRP1_RT_01 PORT_NUM = 5236 MAL_INI = 1 ARCH_INI = 1 DW_PORT = 33141 ALTER_MODE_STATUS = 0 ENABLE_OFFLINE_TS = 2

备库 /data/dmdata_STB/DAMENG_STB/dm.ini

INSTANCE_NAME = GRP1_RT_02 PORT_NUM = 5237 MAL_INI = 1 ARCH_INI = 1 DW_PORT = 33142 ALTER_MODE_STATUS = 0 ENABLE_OFFLINE_TS = 2

故障点:dw_port与dmmal.ini MAL_INST_DW_PORT不一致 → MAL初始化失败,两端端口必须严格对应。

4.2 dmmal.ini(主备完全相同)

MAL_CHECK_INTERVAL = 5 MAL_CONN_FAIL_INTERVAL = 5 [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_INST_DW_PORT = 33141 MAL_DW_PORT = 52141 [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_INST_DW_PORT = 33142 MAL_DW_PORT = 52142

4.3 dmarch.ini

主库

[ARCHIVE_REALTIME] ARCH_TYPE = REALTIME ARCH_DEST = GRP1_RT_02 [ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL ARCH_DEST = /data/dmdata/DAMENG/arch ARCH_FILE_SIZE = 128 ARCH_SPACE_LIMIT = 0

备库

[ARCHIVE_REALTIME] ARCH_TYPE = REALTIME ARCH_DEST = GRP1_RT_01 [ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL ARCH_DEST = /data/dmdata_STB/DAMENG_STB/arch ARCH_FILE_SIZE = 128 ARCH_SPACE_LIMIT = 0

提前创建arch目录,授权dmdba。

4.4 启动实例至MOUNT状态

# 主库mount启动 nohup /home/dmdba/dmdbms/bin/dmserver /data/dmdata/DAMENG/dm.ini mount \ > /data/dmdata/DAMENG/log/dmserver_mount.log 2>&1 & # 备库mount启动 nohup /home/dmdba/dmdbms/bin/dmserver /data/dmdata_STB/DAMENG_STB/dm.ini mount \ > /data/dmdata_STB/DAMENG_STB/log/dmserver_mount.log 2>&1 &

image.png
故障:日志目录不存在会报文件找不到;必须提前mkdir创建log目录;启动必须使用绝对路径,否则nohup找不到命令。

4.5 设置OGUID与数据库角色

主库执行SQL

SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); SP_SET_OGUID(453331); ALTER DATABASE PRIMARY; SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

备库执行SQL

SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); SP_SET_OGUID(453331); ALTER DATABASE STANDBY; SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

校验命令

SELECT OGUID, MODE$ FROM V$INSTANCE;

要求:主备OGUID一致,主PRIMARY、备STANDBY。
image.png

4.6 dmwatcher.ini 守护配置

主库

[GRP1] DW_TYPE = GLOBAL DW_MODE = AUTO DW_ERROR_TIME = 10 INST_RECOVER_TIME = 60 INST_ERROR_TIME = 10 INST_OGUID = 453331 INST_INI = /data/dmdata/DAMENG/dm.ini INST_AUTO_RESTART = 1 INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver RLOG_SEND_THRESHOLD = 0 RLOG_APPLY_THRESHOLD = 0

备库仅修改INST_INI路径:
INST_INI = /data/dmdata_STB/DAMENG_STB/dm.ini
故障:配置中不能添加DW_PORT参数,会报ini第N行读取错误-802。
image.png

4.7 启动守护进程

image.png

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

守护启动后实例自动由MOUNT转为OPEN。
image.png

4.8 确认监视器 dmmonitor.ini

image.png

MON_DW_CONFIRM = 1 MON_LOG_PATH = /home/dmdba/monitor_log MON_LOG_INTERVAL = 60 MON_LOG_FILE_SIZE = 32 MON_LOG_SPACE_LIMIT = 0 [GRP1] MON_INST_OGUID = 453331 MON_DW_IP = 192.168.200.208:52141 MON_DW_IP = 192.168.201.128:52142

启动监视器

nohup /home/dmdba/dmdbms/bin/dmmonitor /home/dmdba/dmmonitor.ini \ > /home/dmdba/monitor_log/dmmonitor.log 2>&1 &

故障:MON_DW_CONFIRM=0为普通监视器,无法自动切换,必须设1。

4.9 数据同步验证

主库执行

CREATE TABLE TEST_SYNC (ID INT PRIMARY KEY, NAME VARCHAR(50)); INSERT INTO TEST_SYNC VALUES (1, 'Hello DM8'); INSERT INTO TEST_SYNC VALUES (2, '主备同步测试'); COMMIT;

备库查询

SELECT * FROM TEST_SYNC;

能查询到数据代表同步正常。
image.png

4.10 自动故障切换测试

仅实验环境操作,生产禁止kill -9杀库进程

# 查找主库进程PID ps aux | grep "/data/dmdata/DAMENG/dm.ini" | grep -v grep kill -9 PID

等待INST_ERROR_TIME时长后查询备库角色:

echo "SELECT INSTANCE_NAME, MODE$ FROM V\$INSTANCE;" | /home/dmdba/dmdbms/bin/disql SYSDBA/Wei050210@192.168.201.128:5237

备库变为PRIMARY即切换成功;原主库重新启动后自动转为备库。
故障说明:INST_AUTO_RESTART=1会自动重启本地实例,如需观察切换可连续kill两次主库进程。

五、标准启停顺序

启动顺序

  1. systemctl start DmServiceGRP1_RT_01
  2. systemctl start DmServiceGRP1_RT_02
  3. systemctl start DmWatcherServiceGRP1_RT_01
  4. systemctl start DmWatcherServiceGRP1_RT_02
  5. systemctl start DmMonitorServiceGRP1

停止顺序(反向)

  1. systemctl stop DmMonitorServiceGRP1
  2. systemctl stop DmWatcherServiceGRP1_RT_02
  3. systemctl stop DmWatcherServiceGRP1_RT_01
  4. systemctl stop DmServiceGRP1_RT_02
  5. systemctl stop DmServiceGRP1_RT_01

六、故障汇总

故障现象 根因 解决方案
dmserver MAL端口不匹配 dm.ini DW_PORT与dmmal.ini MAL_INST_DW_PORT不一致 修改两端端口统一
nohup日志文件不存在 log目录未创建 mkdir -p 提前创建
nohup找不到dmserver 使用相对路径启动 替换为/home/dmdba/dmdbms/bin/dmserver
dmwatcher报ini行读取错误-802 dmwatcher.ini配置无效DW_PORT 删除DW_PORT配置行
主库宕机无自动切换 监视器MON_DW_CONFIRM=0或未启动 开启确认监视器并后台运行
kill后主库自动拉起,不切换 INST_AUTO_RESTART=1 连续kill进程,故障超时后触发切换
端口占用启动失败 残留dmserver/dmwatcher进程 pkill清理全部进程后重启
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服