注册
基于 KVM 的一主一实时一异步数据守护集群搭建
技术分享/ 文章详情 /

基于 KVM 的一主一实时一异步数据守护集群搭建

xixi 2026/07/31 213 0 0

1. 概述

本文档基于 CentOS 7 操作系统和达梦数据库 DM8 V8(20260707)版本,详细记录搭建一套由 1 个主库、1 个实时备库和 1 个异步备库组成的数据守护(DataWatch)集群的全过程。

达梦数据库数据守护(DataWatch)是 DM8 提供的高可用解决方案,通过归档日志传输、日志重演、MAL(Message Application Layer)通信机制以及 Watcher、Monitor 等组件,实现数据库主备同步、故障监测、自动切换和故障恢复等功能。其中,实时备库能够实时接收并重演主库日志,保证主备数据的一致性;异步备库采用异步归档方式同步数据,在降低网络带宽占用的同时,为跨机房或远距离容灾提供支持。

本实验采用三台 KVM 虚拟机分别部署主库、实时备库和异步备库,通过配置数据库归档、MAL 通信、DataWatch、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 创建虚拟机

3.1.1 检查 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

3.1.2 安装 KVM 及相关组件

# 安装软件包 yum install -y qemu-kvm libvirt virt-install virt-manager libvirt-client bridge-utils # 启动并设置开机自启 libvirtd 服务 systemctl start libvirtd systemctl enable libvirtd # 检查内核模块是否加载 lsmod | grep kvm # 输出包含 kvm_intel 和 kvm,说明环境就绪

3.1.3 准备存储池与镜像

# 创建镜像和虚拟机存储目录 mkdir -p /var/lib/libvirt/images/iso mkdir -p /var/lib/libvirt/images/vms

3.1.4 创建三台虚拟机

使用 virt-install 命令创建三台虚拟机,分别命名为 dm-node1(主库)、dm-node2(实时备库)、dm-node3(异步备库)。

第一台虚拟机 (dm-node1):

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'

安装过程中需配置语言、时区、软件选择、磁盘分区、网络(确保开机自动联网)、主机名(dm-node1)和 root 密码。安装完成后,查看 IP 地址并关闭防火墙

sudo systemctl stop firewalld sudo systemctl disable firewalld

第二台虚拟机 (dm-node2):
命令与 dm-node1 类似,仅修改 --name--disk path 参数。

第三台虚拟机 (dm-node3):
命令与 dm-node1 类似,仅修改 --name--disk path 参数。

3.1.5 从宿主机连接虚拟机

安装完成后,通过 SSH 连接各虚拟机:

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

3.2 安装达梦数据库

在三台虚拟机上执行相同的数据库安装操作。

3.2.1 上传安装包

在宿主机上将 DM8 安装包传输到各节点:

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

3.2.2 数据库安装前准备

创建监控器日志目录:

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

3.2.3 安装数据库

参照《01-dm8安装部署手册》步骤进行安装。安装完成后,注意启动 DMAP 服务,否则会影响后续数据库备份。

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

3.2.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 # 停止服务(为后续配置准备) systemctl stop DmServiceDMSERVER01

dm-node2 (实时备库):

# 实例初始化(仅生成配置) ./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 # 停止服务 systemctl stop DmServiceDMSERVER02

dm-node3 (异步备库):
操作同 dm-node2,将实例名改为 DMSERVER03

4. 搭建数据守护集群

4.1 规划端口

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

4.2 配置主库 (dm-node1)

4.2.1 修改 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 TIMER_INI = 1

4.2.1 修改 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 TIMER_INI = 1

4.2.2 修改 dmmal.ini

/dmdata/data/DMDBA/dmmal.ini 文件中配置 MAL(Message Application Layer)通信,包含三个实例的地址和端口信息。文件内容如下:

[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 [MAL_INST3] MAL_INST_NAME = DMSERVER03 MAL_HOST = 192.168.122.197 MAL_PORT = 5235 MAL_INST_HOST = 192.168.122.197 MAL_INST_PORT = 5234 MAL_DW_PORT = 5236 MAL_INST_DW_PORT = 5237

4.2.3 修改 dmarch.ini

/dmdata/data/DMDBA/dmarch.ini 文件中配置归档策略,包括实时归档到 DMSERVER02,异步归档到 DMSERVER03,以及本地归档。文件内容如下:

[ARCHIVE_REALTIME] ARCH_TYPE = REALTIME ARCH_DEST = DMSERVER02 [ARCHIVE_ASYNC] ARCH_TYPE = ASYNC ARCH_DEST = DMSERVER03 [ARCHIVE_LOCAL] ARCH_TYPE = LOCAL ARCH_DEST = /dmdata/arch

4.2.4 配置 dmtimer.ini

/dmdata/data/DMDBA/dmtimer.ini 文件中配置定时器 RT_TIMER,用于触发异步归档。文件内容如下:

[RT_TIMER] ENABLE = 1 TYPE = INTERVAL INTERVAL = 60

4.2.5 启动主库并开启归档

./DmServiceDMSERVER01 start ./disql SYSDBA/Dmdba123@localhost:5234 # 在 SQL 中查看归档状态 SELECT * FROM V$ARCH_STATUS;

4.2.6 主库全备并复制到备库

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

4.3 配置实时备库 (dm-node2)

4.3.1 校验备份集并执行还原恢复

cd /home/dmdba/dmdbms/bin ./dmrman CTLSTMT="CHECK BACKUPSET '/dmdata/dmbak/db_full_bak_01';" ./dmrman CTLSTMT="RESTORE DATABASE '/dmdata/data/DMDBA/dm.ini' FROM BACKUPSET '/dmdata/dmbak/db_full_bak_01';" ./dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data/DMDBA/dm.ini' FOR STANDBY FROM BACKUPSET '/dmdata/dmbak/db_full_bak_01';" ./dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data/DMDBA/dm.ini' UPDATE DB_MAGIC;"

4.3.2 修改备库配置

  • dm.ini: 仅修改 INSTANCE_NAME = DMSERVER02
  • dmmal.ini: 与主库保持一致
  • dmarch.ini: 仅修改 ARCH_DEST = DMSERVER01 (指向主库)

4.4 配置异步备库 (dm-node3)

还原、恢复数据库过程同 dm-node2
修改配置:

  • dm.ini: 仅修改 INSTANCE_NAME = DMSERVER03
  • dmmal.ini: 与主库保持一致
  • dmarch.ini: 仅保留本地归档配置。

4.5 修改主备角色

主库 (dm-node1):

  1. 停止数据库后以 MOUNT 状态启动:./dmserver /dmdata/data/DMDBA/dm.ini mount
  2. 新开终端连接数据库执行:
    SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); ALTER DATABASE PRIMARY; SP_SET_OGUID(45331); SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

实时备库 (dm-node2) 与 异步备库 (dm-node3):
操作同主库,但执行 ALTER DATABASE STANDBY; 将数据库模式修改为备库。
配置结束后,关闭以 MOUNT 状态启动的前台进程。

4.6 配置 Watcher

在三台机器上创建相同的 dmwatcher.ini 文件,主要配置组名、类型、模式、OGUID、实例配置文件路径和启动命令。文件内容如下:

[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/dmserver /dmdata/data/DMDBA/dm.ini INST_STARTUP_CMD2 = /home/dmdba/dmdbms/bin/dmserver /dmdata/data/DMDBA/dm.ini RLOG_SEND_THRESHOLD = 0 RLOG_APPLY_THRESHOLD = 0

注意dm-node1dm-node2DW_TYPE = GLOBALDW_MODE = AUTOdm-node3 (异步备库) 的 DW_TYPE = LOCALDW_MODE = MANUAL。同时,各节点的 INST_STARTUP_CMD 需指向各自的服务名。

注册 Watcher 服务(以 root 执行):

cd /home/dmdba/dmdbms/script/root ./dm_service_installer.sh -t dmwatcher -watcher_ini /dmdata/data/DMDBA/dmwatcher.ini -p DMSERVER01_WATCHER # 在 dm-node2 和 dm-node3 上执行类似命令,修改 -p 参数为对应的服务名

4.7 配置 Monitor

dm-node1 上创建 dmmonitor.ini,配置监视器确认模式、日志路径、日志参数以及监控组 GRP1 中各节点的守护进程 IP 和端口。文件内容如下:

[MONITOR] MONITOR_DW_CONFIRM = 1 MONITOR_LOG_PATH = /dmdata/log MONITOR_LOG_FILE_SIZE = 32 MONITOR_LOG_SPACE_LIMIT = 0 [GRP1] DW_TYPE = GLOBAL INST_OGUID = 45331 INST_NAME = DMSERVER01 INST_HOST = 192.168.122.67 INST_PORT = 5236 INST_NAME = DMSERVER02 INST_HOST = 192.168.122.139 INST_PORT = 5236 INST_NAME = DMSERVER03 INST_HOST = 192.168.122.197 INST_PORT = 5236

4.8 启动顺序

严格按照以下顺序启动:

  1. 启动数据库实例:
    systemctl start DmServiceDMSERVER01 systemctl start DmServiceDMSERVER02 systemctl start DmServiceDMSERVER03
  2. 启动 Watcher:
    systemctl start DmWatcherServiceDMSERVER01_WATCHER systemctl start DmWatcherServiceDMSERVER02_WATCHER systemctl start DmWatcherServiceDMSERVER03_WATCHER
  3. 最后启动 Monitor (在 dm-node1 上):
    ./dmmonitor /dmdata/data/DMDBA/dmmonitor.ini # 在 monitor 中查看状态 show

image.png

5. 验证

5.1 主库建表并插入数据

dm-node1 主库上执行:

CREATE TABLE test_sync (id INT, name VARCHAR(50)); INSERT INTO test_sync VALUES (1, 'Primary'); COMMIT;

image.png

5.2 实时备库查询

dm-node2 实时备库上查询,应能立即查到刚插入的数据:

SELECT * FROM test_sync;

image.png

5.3 异步备库查询

dm-node3 异步备库上查询。由于是异步归档,可能需要等待定时器触发或手动执行归档后,数据才会同步过来。

-- 可能需要先手动执行归档同步 ALTER DATABASE ARCHIVELOG CURRENT; -- 然后查询 SELECT * FROM test_sync;

image.png
通过以上步骤,一套包含主库、实时备库和异步备库的 DM8 数据守护集群即搭建完成,并完成了基本的数据同步验证。后续可进一步测试主库故障自动切换、手动切换、故障恢复重新加入等高级功能,以全面验证集群的高可用性。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服