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

数据守护主备集群搭建

DM_184112 2026/07/31 136 0 0

1 部署前检查与实训拓扑

环境与端口检查

cat /etc/*release
uname -a
chronyc sources -v
echo $LANG
ss -lntp | egrep '5237|5238|5337|5338|5437|5438|5537|5538'

实例、端口与目录规划

同机部署最关键的区别是端口不能重复。最终规划中,主实例使用 5238/5338/5438/5538,备实例使用 5237/5337/5437/5537;两个实例必须使用相同 OGUID 和守护组,但实例名、数据库目录、本地归档目录与服务后缀必须区分。
image.png

初始化主、备实例

实例初始化命令

cd /home/dmdba/dmdbms/bin

# 主实例(密码仅使用占位符)
./dminit PATH=/home/dmdba/dmdata DB_NAME=MASTER INSTANCE_NAME=GRP1_RT_01 \
  PORT_NUM=5236 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048 \
  SYSDBA_PWD='<强口令>' SYSAUDITOR_PWD='<强口令>'

# 备实例
./dminit PATH=/home/dmdba/dmdata DB_NAME=STANDBY INSTANCE_NAME=GRP1_RT_02 \
  PORT_NUM=5237 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048 \
  SYSDBA_PWD='<强口令>' SYSAUDITOR_PWD='<强口令>'

主库开启归档并执行一致性备份

主备数据守护不是分别创建两个空库后直接启动,而是以主库的一致性物理备份为基线恢复备库。主库先进入 MOUNT 状态,开启归档并添加本地归档目的地,再 OPEN 数据库并执行 BACKUP DATABASE。
开启归档与备份

# 连接主库初始端口
./disql SYSDBA/'<口令>'@127.0.0.1:5236

ALTER DATABASE MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE ADD ARCHIVELOG
  'DEST=/home/dmdba/dmdata/MASTER/arch, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=51200';
ALTER DATABASE OPEN;

BACKUP DATABASE BACKUPSET '/home/dmdba/dm_backup/BACKUP_FILE';

修改主库 dm.ini 核心参数

主库完成备份后,按照最终端口规划修改 PORT_NUM,并启用 MAL 系统和日志发送/重演监控。ALTER_MODE_STATUS=0 用于禁止运行期间随意修改实例模式、状态和 OGUID;后续首次设置 PRIMARY/STANDBY 角色时会临时打开。
主库参数调整

SP_SET_PARA_VALUE(2,'PORT_NUM',5238);
SP_SET_PARA_VALUE(2,'DW_INACTIVE_INTERVAL',60);
SP_SET_PARA_VALUE(2,'ALTER_MODE_STATUS',0);
SP_SET_PARA_VALUE(2,'ENABLE_OFFLINE_TS',2);
SP_SET_PARA_VALUE(2,'MAL_INI',1);
SP_SET_PARA_VALUE(2,'RLOG_SEND_APPLY_MON',64);

配置 dmarch.ini、dmmal.ini 与 dmwatcher.ini

三个配置文件分别负责实时归档、MAL 通讯和守护进程行为。主备两端的 dmmal.ini 节点清单必须一致;dmwatcher.ini 仅需将 INST_INI 指向本机实例路径;dmarch.ini 的实时归档目标则互相指向对端实例名。
主库 dmarch.ini

ARCH_WAIT_APPLY = 0

[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL
ARCH_DEST = /home/dmdba/dmdata/MASTER/arch
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 51200
ARCH_FLUSH_BUF_SIZE = 2
ARCH_HANG_FLAG = 1

[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = GRP1_RT_02

主备一致的 dmmal.ini

MAL_CHECK_INTERVAL = 10
MAL_CONN_FAIL_INTERVAL = 10
MAL_TEMP_PATH = /home/dmdba/dmdata/MASTER/mal_tmp/
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.178
MAL_PORT = 5338
MAL_INST_HOST = 192.168.200.178
MAL_INST_PORT = 5238
MAL_DW_PORT = 5438
MAL_INST_DW_PORT = 5538

[MAL_INST2]
MAL_INST_NAME = GRP1_RT_02
MAL_HOST = 192.168.200.178
MAL_PORT = 5337
MAL_INST_HOST = 192.168.200.178
MAL_INST_PORT = 5237
MAL_DW_PORT = 5437
MAL_INST_DW_PORT = 5537

主库 dmwatcher.ini

[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 20
INST_ERROR_TIME = 20
INST_RECOVER_TIME = 60
INST_OGUID = 453331
INST_INI = /home/dmdba/dmdata/MASTER/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0

注册主库数据库服务和守护服务

数据库服务以 MOUNT 模式注册,避免启动后直接 OPEN;守护进程接管后会根据集群状态控制实例。服务后缀决定最终 systemd 服务名,因此主备必须使用不同后缀。
主库服务注册

cd /home/dmdba/dmdbms/script/root

./dm_service_installer.sh -t dmserver -p MASTER \
  -dm_ini /home/dmdba/dmdata/MASTER/dm.ini -m mount

./dm_service_installer.sh -t dmwatcher -p WATCH_MASTER \
  -watcher_ini /home/dmdba/dmdata/MASTER/dmwatcher.ini
systemctl daemon-reload

恢复备库并完成备库配置

备库通过主库备份集执行 RESTORE、RECOVER 和 UPDATE DB_MAGIC。UPDATE DB_MAGIC 使恢复后的数据库获得新的数据库魔数,避免与主库完全相同。恢复成功后配置备库的 dm.ini、dmarch.ini、dmmal.ini 和 dmwatcher.ini。
备库恢复

cd /home/dmdba/dmdbms/bin

./dmrman CTLSTMT="RESTORE DATABASE '/home/dmdba/dmdata/STANDBY/dm.ini' FROM BACKUPSET '/home/dmdba/dm_backup/BACKUP_FILE'"
./dmrman CTLSTMT="RECOVER DATABASE '/home/dmdba/dmdata/STANDBY/dm.ini' FROM BACKUPSET '/home/dmdba/dm_backup/BACKUP_FILE'"
./dmrman CTLSTMT="RECOVER DATABASE '/home/dmdba/dmdata/STANDBY/dm.ini' UPDATE DB_MAGIC"

备库差异项

# 备库 dm.ini 关键项
INSTANCE_NAME = GRP1_RT_02
PORT_NUM = 5237
DW_INACTIVE_INTERVAL = 60
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
MAL_INI = 1
ARCH_INI = 1
RLOG_SEND_APPLY_MON = 64

# 备库 dmarch.ini 的实时归档目标
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = GRP1_RT_01

备库服务注册

cd /home/dmdba/dmdbms/script/root
./dm_service_installer.sh -t dmserver -p STANDBY \
  -dm_ini /home/dmdba/dmdata/STANDBY/dm.ini -m mount
./dm_service_installer.sh -t dmwatcher -p WATCH_STANDBY \
  -watcher_ini /home/dmdba/dmdata/STANDBY/dmwatcher.ini
systemctl daemon-reload

首次启动实例并设置 PRIMARY/STANDBY 角色

首次启动时先启动数据库服务,使两个实例处于 MOUNT 状态,再分别设置相同 OGUID 和主备角色。ALTER_MODE_STATUS 只在变更模式前临时设置为 1,操作完成后立即恢复为 0。
启动数据库服务

systemctl start DmServiceMASTER
systemctl start DmServiceSTANDBY
systemctl status DmServiceMASTER --no-pager -l
systemctl status DmServiceSTANDBY --no-pager -l

设置主备角色

# 主实例 5238
SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',1);
SP_SET_OGUID(453331);
ALTER DATABASE PRIMARY;
SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',0);

# 备实例 5237
SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',1);
SP_SET_OGUID(453331);
ALTER DATABASE STANDBY;
SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',0);

启动守护进程并检查服务状态

主备角色设置完成后启动两端守护进程。由于 INST_AUTO_RESTART=1,后续日常启动时守护进程可以自动拉起对应实例;首次搭建阶段仍应按照“实例初始化—角色设置—守护进程”的顺序执行。
启动守护进程

systemctl start DmWatcherServiceWATCH_MASTER
systemctl start DmWatcherServiceWATCH_STANDBY

systemctl status DmWatcherServiceWATCH_MASTER --no-pager -l
systemctl status DmWatcherServiceWATCH_STANDBY --no-pager -l

image.png

配置确认监视器和非确认监视器

确认监视器 MON_DW_CONFIRM=1 可在 DW_MODE=AUTO 时参与自动故障切换,官网建议部署在独立第三台机器;非确认监视器 MON_DW_CONFIRM=0 用于查询状态和人工切换,不需要注册后台服务。本次实训将两类监视器均放在同一台云主机上。
确认监视器 dmmonitor.ini

MON_DW_CONFIRM = 1
MON_LOG_PATH = /home/dmdba/dmdbms/log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 512
MON_LOG_SPACE_LIMIT = 2048

[GRP1]
MON_INST_OGUID = 453331
MON_DW_IP = 192.168.200.178:5438
MON_DW_IP = 192.168.200.178:5437

监视器注册与启动

cd /home/dmdba/dmdbms/script/root
./dm_service_installer.sh -t dmmonitor -p Monitor \
  -monitor_ini /home/dmdba/dmdbms/bin/dmmonitor.ini
systemctl daemon-reload

# 后台确认监视器
/home/dmdba/dmdbms/bin/DmMonitorServiceMonitor start

# 前台非确认监视器
cd /home/dmdba/dmdbms/bin
./dmmonitor dmmonitor_manual.ini

集群状态检查与手动主备切换

监视器连接成功后,先使用 tip 或 show global info 确认两个实例均为 OPEN,主库为 PRIMARY、备库为 STANDBY,状态为 OK/VALID。执行切换前需要 login 登录监视器,再通过 choose switchover 查看满足正常切换条件的实例。
image.png

日常启停顺序与 dm_svc.conf

完成首次搭建后,推荐由守护进程统一管理实例。停止集群时先停止守护进程,避免其自动拉起实例,再停止数据库服务。应用侧应使用服务名连接,并设置 LOGIN_MODE=1 只连接 PRIMARY 模式实例,使主备切换后客户端可以重新选择当前主库。
建议启停顺序

# 日常启动
systemctl start DmWatcherServiceWATCH_MASTER
systemctl start DmWatcherServiceWATCH_STANDBY
systemctl start DmMonitorServiceMonitor

# 日常停止
systemctl stop DmMonitorServiceMonitor
systemctl stop DmWatcherServiceWATCH_MASTER
systemctl stop DmWatcherServiceWATCH_STANDBY
systemctl stop DmServiceMASTER
systemctl stop DmServiceSTANDBY

本次环境 dm_svc.conf 示例

TIME_ZONE=(480)
LANGUAGE=(cn)
DM_YQ=(192.168.200.178:5238,192.168.200.178:5237)

[DMHA]
SWITCH_TIMES=(3)
SWITCH_INTERVAL=(100)
LOGIN_MODE=(1)

# JDBC 连接串
jdbc:dm://DM_YQ

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服