注册
达梦DM8实时主备守护集群搭建实战指南
技术分享/ 文章详情 /

达梦DM8实时主备守护集群搭建实战指南

秧秧 2026/07/30 413 0 0

一、前言

在数据库生产环境中,单节点部署最大的痛点就是单点故障——服务器宕机、进程异常都可能导致业务中断。而达梦数据守护集群(Data Watch)是目前政企生产环境中最主流、最稳定的高可用方案,相比传统第三方高可用组件,达梦原生主备集群具备内核级支持、无需额外插件、秒级自动切换、数据零丢失等优势,完全适配政务、能源、金融等信创生产环境。
本文将以一主一备+确认监视器的架构为例,详细记录达梦DM8实时主备守护集群的完整搭建过程。

二、什么是达梦数据守护集群?

达梦实时主备集群是数据守护(Data Watch)的一种高可用解决方案,由一个主库和一个或多个配置了实时(REALTIME)归档的备库组成。
核心原理:主库修改数据产生的Redo日志,在写入联机日志文件之前发送到备库,备库通过重演Redo日志与主库保持数据同步。
核心组件包括:

  • 主库(Primary):承担主要业务读写请求,产生事务日志
  • 备库(Standby):同步主库事务日志并重演,主库故障时接管服务
  • 守护进程(DmWatcher):监控主备库状态,协调故障切换
  • 监视器(DmMonitor):监控集群状态,支持确认模式(自动切换)和非确认模式(手动切换)

三、环境规划

3.1 节点规划

说明:本次搭建采用单机多实例部署方式,即在同一台物理服务器上运行主库(GRP1_RT_01)和备库(GRP1_RT_02)两个达梦数据库实例,通过不同的端口号加以区分。该方案适用于功能测试、POC验证等场景,若迁移至生产环境,请将各节点部署至不同的物理服务器并修改对应的IP地址。

项目 A 机器 B 机器
心跳 IP 192.168.200.225 192.168.200.225
实例名 GRP1_RT_01 GRP1_RT_02
实例端口 5236 5237
MAL 端口 5336 5337
MAL 守护进程端口 5436 5437
守护进程端口 5536 5537
OGUID 45331 45331
守护组 GRP1 GRP1
安装目录 /opt/dmdbms /opt/dmdbms
实例目录 /opt/dmdbms/data1/ /opt/dmdbms/data2/
归档上限 (MB) 51200 51200

3.2 前置要求

在搭建集群之前,需要确认以下事项:

  1. 操作系统:建议使用相同的Linux发行版(如CentOS 7、麒麟V10)
  2. 达梦版本:所有节点必须完全一致
  3. 初始化参数:主备数据库的页大小、字符集、大小写敏感等参数必须一致
  4. 时间同步:各节点服务器时间需同步
  5. 防火墙:需关闭防火墙或为相关端口配置安全策略
  6. 网络:节点间网络延迟应尽可能低

四、集群搭建实战

4.1 配置A机器(主库)

步骤1:初始化实例

[dmdba@~]$ /opt/dmdbms/bin/dminit PATH=/opt/dmdbms/data1/ \
  INSTANCE_NAME=GRP1_RT_01 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048 \
  SYSDBA_PWD=Dameng@123 SYSAUDITOR_PWD=Dameng@123

踩坑提醒:达梦新版要求必须指定SYSDBA_PWD和SYSAUDITOR_PWD,且密码需包含大小写字母和数字。另外,建议密码中不要使用@等特殊符号,可能导致识别失败。

步骤2:启动实例并开启归档

# 前台启动实例
[dmdba@~]$ /opt/dmdbms/bin/dmserver /opt/dmdbms/data1/DAMENG/dm.ini

另开一个终端,使用disql连接并配置:

[dmdba@~]$ /opt/dmdbms/bin/disql SYSDBA/'"Dameng@123"':5236
SQL> ALTER DATABASE MOUNT;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE ADD ARCHIVELOG 'DEST=/opt/dmdbms/data1/DAMENG/arch, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=51200';

步骤3:修改dm.ini参数

SQL> SP_SET_PARA_VALUE (2,'PORT_NUM',5236);
SQL> SP_SET_PARA_VALUE (2,'DW_INACTIVE_INTERVAL',60);
SQL> SP_SET_PARA_VALUE (2,'ALTER_MODE_STATUS',0);
SQL> SP_SET_PARA_VALUE (2,'ENABLE_OFFLINE_TS',2);
SQL> SP_SET_PARA_VALUE (2,'MAL_INI',1);
SQL> SP_SET_PARA_VALUE (2,'RLOG_SEND_APPLY_MON',64);

步骤4:设置OGUID并切换为主库模式

SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL> SP_SET_OGUID(45331);
SQL> ALTER DATABASE PRIMARY;
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

步骤5:备份数据

SQL> ALTER DATABASE OPEN;
SQL> BACKUP DATABASE BACKUPSET '/opt/dmdbms/data1/DAMENG/bak/BACKUP_FILE';
SQL> ALTER DATABASE MOUNT;

备份完成后关闭前台实例。

步骤6:创建dmarch.ini(归档配置)

[dmdba@~]$ vi /opt/dmdbms/data1/DAMENG/dmarch.ini
ARCH_WAIT_APPLY = 0    # 0:高性能 1:事务一致

[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL
ARCH_DEST = /opt/dmdbms/data1/DAMENG/arch/
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 51200

[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME   # 实时归档
ARCH_DEST = GRP1_RT_02 # 实时归档目标实例名(备库)

说明:实时归档(REALTIME)只在主库生效,主库在Redo日志写入联机日志文件前将日志发送到备库。生产环境核心系统强烈建议使用REALTIME模式,可实现RPO≈0的数据零丢失。

步骤7:创建dmmal.ini(MAL通信配置)

注意:dmmal.ini在主备节点内容完全相同。

[dmdba@~]$ vi /opt/dmdbms/data1/DAMENG/dmmal.ini
MAL_CHECK_INTERVAL = 10      # MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 10  # 判定MAL链路断开的时间
MAL_TEMP_PATH = /opt/dmdbms/data1/malpath/
MAL_BUF_SIZE = 512
MAL_SYS_BUF_SIZE = 2048
MAL_COMPRESS_LEVEL = 0

[MAL_INST1]
MAL_INST_NAME = GRP1_RT_01
MAL_HOST = 192.168.200.225
MAL_PORT = 5336
MAL_INST_HOST = 192.168.200.225
MAL_INST_PORT = 5236
MAL_DW_PORT = 5436
MAL_INST_DW_PORT = 5536

[MAL_INST2]
MAL_INST_NAME = GRP1_RT_02
MAL_HOST = 192.168.200.225
MAL_PORT = 5337
MAL_INST_HOST = 192.168.200.225
MAL_INST_PORT = 5237
MAL_DW_PORT = 5437
MAL_INST_DW_PORT = 5537

步骤8:创建dmwatcher.ini(守护进程配置)

[dmdba@~]$ vi /opt/dmdbms/data1/DAMENG/dmwatcher.ini

步骤9:拷贝备份文件到B机器

[dmdba@~]$ cp -r /opt/dmdbms/data1/DAMENG/bak/BACKUP_FILE /opt/dmdbms/data2/DAMENG/bak

步骤10:注册服务

[root@~]# /opt/dmdbms/script/root/dm_service_installer.sh -t dmserver \
  -p GRP1_RT_01 -dm_ini /opt/dmdbms/data1/DAMENG/dm.ini

[root@~]# /opt/dmdbms/script/root/dm_service_installer.sh -t dmwatcher \
  -p GRP1_RT_01 -watcher_ini /opt/dmdbms/data1/DAMENG/dmwatcher.ini

4.2 配置B机器(备库)

步骤1:初始化实例

[dmdba@~]$ /opt/dmdbms/bin/dminit PATH=/opt/dmdbms/data2/ \
  INSTANCE_NAME=GRP1_RT_02 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048 \
  SYSDBA_PWD=Dameng@123 SYSAUDITOR_PWD=Dameng@123

步骤2:创建dmarch.ini(备库归档指向主库)

[dmdba@~]$ vi /opt/dmdbms/data2/DAMENG/dmarch.ini
ARCH_WAIT_APPLY = 0

[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL
ARCH_DEST = /opt/dmdbms/data2/DAMENG/arch/
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 51200

[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = GRP1_RT_01    # 指向主库

步骤3:配置dm.ini

启动备库实例并修改参数:

[dmdba@~]$ /opt/dmdbms/bin/dmserver /opt/dmdbms/data2/DAMENG/dm.ini
[dmdba@~]$ /opt/dmdbms/bin/disql SYSDBA/'"Dameng@123"':5237

SQL> SP_SET_PARA_VALUE (2,'PORT_NUM',5237);
SQL> SP_SET_PARA_VALUE (2,'DW_INACTIVE_INTERVAL',60);
SQL> SP_SET_PARA_VALUE (2,'ALTER_MODE_STATUS',0);
SQL> SP_SET_PARA_VALUE (2,'ENABLE_OFFLINE_TS',2);
SQL> SP_SET_PARA_VALUE (2,'MAL_INI',1);
SQL> SP_SET_PARA_VALUE (2,'ARCH_INI',1);
SQL> SP_SET_PARA_VALUE (2,'RLOG_SEND_APPLY_MON',64);

SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL> SP_SET_OGUID(45331);
SQL> ALTER DATABASE STANDBY;   # 设置为备库模式
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

步骤4:复制配置文件

将A机器的dmmal.ini和dmwatcher.ini复制到B机器对应目录,注意配置文件的路径要对应。

步骤5:恢复数据

[dmdba@~]$ /opt/dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/opt/dmdbms/data2/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/data2/DAMENG/bak/BACKUP_FILE'"

[dmdba@~]$ /opt/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/opt/dmdbms/data2/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/data2/DAMENG/bak/BACKUP_FILE'"

[dmdba@~]$ /opt/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/opt/dmdbms/data2/DAMENG/dm.ini' UPDATE DB_MAGIC"

踩坑提醒:若初始化后从未正常启动过,dmrman备份会报错RMAN[-8029],必须先正常启动一次再关闭。

步骤6:注册服务

[root@~]# /opt/dmdbms/script/root/dm_service_installer.sh -t dmserver \
  -p GRP1_RT_02 -dm_ini /opt/dmdbms/data2/DAMENG/dm.ini

[root@~]# /opt/dmdbms/script/root/dm_service_installer.sh -t dmwatcher \
  -p GRP1_RT_02 -watcher_ini /opt/dmdbms/data2/DAMENG/dmwatcher.ini

4.3 配置确认监视器

确认监视器是实现故障自动切换的关键组件。

[dmdba@~]$ vi /opt/dmdbms/bin/dmmonitor.ini
MON_DW_CONFIRM = 1                    # 1:确认模式(自动切换)
MON_LOG_PATH = /opt/dmdbms/dmmonitor/log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 512
MON_LOG_SPACE_LIMIT = 2048

[GRP1]
MON_INST_OGUID = 45331
MON_DW_IP = 192.168.200.225:5436
MON_DW_IP = 192.168.200.225:5437

注册监视器服务:

[root@~]# /opt/dmdbms/script/root/dm_service_installer.sh -t dmmonitor \
  -p Monitor -monitor_ini /opt/dmdbms/bin/dmmonitor.ini

4.4 启动集群

启动顺序非常重要,需遵循:先实例、再守护进程、最后监视器。

# 1. 启动主库实例(A机器)
[dmdba@~]$ /opt/dmdbms/bin/DmServiceGRP1_RT_01 start

# 2. 启动备库实例(B机器)
[dmdba@~]$ /opt/dmdbms/bin/DmServiceGRP1_RT_02 start

# 3. 启动守护进程(A/B机器)
[dmdba@~]$ /opt/dmdbms/bin/DmWatcherServiceGRP1_RT_01 start
[dmdba@~]$ /opt/dmdbms/bin/DmWatcherServiceGRP1_RT_02 start

# 4. 启动监视器
[dmdba@~]$ /opt/dmdbms/bin/DmMonitorServiceMonitor start

停止顺序则相反:先监视器、再守护进程、最后实例。

五、常见问题与解决方案

5.1 防火墙未关闭会导致节点间通信失败,集群无法正常组建。

# 停止防火墙
sudo systemctl stop firewalld
# 禁用防火墙(开机不自启)
sudo systemctl disable firewalld
# 查看防火墙状态
sudo systemctl status firewalld

5.2 残留分裂标记文件

集群异常分裂后,备库目录下可能残留dmwatcher.ctl标记文件,导致集群无法正常启动。

# 查找分裂标记文件
find /opt/dmdbms/data2/DAMENG -name "dmwatcher.ctl"

# 停止备库实例及守护进程
[dmdba@~]$ /opt/dmdbms/bin/DmWatcherServiceGRP1_RT_02 stop
[dmdba@~]$ /opt/dmdbms/bin/DmServiceGRP1_RT_02 stop

# 确认全部关闭
[dmdba@~]$ ps -ef | grep -E "dmserver|dmwatcher" | grep -v grep

# 重命名分裂标记文件
[dmdba@~]$ mv /opt/dmdbms/data2/DAMENG/dmwatcher.ctl /opt/dmdbms/data2/DAMENG/dmwatcher.ctl.bak

六、总结

达梦DM8数据守护集群的搭建主要分为以下几个核心步骤:

  1. 环境准备:关闭防火墙、同步时间、统一参数
  2. 主库配置:初始化实例→开启归档→配置dm.ini→设置OGUID和主库模式→备份数据
  3. 配置文件:创建dmarch.ini、dmmal.ini、dmwatcher.ini三大核心配置文件
  4. 备库配置:初始化实例→恢复数据→设置备库模式→复制配置文件
  5. 监视器配置:配置确认监视器实现自动切换
  6. 启动验证:按正确顺序启动集群并验证状态
    其中,dmmal.ini负责MAL通信(心跳检测和日志传输通道),dmarch.ini负责归档同步配置,dmwatcher.ini负责守护进程行为控制。这三个配置文件是集群能否正常运转的关键,配置时需特别注意主备节点间的参数对应关系。
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服