注册
DM8 DMWATCH 主备守护集群安装部署实战
专栏/技术分享/ 文章详情 /

DM8 DMWATCH 主备守护集群安装部署实战

科技不收敛 2026/09/23 249 0 0
摘要

DM8 DMWATCH 主备守护集群安装部署实战

DM 数据守护(Data Watch,运维中也常简称 DMWATCH)通过 Redo 日志传输和备库重演构建主备数据库,并由 dmwatcher、dmmonitor 完成状态监控、主备切换和故障接管。本文以 Linux 7 x86_64、DM7、1 主 1 备为例,搭建一套使用实时归档、支持自动故障切换的数据守护环境。

  • DM8 不同补丁版本的数据守护配置和监视器命令可能有差异,最终以本机 $DM_HOME/doc 中与数据库版本配套的手册为准。
  • 自动切换需要独立的确认监视器。本文虽然是 1 主 1 备,但实际使用三台主机:两台数据库服务器和一台监视器服务器。

一、DMWATCH 架构介绍

1.1 部署拓扑

                       +---------------------------+
                       | 独立确认监视器 dmmonitor  |
                       | MON_DW_CONFIRM = 1        |
                       +------------+--------------+
                                    |
                     状态确认、切换命令、故障仲裁
                       +------------+-------------+
                       |                          |
+----------------------v----+             +-------v-------------------+
| 主库节点                  |  REALTIME   | 备库节点                  |
| GRP1_RT_01                | Redo/MAL    | GRP1_RT_02                |
| PRIMARY + OPEN            +-----------> | STANDBY + OPEN            |
| dmserver + dmwatcher      |             | dmserver + dmwatcher      |
+---------------------------+             +---------------------------+

1.2 体系结构组件

组件 部署位置 主要作用
主库 数据库节点 A 接收业务读写,生成 Redo,并通过 MAL 向实时备库发送日志
备库 数据库节点 B 接收主库 Redo,写入日志并重演;通常提供只读能力,也可在切换后成为主库
dmwatcher 每个数据库节点 监控本地实例、交换主备状态、执行监视器命令、参与故障处理和故障重加入
dmmonitor 建议独立第三台主机 汇总守护状态,提供 show、switchover、takeover 等管理命令;确认监视器参与自动接管决策
MAL 主备数据库之间 基于 TCP 的内部通信系统,用于 Redo 传输、实例与守护进程通信、守护进程之间通信
本地归档 主库和备库本地磁盘 保存归档日志,为恢复、追日志和备库重建提供基础
实时归档 当前 PRIMARY → STANDBY 主库在 Redo 写入本地联机日志前发送给备库,是实时主备的基础

同一守护组内的数据库、dmwatcher 和 dmmonitor 必须使用相同的 OGUID;实例名 INSTANCE_NAME 须唯一。

1.3 dmwatcher

dmwatcher 是数据库实例和监视器之间的控制桥梁。数据库实例定期向本地守护进程上报进程 ID、实例模式、实例状态、LSN、MAL 链路和归档状态。

1.4 dmmonitor 的作用与常用命令

监视器不直接连接数据库实例执行管理动作,而是连接 dmwatcher,由守护进程解析并转发命令。
常用show来查看全部守护组和实例状态

1.5 Redo、归档与备库重演

实时归档默认采用高性能模式,即 ARCH_WAIT_APPLY=0:

sequenceDiagram
    participant C as 客户端
    participant P as 主库
    participant S as 备库

    C->>P: COMMIT
    P->>S: 发送 RLOG_PKG
    S-->>P: 已收到日志包
    P->>P: 写入本地联机 Redo
    P-->>C: COMMIT 成功
    S->>S: 异步加入重演任务并应用

当 ARCH_WAIT_APPLY=0 时,主库等待备库确认“已经收到日志”,但不等待备库完成重演。因此备库查询可能存在很短的延迟。

当 ARCH_WAIT_APPLY=1 时,备库完成重演后才响应主库,主库再响应客户端提交。事务一致性更强,但网络时延和备库重演速度会直接增加提交耗时。

二、安装流程概述

flowchart TD
    A[环境与端口规划] --> B[两节点安装相同版本 DM8]
    B --> C[初始化并启动主库]
    C --> D[开启本地归档并执行全库备份]
    D --> E[初始化备库并通过备份集还原]
    E --> F[配置 dm.ini / dmmal.ini / dmarch.ini]
    F --> G[配置 dmwatcher.ini 与共同 OGUID]
    G --> H[主库设为 PRIMARY]
    H --> I[备库设为 STANDBY]
    I --> J[启动两端 dmwatcher]
    J --> K[启动独立 dmmonitor]
    K --> L[验证角色、归档、LSN 与业务数据]
    L --> M[正常切换与故障演练]
阶段 做什么 为什么
环境准备 统一 OS、CPU、DM8 版本、时钟、用户、路径和端口 减少版本、权限和网络差异导致的故障
主库初始化 固化页大小、字符集、大小写等不可随意变更的属性 主备物理结构必须兼容
主库备份 生成一致的全库备份集 备库必须从主库同一数据基线创建
备库还原 RESTORE、RECOVER、UPDATE DB_MAGIC 还原数据并为备库生成新的数据库魔数
配置通信和归档 建立 MAL 通信及双向实时归档配置 当前主库发送日志,切换后新主库仍能反向发送
配置守护 配置一致的组名、OGUID 和故障模式 让两个守护进程属于同一逻辑系统
启动和验证 以 MOUNT 启动、设置角色、启动守护和监视器 由守护系统安全打开并管理主备库

三、安装详细流程

3.1 示例环境与端口规划

3.1.1 主机规划

项目 主库节点 备库节点
主机名 dm-primary dm-standby
业务 IP 192.168.252.17 192.168.252.18
数据库名 DAMENG DAMENG
实例名 PRI STA
OGUID 45331 45331
守护组 GRP1 GRP1
软件目录 /home/dmdba/dm/dmdbms/ /home/dmdba/dm/dmdbms/
实例目录 /dbdata/dmdata/DAMENG /dbdata/dmdata/DAMENG

3.1.2 端口规划

端口 配置项 监听方 用途
5236/tcp PORT_NUM、MAL_INST_PORT 两个数据库实例 客户端和数据库服务端口
5336/tcp MAL_PORT 两个数据库实例 主备数据库 MAL 数据通信和 Redo 传输
5436/tcp MAL_DW_PORT 两个 dmwatcher 守护进程间以及监视器到守护进程的通信
5536/tcp MAL_INST_DW_PORT 两个数据库实例 本地实例与本地守护进程通信

同一端口可以在不同主机上重复使用。端口必须未被占用:

ss -lntp | egrep ':5236|:5336|:5436|:5536'

3.1.3 操作系统基线检查

以下命令在三台主机上执行,只做检查:

cat /etc/redhat-release uname -m uname -r free -h df -h getenforce

要求两台数据库服务器使用相同 CPU 架构、相近的 Linux 7 内核环境和完全一致的 DM8 版本/补丁。生产环境应使用独立、低时延的心跳网络,并对磁盘 IO 做压测。

3.1.4 主库安装

参考官网文档安装软件并初始化
https://eco.dameng.com/document/dm/zh-cn/ops/installation-install.html#1.3%20%E5%88%9D%E5%A7%8B%E5%8C%96%E6%95%B0%E6%8D%AE%E5%BA%93%E5%AE%9E%E4%BE%8B

备份主库数据

[dmdba@bin]$ ./disql sysdba/SYSDBA SQL> BACKUP DATABASE BACKUPSET '/dbbak/dmbak/BACKUP_FILE'; SQL>exit

3.2 主库配置

3.2.1 主库 dm.ini

vi /home/dmdba/dm/dmdbms/bin/dm.ini #将如下参数加入文件结尾处新增或者找到对应参数修改对应的数值 INSTANCE_NAME = GRP1_RT_01 DW_INACTIVE_INTERVAL=60 ALTER_MODE_STATUS=0 ENABLE_OFFLINE_TS=2 MAL_INI=1 RLOG_SEND_APPLY_MON=64 DW_ARCH_SPACE_CHECK=1 DW_ARCH_HANG_CHECK=1

3.2.2 主库 dmmal.ini

dmmal.ini 在主、备节点必须保持一致,并且同时列出两个实例:

MAL_CHECK_INTERVAL = 5 #MAL链路检测时间间隔 MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间 [MAL_INST1] MAL_INST_NAME = GRP1_RT_01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致 MAL_HOST = 192.168.252.17 #根据实际IP 地址配置 MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口 MAL_INST_HOST = 192.168.252.17 #根据实际IP 地址配置 MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致 MAL_DW_PORT = 52141 #实例本地的守护进程监听 TCP 连接的端口 MAL_INST_DW_PORT = 33141 #实例监听守护进程 TCP 连接的端口 [MAL_INST2] MAL_INST_NAME = GRP1_RT_02 MAL_HOST = 192.168.252.18 #根据实际IP 地址配置 MAL_PORT = 61142 MAL_INST_HOST =192.168.252.18 #根据实际IP 地址配置 MAL_INST_PORT = 5236 MAL_DW_PORT = 52142 MAL_INST_DW_PORT = 33142

3.2.3 主库 dmarch.ini

vi /dbdata/dmdata/DAMENG/dmarch.ini ARCH_WAIT_APPLY = 0 [ARCHIVE_LOCAL] ARCH_TYPE = LOCAL ARCH_DEST = /dbarch/dmarch ARCH_FILE_SIZE = 2048 #单个归档大小 ARCH_SPACE_LIMIT = 4096 #根据dbarch目录存储上限的80%设置归档存储上限 [ARCHIVE_REALTIME1] ARCH_TYPE = REALTIME #实时归档类型 ARCH_DEST = GRP1_RT_02 #实时归档目标实例名

主库实时归档目标是备库实例名 GRP1_RT_02。ARCH_DEST 不是 IP,也不是主机名,必须与远端 dm.ini 的 INSTANCE_NAME 完全一致。

3.2.4 主库 dmwatcher.ini

vi /dbdata/dmdata/DAMENG/dmwatcher.ini [GRP1] DW_TYPE = GLOBAL #全局守护类型 DW_MODE = AUTO #MANUAL:故障手切 AUTO:故障自切 DW_ERROR_TIME = 10 #远程守护进程故障认定时间 INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间 INST_ERROR_TIME = 10 #本地实例故障认定时间 INST_OGUID = 453331 #守护系统唯一 OGUID 值 INST_INI = /home/dmdba/dm/dmdbms/bin/dm.ini #dm.ini 配置文件路径 INST_AUTO_RESTART = 1 #打开实例的自动启动功能 INST_STARTUP_CMD =/home/dmdba/dm/dmdbms/bin/dmserverd start #命令行方式启动 RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭 RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭 DW_RECONNECT = 2 DW_FAILOVER_FORCE = 1 INST_SERVICE_IP_CHECK = 1

3.2.5 mount方式启动数据库设置数据库模式

#窗口1 [dmdba@ bin]$ ./dmserver dm.ini mount #启动后见“SYSTEM IS READY.”。新开一个窗口 #窗口2 [dmdba@rhel6 bin]$ ./disql sysdba/SYSDBA SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); SQL> sp_set_oguid(453331); SQL> alter database primary; SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0); SQL>exit #窗口1 #回到窗口1,停前台数据库 输入exit 回车

3.2.6 备份数据传输到备库

[dmdba@bin]$cd /dbbak/dmbak/ [dmdba@dmbak]$ scp -rp BACKUP_FILE/ root@192.168.1.20:/dbbak/dmbak

3.2.7 制作数据守护启动脚本

[dmdba@ bin]$cd /home/dmdba/dm/dmdbms/bin [dmdba@ bin]$cp ./service_template/DmWatcherService ./dmwatcherd [dmdba@ bin]$vi dmwatcherd 修改如下内容 INI_PATH=%INI_PATH% #修改为 INI_PATH=/dbdata/dmdata/DAMENG/dmwatcher.ini :wq 授予执行权限 [dmdba@ bin]$ chmod +x dmwatcherd

3.3 备库安装还原

参考官网文档安装软件并初始化
https://eco.dameng.com/document/dm/zh-cn/ops/installation-install.html#1.3%20%E5%88%9D%E5%A7%8B%E5%8C%96%E6%95%B0%E6%8D%AE%E5%BA%93%E5%AE%9E%E4%BE%8B

3.3.1 还原

[dmdba@ bin]$cd /home/dmdba/dm/dmdbms/bin
[dmdba@ bin]$ ./dmrman
RMAN> restore database '/home/dmdba/dm/dmdbms/bin/dm.ini' from backupset '/dbbak/dmbak/BACKUP_FILE';
RMAN> recover database '/home/dmdba/dm/dmdbms/bin/dm.ini' from backupset '/dbbak/dmbak/BACKUP_FILE';
RMAN> recover database '/home/dmdba/dm/dmdbms/bin/dm.ini' update db_magic;
RMAN>exit

3.4 备库配置

3.4.1 备库 dm.ini

#将如下参数加入文件结尾处新增或者找到对应参数修改对应的数值 INSTANCE_NAME = GRP1_RT_02 DW_INACTIVE_INTERVAL=60 ALTER_MODE_STATUS=0 ENABLE_OFFLINE_TS=2 MAL_INI=1 RLOG_SEND_APPLY_MON=64 DW_ARCH_SPACE_CHECK=1 DW_ARCH_HANG_CHECK=1

3.4.2 备库 dmmal.ini

备库的 dmmal.ini 与主库完全一致:

vi /dbdata/dmdata/DAMENG/dmmal.ini MAL_CHECK_INTERVAL = 5 #MAL链路检测时间间隔 MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间 [MAL_INST1] MAL_INST_NAME = GRP1_RT_01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致 MAL_HOST = 192.168.252.17 #根据实际IP 地址配置 MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口 MAL_INST_HOST = 192.168.252.17 #根据实际IP 地址配置 MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致 MAL_DW_PORT = 52141 #实例本地的守护进程监听 TCP 连接的端口 MAL_INST_DW_PORT = 33141 #实例监听守护进程 TCP 连接的端口 [MAL_INST2] MAL_INST_NAME = GRP1_RT_02 MAL_HOST = 192.168.252.18 #根据实际IP 地址配置 MAL_PORT = 61142 MAL_INST_HOST =192.168.252.18 #根据实际IP 地址配置 MAL_INST_PORT = 5236 MAL_DW_PORT = 52142 MAL_INST_DW_PORT = 33142

3.4.3 备库 dmarch.ini

vi /dbdata/dmdata/DAMENG/dmarch.ini ARCH_WAIT_APPLY = 0 [ARCHIVE_LOCAL] ARCH_TYPE = LOCAL ARCH_DEST = /dbarch/dmarch ARCH_FILE_SIZE = 2048 #单个归档大小 ARCH_SPACE_LIMIT = 4096 #根据dbarch目录存储上限的80%设置归档存储上限 [ARCHIVE_REALTIME1] ARCH_TYPE = REALTIME #实时归档类型 ARCH_DEST = GRP1_RT_01 #实时归档目标实例名

3.4.4 备库 dmwatcher.ini

vi /dbdata/dmdata/DAMENG/dmwatcher.ini [GRP1] DW_TYPE = GLOBAL #全局守护类型 DW_MODE = AUTO #MANUAL:故障手切 AUTO:故障自切 DW_ERROR_TIME = 10 #远程守护进程故障认定时间 INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间 INST_ERROR_TIME = 10 #本地实例故障认定时间 INST_OGUID = 453331 #守护系统唯一 OGUID 值 INST_INI = /home/dmdba/dm/dmdbms/bin/dm.ini #dm.ini 配置文件路径 INST_AUTO_RESTART = 1 #打开实例的自动启动功能 INST_STARTUP_CMD =/home/dmdba/dm/dmdbms/bin/dmserverd start #命令行方式启动 RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭 RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭 DW_RECONNECT = 2 DW_FAILOVER_FORCE = 1 INST_SERVICE_IP_CHECK = 1

3.4.5 mount方式启动数据库设置数据库模式

#窗口1 [dmdba@ bin]$ ./dmserver dm.ini mount #启动后见“SYSTEM IS READY.”。新开一个窗口 #窗口2 [dmdba@rhel6 bin]$ ./disql sysdba/SYSDBA SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); SQL> sp_set_oguid(453331); SQL> alter database standby; SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0); SQL>exit #窗口1 #回到窗口1,停前台数据库 输入exit 回车

3.4.6 制作数据守护启动脚本

[dmdba@ bin]$cd /home/dmdba/dm/dmdbms/bin [dmdba@ bin]$cp ./service_template/DmWatcherService ./dmwatcherd [dmdba@ bin]$vi dmwatcherd 修改如下内容 INI_PATH=%INI_PATH% #修改为 INI_PATH=/dbdata/dmdata/DAMENG/dmwatcher.ini :wq 授予执行权限 [dmdba@ bin]$ chmod +x dmwatcherd

3.5 配置和启动 dmmonitor

3.5.1 确认监视器 dmmonitor.ini`

为了方便,这里在1号节点上创建

cd /home/dmdba/dm/dmdbms/bin vim dmmonitor.ini MON_DW_CONFIRM = 1 MON_LOG_PATH = /home/dmdba/dm/dmdbms/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.252.17:52141 MON_DW_IP = 192.168.252.18:52142 #执行下面的开启 ./dmmonitor /home/dmdba/dm/dmdbms/bin/dmmonitor.ini ## 执行show查看信息

3.6 启动主备集群

3.6.1 启动主库守护进程

#主库服务器 [dmdba@ bin]$cd /home/dmdba/dm/dmdbms/bin [dmdba@ bin]$./dmwatcherd start

3.6.2 启动备库守护进程

#备库服务器
[dmdba@ bin]$cd /home/dmdba/dm/dmdbms/bin
[dmdba@ bin]$./dmwatcherd start

3.6.3 SQL 检查实例角色

分别登录主、备库:

SELECT INSTANCE_NAME, STATUS$, MODE$, OGUID FROM V$INSTANCE;

预期:

实例 STATUS$ MODE$ OGUID
GRP1_RT_01 OPEN PRIMARY 45331
GRP1_RT_02 OPEN STANDBY 45331

3.6.4 业务数据同步测试

在主库执行:

CREATE TABLE SYSDBA.DW_SYNC_TEST ( ID INT PRIMARY KEY, NOTE VARCHAR(100), CREATED_AT TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); INSERT INTO SYSDBA.DW_SYNC_TEST(ID, NOTE) VALUES (1, 'DMWATCH REALTIME TEST'); COMMIT; SELECT * FROM SYSDBA.DW_SYNC_TEST;

在备库只读查询:

SELECT * FROM SYSDBA.DW_SYNC_TEST;

四、参考文档

以下链接均指向达梦官方文档中心,页面内容会随产品版本更新:

  1. 达梦官方文档中心
  2. 数据守护集群安装部署
  3. DM8 数据守护与读写分离集群:概述
  4. DM8 数据守护与读写分离集群:配置文件说明
  5. DM8 数据守护与读写分离集群:守护进程
  6. DM8 数据守护与读写分离集群:监视器
  7. DM8 数据守护使用说明
  8. DM8 安装前准备
  9. DM8 单机安装部署
  10. DM8 产品手册目录
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服