注册
DM8 数据守护集群搭建手册
技术分享/ 文章详情 /

DM8 数据守护集群搭建手册

xixi 2026/07/31 246 0 0

摘要:本文基于 CentOS 7 和达梦数据库 DM8(V8 20260707),手把手搭建由主库和备库组成的数据守护(DataWatch)集群,涵盖创建虚拟机、安装数据库、配置主备同步,并通过截图验证每个关键步骤的执行结果。

1. 概述

数据守护是达梦数据库提供的高可用解决方案,通过实时日志传输、日志重演以及 Watcher 与 Monitor 组件协同工作,实现数据库主备实时同步、故障自动监测、主备切换及故障恢复等功能。本文档基于 CentOS 7 操作系统和达梦数据库 DM8(V8 20260707)版本,搭建一套由一个主库和一个备库组成的数据守护集群。
本实验采用 KVM 创建两台虚拟机分别部署主库和备库,使用 virt-install 命令安装系统,并通过配置归档、MAL 通信、Watcher 和 Monitor,实现主备数据库实时同步。在此基础上,对数据同步、主库故障接管、故障恢复重新加入集群以及主备角色切换等功能进行验证。

2. 操作环境

项目 配置
虚拟化平台 KVM(Kernel-based Virtual Machine)
操作系统 CentOS Linux 7 x86_64
CPU Intel® Xeon® 6966P-C(KVM 虚拟 CPU)
内存 50GB
磁盘 50GB
数据库版本 DM8 V8(20260707)

3. 搭建守护集群前准备

3.1 创建虚拟机

步骤1:检查 KVM 嵌套虚拟化功能是否开启
执行以下命令检查 KVM 嵌套虚拟化状态:

# 检查嵌套虚拟化是否开启 cat /sys/module/kvm_intel/parameters/nested # 输出 N 或 0 表示未开启 # 验证 CPU 是否支持硬件虚拟化扩展 grep -E '(vmx|svm)' /proc/cpuinfo # 有输出(显示 vmx)表示支持 Intel 虚拟化技术 (VT-x) # 临时开启嵌套虚拟化功能 modprobe -r kvm_intel modprobe kvm_intel nested=1 # 永久开启 echo 'options kvm_intel nested=1' >> /etc/modprobe.d/kvm.conf

步骤2:安装 KVM 及相关组件
安装必要的软件包:

yum install -y qemu-kvm libvirt virt-install virt-manager libvirt-client bridge-utils

各组件说明:

  • qemu-kvm:KVM 的核心用户空间组件,负责模拟 CPU、内存、磁盘等设备
  • libvirt:虚拟化 API 守护进程,提供统一接口管理不同虚拟化技术
  • virt-install:命令行工具,用于创建和安装新的虚拟机
  • bridge-utils:网络桥接工具,使虚拟机可直接连接到物理网络
  • virt-manager:图形化虚拟机管理工具
  • libvirt-client:包含命令行工具 virsh

启动并设置 libvirtd 服务开机自启:

systemctl start libvirtd
systemctl enable libvirtd

检查内核模块是否加载:

lsmod | grep kvm

输出包含 kvm_intel 和 kvm,说明环境就绪。
步骤3:准备存储池与镜像
创建存储目录:

mkdir -p /var/lib/libvirt/images/iso mkdir -p /var/lib/libvirt/images/vms

-p 参数会自动创建不存在的父目录,如果目标目录已存在则静默忽略,适合脚本化操作。
准备 CentOS 7 安装镜像和达梦数据库安装包,通过 SFTP 或 SCP 传输到宿主机:

# 方法1:SFTP 传输 sftp -P 5215 root@10.36.41.11 cd /var/lib/libvirt/images/iso/ put C:/Users/huangyuchen/Downloads/benchmarksql-5.0.zip 方法2:SCP 传输 scp -P 5253 C:/study/06-iso/CentOS-7-x86_64-DVD-1804.iso root@10.36.41.11:/var/lib/libvirt/images/iso/

步骤4:创建第一台虚拟机(dm-node1)
使用 virt-install 命令创建虚拟机:

sudo virt-install \ --name dm-node1 \ --ram 4096 \ --vcpus 2 \ --disk path=/var/lib/libvirt/images/vms/dm-node1.qcow2,size=30,format=qcow2 \ --location /var/lib/libvirt/images/iso/CentOS-7-x86_64-DVD-1804.iso \ --network network=default \ --graphics none \ --os-type linux \ --os-variant centos7.0 \ --console pty,target_type=serial \ --extra-args 'console=ttyS0,115200n8 serial'

–extra-args 参数告诉 CentOS 内核将输出重定向到 ttyS0(串口),波特率 115200,这是实现无图形安装的核心。
安装过程中依次配置:

  • 设置语言:选择英文或中文
  • 设置时区:选择 Asia/Shanghai
  • 配置软件选择:按 r 刷新页面,确认第 4 项状态变为 [x] 正常勾选
  • 设置磁盘:看到磁盘(如 vda 或 sda,约 30GB),确保前面有 [x] 标记,输入 c 确认使用该磁盘进行安装。自动分区选项界面保持默认选择 [x] 2) Use All Space,输入 c 确认。分区方案保持默认选择 [x] 3) LVM(逻辑卷管理),灵活性高,便于后续调整空间
  • 配置网络:输入数字 2 进入 eth0 配置界面,输入 7 回车勾选 [x] Connect automatically after reboot 保证开机自动联网,输入 8 回车勾选 [x] Apply configuration in installer 让配置立即生效
  • 配置主机名:设置为 dm-node1
  • 设置 root 密码

最后按 b 开始安装。当屏幕提示 Installation complete. Press enter to quit 时,按回车键,虚拟机将自动重启。
重启后用 root 登录,查看 IP 地址:

ip addr

dm-node1 的 IP 地址为 192.168.122.67。
**重要提示:**安装完虚拟机后务必关闭防火墙,否则两个虚拟机之间的数据库端口将无法通信:

sudo systemctl stop firewalld
sudo systemctl disable firewalld

步骤5:创建第二台虚拟机(dm-node2)
将虚拟机名改为 dm-node2,其他参数与第一台相同:

sudo virt-install \
--name dm-node2 \
--ram 4096 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/vms/dm-node2.qcow2,size=30,format=qcow2 \
--location /var/lib/libvirt/images/iso/CentOS-7-x86_64-DVD-1804.iso \
--network network=default \
--graphics none \
--os-type linux \
--os-variant centos7.0 \
--console pty,target_type=serial \
--extra-args 'console=ttyS0,115200n8 serial'
安装完成后 dm-node2 的 IP 地址为 192.168.122.139。

从宿主机可分别通过 SSH 连接:

# dm-node1
ssh root@192.168.122.67
# dm-node2
ssh root@192.168.122.139

3.2 安装达梦数据库

步骤1:上传安装包
在宿主机上执行 SCP 传输:

scp /mnt/nas/dm8_20260710_x86_centos7_64.iso root@192.168.122.67:/opt/

步骤2:数据库安装前准备
参照达梦数据库安装部署手册的步骤进行准备。在目录规划中,需要额外创建监控器日志保存目录(两台虚拟机都要执行):

mkdir -p /dmdata/log
chown -R dmdba:dinstall /dmdata/log
chmod -R 755 /dmdata/log

步骤3:安装数据库
按照达梦数据库安装手册中的步骤完成安装。
注意:数据库安装完成后务必启动 DMAP 服务,否则会影响后续的数据库备份操作:

cd /home/dmdba/dmdbms/bin
./DmAPService start

步骤4:dm-node1 实例初始化并注册服务

# 实例初始化
./dminit path=/dmdata/data INSTANCE_NAME=DMSERVER01 DB_NAME=DMDBA PORT_NUM=5234 PAGE_SIZE=32 EXTENT_SIZE=32 CASE_SENSITIVE=y CHARSET=1 LOG_SIZE=2048 SYSDBA_PWD=Dmdba123 SYSAUDITOR_PWD=Dmdba123
# 注册服务
./dm_service_installer.sh -t dmserver -dm_ini /dmdata/data/DMDBA/dm.ini -p DMSERVER01
# 拍摄快照(便于后续回滚)
virsh snapshot-create-as dm-node1 snap_dm_installed --description "进行数据守护集群搭建前"
virsh snapshot-list dm-node1

步骤5:dm-node2 实例初始化并注册服务
注意:不要把备库当成新的独立数据库使用,执行 dminit 仅为了生成配置文件和目录:

# 实例初始化
./dminit path=/dmdata/data INSTANCE_NAME=DMSERVER02 DB_NAME=DMDBA PORT_NUM=5234 PAGE_SIZE=32 EXTENT_SIZE=32 CASE_SENSITIVE=y CHARSET=1 LOG_SIZE=2048 SYSDBA_PWD=Dmdba123 SYSAUDITOR_PWD=Dmdba123
# 注册服务
./dm_service_installer.sh -t dmserver -dm_ini /dmdata/data/DMDBA/dm.ini -p DMSERVER02
# 拍摄快照
virsh snapshot-create-as dm-node2 snap_before_dm_protect --description "进行数据守护集群搭建前"

4. 搭建数据守护集群

4.1 规划端口

首先,规划好集群中各个组件的通信端口:

参数 dm-node1 (主) dm-node2 (备)
IP 192.168.122.67 192.168.122.139
实例端口 (PORT_NUM) 5234 5234
MAL 监听端口 (MAL_PORT) 5235 5235
守护进程端口 (MAL_DW_PORT) 5236 5236
实例监听守护进程端口 (MAL_INST_DW_PORT) 5237 5237
OGUID 45331 45331

4.2 配置主库(dm-node1)

1)修改 dm.ini

vi /dmdata/data/DMDBA/dm.ini

修改或确认以下参数:

INSTANCE_NAME = DMSERVER01 PORT_NUM = 5234 DW_INACTIVE_INTERVAL = 60 ALTER_MODE_STATUS = 0 ENABLE_OFFLINE_TS = 2 MAL_INI = 1 ARCH_INI = 1 RLOG_SEND_APPLY_MON = 64

2)创建并配置 dmmal.ini

vi /dmdata/data/DMDBA/dmmal.ini

内容如下:

MAL_CHECK_INTERVAL = 5 MAL_CONN_FAIL_INTERVAL = 5 [MAL_INST1] MAL_INST_NAME = DMSERVER01 MAL_HOST = 192.168.122.67 MAL_PORT = 5235 MAL_INST_HOST = 192.168.122.67 MAL_INST_PORT = 5234 MAL_DW_PORT = 5236 MAL_INST_DW_PORT = 5237 [MAL_INST2] MAL_INST_NAME = DMSERVER02 MAL_HOST = 192.168.122.139 MAL_PORT = 5235 MAL_INST_HOST = 192.168.122.139 MAL_INST_PORT = 5234 MAL_DW_PORT = 5236 MAL_INST_DW_PORT = 5237

3)创建并配置 dmarch.ini

vi /dmdata/data/DMDBA/dmarch.ini

内容如下:

[ARCHIVE_REALTIME] ARCH_TYPE = REALTIME ARCH_DEST = DMSERVER02 ARCH_WAIT_APPLY = 0 [ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL ARCH_DEST = /dmdata/arch ARCH_FILE_SIZE = 128 ARCH_SPACE_LIMIT = 0

4)启动数据库并开启归档

# 启动数据库 ./DmServiceDMSERVER01 start # 连接数据库 ./disql SYSDBA/Dmdba123@localhost:5234 # 查看归档状态 SELECT * FROM V$ARCH_STATUS;

5)主库全量备份

# 执行完全备份 BACKUP DATABASE FULL BACKUPSET '/dmdata/dmbak/db_full_bak_01'; # 查看备份文件 ls -lh /dmdata/dmbak # 复制备份到备库 scp -r /dmdata/dmbak/db_full_bak_01 dmdba@192.168.122.139:/dmdata/dmbak/

4.3 配置备库(dm-node2)

1)确认没有数据库进程在运行

ps -ef | grep dmserver

2)校验备份集

cd /home/dmdba/dmdbms/bin ./dmrman CTLSTMT="CHECK BACKUPSET '/dmdata/dmbak/db_full_bak_01';"

3)执行数据库还原

./dmrman CTLSTMT="RESTORE DATABASE '/dmdata/data/DMDBA/dm.ini' FROM BACKUPSET '/dmdata/dmbak/db_full_bak_01';"

4)执行数据库恢复

./dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data/DMDBA/dm.ini' FOR STANDBY FROM BACKUPSET '/dmdata/dmbak/db_full_bak_01';"

5)更新 DB_MAGIC

./dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data/DMDBA/dm.ini' UPDATE DB_MAGIC;"

6)修改备库配置

修改 dm.ini,将 INSTANCE_NAME 改为 DMSERVER02

vi /dmdata/data/DMDBA/dm.ini # INSTANCE_NAME = DMSERVER02

dmmal.ini 与主库保持一致。

修改 dmarch.ini,将 ARCH_DEST 指向主库:

vi /dmdata/data/DMDBA/dmarch.ini # ARCH_DEST = DMSERVER01

4.4 修改主备角色

1)主库设置

以 MOUNT 状态启动主库:

./dmserver /dmdata/data/DMDBA/dm.ini mount

新开一个终端窗口,登录数据库执行配置命令:

-- 允许修改模式状态 SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); -- 修改数据库模式为主库 ALTER DATABASE PRIMARY; -- 设置 OGUID SP_SET_OGUID(45331); -- 恢复模式状态保护 SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

配置完成后,关闭前台启动的 MOUNT 进程。

2)备库设置

同样以 MOUNT 状态启动备库,并执行类似命令,但将数据库模式改为 STANDBY:

./dmserver /dmdata/data/DMDBA/dm.ini mount

新开终端:

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

配置完成后,关闭前台启动的 MOUNT 进程。

4.5 配置 Watcher

1)创建 dmwatcher.ini

在两台机器上创建 /dmdata/data/DMDBA/dmwatcher.ini,内容如下:

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

注意: 在 dm-node2 上,INST_STARTUP_CMD 需要改为 DmServiceDMSERVER02 start

2)注册 Watcher 服务

在两个节点上以 root 用户执行:

cd /home/dmdba/dmdbms/script/root # dm-node1 ./dm_service_installer.sh -t dmwatcher -watcher_ini /dmdata/data/DMDBA/dmwatcher.ini -p DMSERVER01_WATCHER # dm-node2 ./dm_service_installer.sh -t dmwatcher -watcher_ini /dmdata/data/DMDBA/dmwatcher.ini -p DMSERVER02_WATCHER # 查看服务是否注册成功 systemctl list-unit-files | grep WATCHER

4.6 配置 Monitor

监视器可以部署在任意一台节点上,或者单独的第三台机器。这里我们部署在 dm-node1 上。

vi /dmdata/data/DMDBA/dmmonitor.ini

内容如下:

MON_DW_CONFIRM = 1 MON_LOG_PATH = /dmdata/log MON_LOG_INTERVAL = 60 MON_LOG_FILE_SIZE = 32 MON_LOG_SPACE_LIMIT = 0 [GRP1] MON_INST_OGUID = 45331 MON_DW_IP = 192.168.122.67:5236 MON_DW_IP = 192.168.122.139:5236

4.7 启动集群

在 DM8 数据守护中,启动顺序为:先启动数据库实例,再启动 Watcher,最后启动 Monitor

1)启动主库 dm-node1

./DmServiceDMSERVER01 start

2)启动备库 dm-node2

./DmServiceDMSERVER02 start

3)启动 Watcher

# dm-node1 systemctl start DmWatcherServiceDMSERVER01_WATCHER # dm-node2 systemctl start DmWatcherServiceDMSERVER02_WATCHER

4)启动 Monitor(只在 dm-node1)

./dmmonitor /dmdata/data/DMDBA/dmmonitor.ini

在 Monitor 中输入 show 命令,可以查看集群的运行状态。
image.png

5. 验证

集群搭建完成后,我们来验证数据同步功能。

1)在主库创建测试表并插入数据

./disql SYSDBA/Dmdba123@192.168.122.67:5234

执行 SQL:

CREATE TABLE TEST_GUARD( ID INT PRIMARY KEY, NAME VARCHAR(50), CREATE_TIME DATETIME ); INSERT INTO TEST_GUARD VALUES (1,'dm-node1',SYSDATE); COMMIT; SELECT * FROM TEST_GUARD;

注意: 一定要执行 COMMIT 提交事务,否则备库无法同步到数据。
image.png

2)在备库查询

./disql SYSDBA/Dmdba123@192.168.122.139:5234

执行 SQL:

SELECT * FROM TEST_GUARD;

image.png
如果能够查询到刚刚插入的数据,说明主备同步配置成功。

3)查看 Monitor 状态

在 Monitor 界面中,可以实时看到主备库的状态、日志发送和重演情况。
image.png

6. 常见问题

6.1 DMAP(达梦备份代理)没有正常工作

image.png

原因: DMAP 服务没有启动。

解决方法:

cd /home/dmdba/dmdbms/bin ./DmAPService start

6.2 备库 MOUNT 状态启动失败

image.png
原因: 数据库还原恢复后,没有更新 DB_MAGIC。

解决方法:

cd /home/dmdba/dmdbms/bin ./dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data/DMDBA/dm.ini' UPDATE DB_MAGIC;"

6.3 主库写入成功,备库没有同步到表数据

原因: 主库上的插入操作没有提交事务。

解决方法: 在主库执行 COMMIT; 提交事务。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服