在数据库生产环境中,单节点部署最大的痛点就是单点故障——服务器宕机、进程异常都可能导致业务中断。而达梦数据守护集群(Data Watch)是目前政企生产环境中最主流、最稳定的高可用方案,相比传统第三方高可用组件,达梦原生主备集群具备内核级支持、无需额外插件、秒级自动切换、数据零丢失等优势,完全适配政务、能源、金融等信创生产环境。
本文将以一主一备+确认监视器的架构为例,详细记录达梦DM8实时主备守护集群的完整搭建过程。
达梦实时主备集群是数据守护(Data Watch)的一种高可用解决方案,由一个主库和一个或多个配置了实时(REALTIME)归档的备库组成。
核心原理:主库修改数据产生的Redo日志,在写入联机日志文件之前发送到备库,备库通过重演Redo日志与主库保持数据同步。
核心组件包括:
说明:本次搭建采用单机多实例部署方式,即在同一台物理服务器上运行主库(GRP1_RT_01)和备库(GRP1_RT_02)两个达梦数据库实例,通过不同的端口号加以区分。该方案适用于功能测试、POC验证等场景,若迁移至生产环境,请将各节点部署至不同的物理服务器并修改对应的IP地址。
| 项目 | A 机器 | B 机器 |
|---|---|---|
| 心跳 IP | 192.168.200.225 | 192.168.200.225 |
| 实例名 | GRP1_RT_01 | GRP1_RT_02 |
| 实例端口 | 5236 | 5237 |
| MAL 端口 | 5336 | 5337 |
| MAL 守护进程端口 | 5436 | 5437 |
| 守护进程端口 | 5536 | 5537 |
| OGUID | 45331 | 45331 |
| 守护组 | GRP1 | GRP1 |
| 安装目录 | /opt/dmdbms | /opt/dmdbms |
| 实例目录 | /opt/dmdbms/data1/ | /opt/dmdbms/data2/ |
| 归档上限 (MB) | 51200 | 51200 |
在搭建集群之前,需要确认以下事项:
[dmdba@~]$ /opt/dmdbms/bin/dminit PATH=/opt/dmdbms/data1/ \
INSTANCE_NAME=GRP1_RT_01 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048 \
SYSDBA_PWD=Dameng@123 SYSAUDITOR_PWD=Dameng@123
踩坑提醒:达梦新版要求必须指定SYSDBA_PWD和SYSAUDITOR_PWD,且密码需包含大小写字母和数字。另外,建议密码中不要使用@等特殊符号,可能导致识别失败。
# 前台启动实例
[dmdba@~]$ /opt/dmdbms/bin/dmserver /opt/dmdbms/data1/DAMENG/dm.ini
另开一个终端,使用disql连接并配置:
[dmdba@~]$ /opt/dmdbms/bin/disql SYSDBA/'"Dameng@123"':5236
SQL> ALTER DATABASE MOUNT;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE ADD ARCHIVELOG 'DEST=/opt/dmdbms/data1/DAMENG/arch, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=51200';
SQL> SP_SET_PARA_VALUE (2,'PORT_NUM',5236);
SQL> SP_SET_PARA_VALUE (2,'DW_INACTIVE_INTERVAL',60);
SQL> SP_SET_PARA_VALUE (2,'ALTER_MODE_STATUS',0);
SQL> SP_SET_PARA_VALUE (2,'ENABLE_OFFLINE_TS',2);
SQL> SP_SET_PARA_VALUE (2,'MAL_INI',1);
SQL> SP_SET_PARA_VALUE (2,'RLOG_SEND_APPLY_MON',64);
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL> SP_SET_OGUID(45331);
SQL> ALTER DATABASE PRIMARY;
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
SQL> ALTER DATABASE OPEN;
SQL> BACKUP DATABASE BACKUPSET '/opt/dmdbms/data1/DAMENG/bak/BACKUP_FILE';
SQL> ALTER DATABASE MOUNT;
备份完成后关闭前台实例。
[dmdba@~]$ vi /opt/dmdbms/data1/DAMENG/dmarch.ini
ARCH_WAIT_APPLY = 0 # 0:高性能 1:事务一致
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL
ARCH_DEST = /opt/dmdbms/data1/DAMENG/arch/
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 51200
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME # 实时归档
ARCH_DEST = GRP1_RT_02 # 实时归档目标实例名(备库)
说明:实时归档(REALTIME)只在主库生效,主库在Redo日志写入联机日志文件前将日志发送到备库。生产环境核心系统强烈建议使用REALTIME模式,可实现RPO≈0的数据零丢失。
注意:dmmal.ini在主备节点内容完全相同。
[dmdba@~]$ vi /opt/dmdbms/data1/DAMENG/dmmal.ini
MAL_CHECK_INTERVAL = 10 # MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 10 # 判定MAL链路断开的时间
MAL_TEMP_PATH = /opt/dmdbms/data1/malpath/
MAL_BUF_SIZE = 512
MAL_SYS_BUF_SIZE = 2048
MAL_COMPRESS_LEVEL = 0
[MAL_INST1]
MAL_INST_NAME = GRP1_RT_01
MAL_HOST = 192.168.200.225
MAL_PORT = 5336
MAL_INST_HOST = 192.168.200.225
MAL_INST_PORT = 5236
MAL_DW_PORT = 5436
MAL_INST_DW_PORT = 5536
[MAL_INST2]
MAL_INST_NAME = GRP1_RT_02
MAL_HOST = 192.168.200.225
MAL_PORT = 5337
MAL_INST_HOST = 192.168.200.225
MAL_INST_PORT = 5237
MAL_DW_PORT = 5437
MAL_INST_DW_PORT = 5537
[dmdba@~]$ vi /opt/dmdbms/data1/DAMENG/dmwatcher.ini
[dmdba@~]$ cp -r /opt/dmdbms/data1/DAMENG/bak/BACKUP_FILE /opt/dmdbms/data2/DAMENG/bak
[root@~]# /opt/dmdbms/script/root/dm_service_installer.sh -t dmserver \
-p GRP1_RT_01 -dm_ini /opt/dmdbms/data1/DAMENG/dm.ini
[root@~]# /opt/dmdbms/script/root/dm_service_installer.sh -t dmwatcher \
-p GRP1_RT_01 -watcher_ini /opt/dmdbms/data1/DAMENG/dmwatcher.ini
[dmdba@~]$ /opt/dmdbms/bin/dminit PATH=/opt/dmdbms/data2/ \
INSTANCE_NAME=GRP1_RT_02 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048 \
SYSDBA_PWD=Dameng@123 SYSAUDITOR_PWD=Dameng@123
[dmdba@~]$ vi /opt/dmdbms/data2/DAMENG/dmarch.ini
ARCH_WAIT_APPLY = 0
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL
ARCH_DEST = /opt/dmdbms/data2/DAMENG/arch/
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 51200
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = GRP1_RT_01 # 指向主库
启动备库实例并修改参数:
[dmdba@~]$ /opt/dmdbms/bin/dmserver /opt/dmdbms/data2/DAMENG/dm.ini
[dmdba@~]$ /opt/dmdbms/bin/disql SYSDBA/'"Dameng@123"':5237
SQL> SP_SET_PARA_VALUE (2,'PORT_NUM',5237);
SQL> SP_SET_PARA_VALUE (2,'DW_INACTIVE_INTERVAL',60);
SQL> SP_SET_PARA_VALUE (2,'ALTER_MODE_STATUS',0);
SQL> SP_SET_PARA_VALUE (2,'ENABLE_OFFLINE_TS',2);
SQL> SP_SET_PARA_VALUE (2,'MAL_INI',1);
SQL> SP_SET_PARA_VALUE (2,'ARCH_INI',1);
SQL> SP_SET_PARA_VALUE (2,'RLOG_SEND_APPLY_MON',64);
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL> SP_SET_OGUID(45331);
SQL> ALTER DATABASE STANDBY; # 设置为备库模式
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
将A机器的dmmal.ini和dmwatcher.ini复制到B机器对应目录,注意配置文件的路径要对应。
[dmdba@~]$ /opt/dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/opt/dmdbms/data2/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/data2/DAMENG/bak/BACKUP_FILE'"
[dmdba@~]$ /opt/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/opt/dmdbms/data2/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/data2/DAMENG/bak/BACKUP_FILE'"
[dmdba@~]$ /opt/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/opt/dmdbms/data2/DAMENG/dm.ini' UPDATE DB_MAGIC"
踩坑提醒:若初始化后从未正常启动过,dmrman备份会报错RMAN[-8029],必须先正常启动一次再关闭。
[root@~]# /opt/dmdbms/script/root/dm_service_installer.sh -t dmserver \
-p GRP1_RT_02 -dm_ini /opt/dmdbms/data2/DAMENG/dm.ini
[root@~]# /opt/dmdbms/script/root/dm_service_installer.sh -t dmwatcher \
-p GRP1_RT_02 -watcher_ini /opt/dmdbms/data2/DAMENG/dmwatcher.ini
[dmdba@~]$ vi /opt/dmdbms/bin/dmmonitor.ini
MON_DW_CONFIRM = 1 # 1:确认模式(自动切换)
MON_LOG_PATH = /opt/dmdbms/dmmonitor/log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 512
MON_LOG_SPACE_LIMIT = 2048
[GRP1]
MON_INST_OGUID = 45331
MON_DW_IP = 192.168.200.225:5436
MON_DW_IP = 192.168.200.225:5437
[root@~]# /opt/dmdbms/script/root/dm_service_installer.sh -t dmmonitor \
-p Monitor -monitor_ini /opt/dmdbms/bin/dmmonitor.ini
启动顺序非常重要,需遵循:先实例、再守护进程、最后监视器。
# 1. 启动主库实例(A机器)
[dmdba@~]$ /opt/dmdbms/bin/DmServiceGRP1_RT_01 start
# 2. 启动备库实例(B机器)
[dmdba@~]$ /opt/dmdbms/bin/DmServiceGRP1_RT_02 start
# 3. 启动守护进程(A/B机器)
[dmdba@~]$ /opt/dmdbms/bin/DmWatcherServiceGRP1_RT_01 start
[dmdba@~]$ /opt/dmdbms/bin/DmWatcherServiceGRP1_RT_02 start
# 4. 启动监视器
[dmdba@~]$ /opt/dmdbms/bin/DmMonitorServiceMonitor start
停止顺序则相反:先监视器、再守护进程、最后实例。
# 停止防火墙
sudo systemctl stop firewalld
# 禁用防火墙(开机不自启)
sudo systemctl disable firewalld
# 查看防火墙状态
sudo systemctl status firewalld
集群异常分裂后,备库目录下可能残留dmwatcher.ctl标记文件,导致集群无法正常启动。
# 查找分裂标记文件
find /opt/dmdbms/data2/DAMENG -name "dmwatcher.ctl"
# 停止备库实例及守护进程
[dmdba@~]$ /opt/dmdbms/bin/DmWatcherServiceGRP1_RT_02 stop
[dmdba@~]$ /opt/dmdbms/bin/DmServiceGRP1_RT_02 stop
# 确认全部关闭
[dmdba@~]$ ps -ef | grep -E "dmserver|dmwatcher" | grep -v grep
# 重命名分裂标记文件
[dmdba@~]$ mv /opt/dmdbms/data2/DAMENG/dmwatcher.ctl /opt/dmdbms/data2/DAMENG/dmwatcher.ctl.bak
达梦DM8数据守护集群的搭建主要分为以下几个核心步骤:
文章
阅读量
获赞
