本文档基于 CentOS 7 操作系统和达梦数据库 DM8 V8(20260707)版本,详细记录搭建一套由 1 个主库、1 个实时备库和 1 个异步备库组成的数据守护(DataWatch)集群的全过程。
达梦数据库数据守护(DataWatch)是 DM8 提供的高可用解决方案,通过归档日志传输、日志重演、MAL(Message Application Layer)通信机制以及 Watcher、Monitor 等组件,实现数据库主备同步、故障监测、自动切换和故障恢复等功能。其中,实时备库能够实时接收并重演主库日志,保证主备数据的一致性;异步备库采用异步归档方式同步数据,在降低网络带宽占用的同时,为跨机房或远距离容灾提供支持。
本实验采用三台 KVM 虚拟机分别部署主库、实时备库和异步备库,通过配置数据库归档、MAL 通信、DataWatch、Watcher 和 Monitor,构建一套完整的数据守护集群。完成集群搭建后,将对主备数据同步、实时备库同步状态、异步备库归档同步、主库故障自动接管、故障恢复重新加入集群以及主备角色切换等功能进行验证,确保系统在数据库节点发生故障时能够持续提供服务,进一步提升数据库系统的高可用性、可靠性以及容灾能力。
| 组件 | 版本/配置 |
|---|---|
| 虚拟化平台 | KVM(Kernel-based Virtual Machine) |
| 操作系统 | CentOS Linux 7 x86_64 |
| CPU | Intel® Xeon® 6966P-C(KVM虚拟CPU) |
| 内存 | 50GB |
| 磁盘 | 50GB |
| 数据库版本 | DM8 V8(20260707) |
# 检查嵌套虚拟化是否开启
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
# 安装软件包
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,说明环境就绪
# 创建镜像和虚拟机存储目录
mkdir -p /var/lib/libvirt/images/iso
mkdir -p /var/lib/libvirt/images/vms
使用 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 参数。
安装完成后,通过 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
在三台虚拟机上执行相同的数据库安装操作。
在宿主机上将 DM8 安装包传输到各节点:
scp /mnt/nas/dm8_20260710_x86_centos7_64.iso root@192.168.122.67:/opt/
创建监控器日志目录:
mkdir -p /dmdata/log
chown -R dmdba:dinstall /dmdata/log
chmod -R 755 /dmdata/log
参照《01-dm8安装部署手册》步骤进行安装。安装完成后,注意启动 DMAP 服务,否则会影响后续数据库备份。
cd /home/dmdba/dmdbms/bin
./DmAPService start
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。
| 参数 | 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 |
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
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
在 /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
在 /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
在 /dmdata/data/DMDBA/dmtimer.ini 文件中配置定时器 RT_TIMER,用于触发异步归档。文件内容如下:
[RT_TIMER]
ENABLE = 1
TYPE = INTERVAL
INTERVAL = 60
./DmServiceDMSERVER01 start
./disql SYSDBA/Dmdba123@localhost:5234
# 在 SQL 中查看归档状态
SELECT * FROM V$ARCH_STATUS;
# 执行完全备份
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/
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;"
INSTANCE_NAME = DMSERVER02ARCH_DEST = DMSERVER01 (指向主库)还原、恢复数据库过程同 dm-node2。
修改配置:
INSTANCE_NAME = DMSERVER03主库 (dm-node1):
./dmserver /dmdata/data/DMDBA/dm.ini mountSP_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 状态启动的前台进程。
在三台机器上创建相同的 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-node1 和 dm-node2 的 DW_TYPE = GLOBAL,DW_MODE = AUTO;dm-node3 (异步备库) 的 DW_TYPE = LOCAL,DW_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 参数为对应的服务名
在 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
严格按照以下顺序启动:
systemctl start DmServiceDMSERVER01 systemctl start DmServiceDMSERVER02 systemctl start DmServiceDMSERVER03
systemctl start DmWatcherServiceDMSERVER01_WATCHER systemctl start DmWatcherServiceDMSERVER02_WATCHER systemctl start DmWatcherServiceDMSERVER03_WATCHER
./dmmonitor /dmdata/data/DMDBA/dmmonitor.ini
# 在 monitor 中查看状态
show
在 dm-node1 主库上执行:
CREATE TABLE test_sync (id INT, name VARCHAR(50));
INSERT INTO test_sync VALUES (1, 'Primary');
COMMIT;
在 dm-node2 实时备库上查询,应能立即查到刚插入的数据:
SELECT * FROM test_sync;
在 dm-node3 异步备库上查询。由于是异步归档,可能需要等待定时器触发或手动执行归档后,数据才会同步过来。
-- 可能需要先手动执行归档同步
ALTER DATABASE ARCHIVELOG CURRENT;
-- 然后查询
SELECT * FROM test_sync;
通过以上步骤,一套包含主库、实时备库和异步备库的 DM8 数据守护集群即搭建完成,并完成了基本的数据同步验证。后续可进一步测试主库故障自动切换、手动切换、故障恢复重新加入等高级功能,以全面验证集群的高可用性。
文章
阅读量
获赞
