摘要:本文基于 CentOS 7 和达梦数据库 DM8(V8 20260707),手把手搭建由主库和备库组成的数据守护(DataWatch)集群,涵盖创建虚拟机、安装数据库、配置主备同步,并通过截图验证每个关键步骤的执行结果。
数据守护是达梦数据库提供的高可用解决方案,通过实时日志传输、日志重演以及 Watcher 与 Monitor 组件协同工作,实现数据库主备实时同步、故障自动监测、主备切换及故障恢复等功能。本文档基于 CentOS 7 操作系统和达梦数据库 DM8(V8 20260707)版本,搭建一套由一个主库和一个备库组成的数据守护集群。
本实验采用 KVM 创建两台虚拟机分别部署主库和备库,使用 virt-install 命令安装系统,并通过配置归档、MAL 通信、Watcher 和 Monitor,实现主备数据库实时同步。在此基础上,对数据同步、主库故障接管、故障恢复重新加入集群以及主备角色切换等功能进行验证。
| 项目 | 配置 |
|---|---|
| 虚拟化平台 | KVM(Kernel-based Virtual Machine) |
| 操作系统 | CentOS Linux 7 x86_64 |
| CPU | Intel® Xeon® 6966P-C(KVM 虚拟 CPU) |
| 内存 | 50GB |
| 磁盘 | 50GB |
| 数据库版本 | DM8 V8(20260707) |
步骤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
各组件说明:
启动并设置 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,这是实现无图形安装的核心。
安装过程中依次配置:
最后按 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
步骤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 "进行数据守护集群搭建前"
首先,规划好集群中各个组件的通信端口:
| 参数 | 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 |
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/
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
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 进程。
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
监视器可以部署在任意一台节点上,或者单独的第三台机器。这里我们部署在 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
在 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 命令,可以查看集群的运行状态。
集群搭建完成后,我们来验证数据同步功能。
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 提交事务,否则备库无法同步到数据。
2)在备库查询
./disql SYSDBA/Dmdba123@192.168.122.139:5234
执行 SQL:
SELECT * FROM TEST_GUARD;
如果能够查询到刚刚插入的数据,说明主备同步配置成功。
3)查看 Monitor 状态
在 Monitor 界面中,可以实时看到主备库的状态、日志发送和重演情况。
原因: DMAP 服务没有启动。
解决方法:
cd /home/dmdba/dmdbms/bin
./DmAPService start
原因: 数据库还原恢复后,没有更新 DB_MAGIC。
解决方法:
cd /home/dmdba/dmdbms/bin
./dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data/DMDBA/dm.ini' UPDATE DB_MAGIC;"
原因: 主库上的插入操作没有提交事务。
解决方法: 在主库执行 COMMIT; 提交事务。
文章
阅读量
获赞
