注册
达梦8两节点实时主备集群搭建与高可用测试
技术分享/ 文章详情 /

达梦8两节点实时主备集群搭建与高可用测试

何处惹尘埃 2026/07/16 323 2 1

任务汇总

完成2节点数据守护集群的搭建,要求如下:
1)完成实时主备集群的部署,并测试建表和插入数据备机是否能及时同步,并可查询到数据。
2)制造主机故障,测试备机可接管并持续提供服务。
3)恢复故障主机,将故障主机加入集群。
4)手动切换主备集群,恢复原主备集群的位置。

前置环境

由于前一篇已经详细介绍了虚拟机安装有可能的故障,这里默认已经在CentOS 7上安装好了DM8

  • 单机双 IP:192.168.200.18(主库绑定)、192.168.201.90(备库绑定)
  • 操作系统:CentOS 7,达梦8(CentOS7专用安装包)
  • 两个实例共用同一软件目录 /home/dmdba/dmdbms
  • 所有操作用户:dmdba,密码统一为 Admin2026
    (注意,不要在密码里加入“@”符号,第一次使用了这个符号导致了多次识别失败,从而导致任务1的失败)

一、集群初始化与配置文件准备

1.1 创建数据目录并授权(root)

mkdir -p /data/dmdata1 /data/dmdata2 /data/dmarch1 /data/dmarch2 /data/dmbackup /data/dmlog chown -R dmdba:dinstall /data

1.2 初始化两个实例(终端任意,dmdba)

cd /home/dmdba/dmdbms/bin # 主库 ./dminit PATH=/data/dmdata1 DB_NAME=DAMENG INSTANCE_NAME=GRP1_RT_01 \ PORT_NUM=5236 PAGE_SIZE=32 LOG_SIZE=2048 \ CASE_SENSITIVE=1 CHARSET=1 \ SYSDBA_PWD=Admin2026 SYSAUDITOR_PWD=Admin2026 # 备库(端口5237) ./dminit PATH=/data/dmdata2 DB_NAME=DAMENG INSTANCE_NAME=GRP1_RT_02 \ PORT_NUM=5237 PAGE_SIZE=32 LOG_SIZE=2048 \ CASE_SENSITIVE=1 CHARSET=1 \ SYSDBA_PWD=Admin2026 SYSAUDITOR_PWD=Admin2026

踩坑点:达梦新版要求必须指定 SYSDBA_PWD 和 SYSAUDITOR_PWD,且密码需含大小写字母和数字(如 Admin2026),否则初始化失败。

运行结果如下:

截屏20260713 11.24.15.png

截屏20260713 11.24.41.png

1.3 主库脱机备份与备库恢复

先正常启动主库一次(让数据库初始化内部结构),然后关闭:

./dmserver /data/dmdata1/DAMENG/dm.ini # 正常启动,Ctrl+C关闭

脱机备份(终端任意):

./dmrman RMAN> backup database '/data/dmdata1/DAMENG/dm.ini' full backupset '/data/dmbackup/full_bak' compressed level 1; RMAN> exit;

备库还原(终端任意):

./dmrman RMAN> restore database '/data/dmdata2/DAMENG/dm.ini' from backupset '/data/dmbackup/full_bak'; RMAN> recover database '/data/dmdata2/DAMENG/dm.ini' from backupset '/data/dmbackup/full_bak'; RMAN> recover database '/data/dmdata2/DAMENG/dm.ini' update db_magic; RMAN> exit;

踩坑点:若初始化后从未正常启动过,dmrman 备份会报错 RMAN[-8029] 服务器未启动初始化,必须先正常启动一次再关闭。

1.4 配置主备集群配置文件

主库 /data/dmdata1/DAMENG/dm.ini(修改关键参数):
执行命令:

vi /data/dmdata1/DAMENG/dm.ini

之后会进入一长段内容,不用一个一个找,可以把光标移动到最下面一行,输入斜杠/和需要查询的关键词,例如,我们需要查询INSTANCE_NAME,就需要在最后一行输入:

/INSTANCE_NAME

终端就会自动跳到INSTANCE_NAME的位置,这个时候按键盘上的i,可以进入insert模式,没次修改完按ESC按键退出,进行下一个参数的搜索,等所有的参数修改完,在最后一行输入:wq进行保存和退出

主库参数对应下列:

INSTANCE_NAME = GRP1_RT_01 PORT_NUM = 5236 ALTER_MODE_STATUS = 0 ENABLE_OFFLINE_TS = 2 MAL_INI = 1 ARCH_INI = 1

备库 /data/dmdata2/DAMENG/dm.ini:

命令:

vi /data/dmdata2/DAMENG/dm.ini

备库参数对应下列:

INSTANCE_NAME = GRP1_RT_02 PORT_NUM = 5237 ALTER_MODE_STATUS = 0 ENABLE_OFFLINE_TS = 2 MAL_INI = 1 ARCH_INI = 1

接下来是六个文件的创建和输入内容,都是使用vi + 地址,输入i进入insert模式,然后粘贴内容,按ESC退出,按:wq保存

主库 /data/dmdata1/DAMENG/dmarch.ini:

[ARCHIVE_REALTIME1]
  ARCH_TYPE = REALTIME
  ARCH_DEST = GRP1_RT_02
[ARCHIVE_LOCAL1]
  ARCH_TYPE = LOCAL
  ARCH_DEST = /data/dmarch1
  ARCH_FILE_SIZE = 2048
  ARCH_SPACE_LIMIT = 51200

备库 /data/dmdata2/DAMENG/dmarch.ini(ARCH_DEST 指向主库):

[ARCHIVE_REALTIME1]
  ARCH_TYPE = REALTIME
  ARCH_DEST = GRP1_RT_01
[ARCHIVE_LOCAL1]
  ARCH_TYPE = LOCAL
  ARCH_DEST = /data/dmarch2
  ARCH_FILE_SIZE = 2048
  ARCH_SPACE_LIMIT = 51200

主库与备库 dmmal.ini 内容完全相同(分别放到各自的 DAMENG 目录):

MAL_CHECK_INTERVAL = 10
MAL_CONN_FAIL_INTERVAL = 10

[MAL_INST1]
  MAL_INST_NAME = GRP1_RT_01
  MAL_HOST = 192.168.200.18
  MAL_PORT = 61141
  MAL_INST_HOST = 192.168.200.18
  MAL_INST_PORT = 5236
  MAL_DW_PORT = 52141
  MAL_INST_DW_PORT = 33141

[MAL_INST2]
  MAL_INST_NAME = GRP1_RT_02
  MAL_HOST = 192.168.201.90
  MAL_PORT = 61142
  MAL_INST_HOST = 192.168.201.90
  MAL_INST_PORT = 5237
  MAL_DW_PORT = 52142
  MAL_INST_DW_PORT = 33142

备库可以直接用cp命令复制复制

主库 /data/dmdata1/DAMENG/dmwatcher.ini:

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

备库 /data/dmdata2/DAMENG/dmwatcher.ini(仅 INST_INI 路径不同):

  INST_INI = /data/dmdata2/DAMENG/dm.ini

监视器配置文件 /data/dmmonitor.ini(放在任意位置,此处为 /data/dmmonitor.ini):

MON_DW_CONFIRM = 1
MON_LOG_PATH = /data/dmlog
MON_LOG_INTERVAL = 60

[GRP1]
  MON_INST_OGUID = 453331
  MON_DW_IP = 192.168.200.18:52141
  MON_DW_IP = 192.168.201.90:52142

踩坑点:dmmal.ini 中 MAL_INST_HOST 必须与 dm.ini 中 LISTEN_IP(若配置)一致,本实验未配置 LISTEN_IP,默认监听所有IP。

二、任务1:实时主备同步测试

终端分配

  • 终端1:主库实例(前台)
  • 终端2:备库实例(前台)
  • 终端3:主库守护进程
  • 终端4:备库守护进程
  • 终端5:确认监视器
  • 终端6:执行 SQL 操作(任意,可复用)

给大家看一下这是我最后执行完的结果,虽然终端多,但还是比较方便的,从上到下从左到右依次是:
1、2、3、
4、5、6
截屏20260713 16.37.03.png

操作步骤

步骤1:启动主库和备库实例(mount模式)

终端1:

cd /home/dmdba/dmdbms/bin ./dmserver /data/dmdata1/DAMENG/dm.ini mount

终端2:

./dmserver /data/dmdata2/DAMENG/dm.ini mount

步骤2:设置主备模式(终端6,守护进程未启动,允许修改)

# 主库 ./disql SYSDBA/Admin2026@localhost:5236

执行

SP_SET_OGUID(453331); ALTER DATABASE PRIMARY; EXIT;
# 备库 ./disql SYSDBA/Admin2026@localhost:5237

执行:

SP_SET_OGUID(453331); ALTER DATABASE STANDBY; EXIT;

踩坑点:必须在启动守护进程前设置模式,否则守护进程会阻止修改,报错 [-720] Dmwatcher is active。

步骤3:启动守护进程

终端3:

./dmwatcher /data/dmdata1/DAMENG/dmwatcher.ini

显示 DMWATCHER[4.0] IS READY
终端4:

./dmwatcher /data/dmdata2/DAMENG/dmwatcher.ini

显示 DMWATCHER[4.0] IS READY

步骤4:启动监视器(终端5

./dmmonitor /data/dmmonitor.ini

在监视器命令行输入 show,观察状态,等待两实例均为 OPEN,主库 PRIMARY,备库 STANDBY,且 FLSN/CLSN 一致。

步骤5:测试同步(终端6)

主库(5236):

CREATE TABLE test_sync (id INT, name VARCHAR(50)); INSERT INTO test_sync VALUES (1, 'sync_test'); COMMIT; SELECT * FROM test_sync;

备库(5237):

SELECT * FROM test_sync;

应返回相同记录。

验证通过条件:备库能查询到主库插入的数据。

如图所示运行结果:
截屏20260713 14.39.45.png截屏20260713 14.40.15.png

这样任务1就算是做完了

三、任务2:模拟主机故障,备机接管

前置条件

集群处于任务1结束时的正常状态(主 PRIMARY,备 STANDBY,均 OPEN)。
可以看终端5监视器来确认

终端分配

  • 终端1:主库实例(将被停止)
  • 终端3:主库守护进程(不要手动停止)
  • 终端5:监视器(观察切换)
  • 终端6:执行验证SQL

这里写终端3不要手动停止是因为我使用ctrl+C之后,终端3会卡死

操作步骤

步骤1:模拟主库故障

在终端1按 Ctrl+C 停止主库实例(或 kill -9 <主库PID>)。
严禁停止终端3的主库守护进程,让它自动检测故障。

步骤2:观察自动切换

在终端5(监视器)等待约10~15秒,输入 show,应看到:

  • 原主库状态变为 ERROR 或 DOWN
  • 原备库自动变为 PRIMARY OPEN

步骤3:验证新主库可写(终端6)

连接新主库(原备库,端口5237):

./disql SYSDBA/Admin2026@localhost:5237

执行:

INSERT INTO test_sync VALUES (2, 'after_failover'); COMMIT; SELECT * FROM test_sync;

应返回两条记录。
验证通过条件:插入成功,确认备机已接管为主库。

实际运行结果如图:
截屏20260713 15.41.08.png

四、任务3:恢复故障主机,加入集群

前置条件

当前主库为 GRP1_RT_02(原备库),故障主机为 GRP1_RT_01(原主库)已停止。

终端分配

  • 终端1(或新终端):重新启动 GRP1_RT_01 实例
  • 终端3:启动 GRP1_RT_01 守护进程
  • 终端5:监视器观察加入
  • 终端6:验证数据同步

操作步骤

步骤1:清理原主库残留进程(若存在)

pkill -9 -f "dmserver.*GRP1_RT_01" pkill -9 -f "dmwatcher.*GRP1_RT_01"

步骤2:以 mount 方式启动原主库(终端1)

cd /home/dmdba/dmdbms/bin ./dmserver /data/dmdata1/DAMENG/dm.ini mount

等待 SYSTEM IS READY.

步骤3:启动原主库守护进程(终端3)

./dmwatcher /data/dmdata1/DAMENG/dmwatcher.ini

步骤4:观察自动加入与同步(终端5)

在监视器中输入 show,应看到:

  • GRP1_RT_01 状态变为 STANDBY OPEN
  • RSTAT 从 INVALID 变为 VALID
  • FLSN/CLSN 逐渐追上当前主库(GRP1_RT_02),最终一致。

步骤5:验证数据同步(终端6)

  • 连接当前主库(GRP1_RT_02,5237)查询 test_sync,应有两条记录。
  • 连接原主库(现备库,5236)查询 test_sync,应有相同记录。

验证通过条件:原主库成功加入,数据与主库一致。

运行结果如下:

截屏20260713 15.45.58.png截屏20260713 15.47.13.png截屏20260713 15.47.21.png

五、任务4:手动切换,恢复原主备位置

前置条件

当前主库为 GRP1_RT_02,备库为 GRP1_RT_01,两者数据同步。

操作步骤

步骤1:停止当前主库(GRP1_RT_02)的实例和守护进程

查找 GRP1_RT_02 实例PID(终端任意):

ps -ef | grep dmserver | grep GRP1_RT_02

杀死实例:

kill -9 <PID>

查找并杀死守护进程:

ps -ef | grep dmwatcher | grep GRP1_RT_02 kill -9 <PID>

步骤2:将 GRP1_RT_01 提升为主库(终端6)

./disql SYSDBA/Admin2026@localhost:5236

执行:

ALTER DATABASE PRIMARY; EXIT;

步骤3:启动 GRP1_RT_01 守护进程(终端3,若未运行)

./dmwatcher /data/dmdata1/DAMENG/dmwatcher.ini

步骤4:将 GRP1_RT_02 重新启动为备库

启动实例(终端2):

./dmserver /data/dmdata2/DAMENG/dm.ini mount

连接并设置为 STANDBY(终端6):

./disql SYSDBA/Admin2026@localhost:5237
ALTER DATABASE STANDBY; EXIT;

启动守护进程(终端4):

./dmwatcher /data/dmdata2/DAMENG/dmwatcher.ini

步骤5:重启监视器验证(终端5

退出当前监视器,重新启动:

./dmmonitor /data/dmmonitor.ini

输入 show,确认:

  • GRP1_RT_01:PRIMARY OPEN
  • GRP1_RT_02:STANDBY OPEN
  • FLSN/CLSN 一致。

步骤6:最终验证(终端6)

连接主库(5236)插入第三条数据:

INSERT INTO test_sync VALUES (3, 'switchback_test'); COMMIT; SELECT * FROM test_sync;

连接备库(5237)查询,应返回三条记录。

验证通过条件:主备角色完全恢复,数据同步无误。

六、总结与关键踩坑点汇总

  1. 密码复杂度:dminit 必须指定符合复杂度要求的密码,否则初始化失败。
  2. 模式修改时机:必须在启动守护进程之前设置 PRIMARY/STANDBY,否则会报 -720。
  3. 自动切换要点:停止主库实例后,不要停止主库守护进程,让守护进程自动检测故障并触发切换。
  4. 连接问题:密码含 @ 时,需使用正确语法(如 SYSDBA/Admin2026@localhost:5236)或改用不含 @ 的密码(本报告统一使用 Admin2026)。
  5. 备份还原:新初始化实例必须先正常启动一次,否则 dmrman 备份会失败。
  6. 进程残留:切换和恢复过程中,务必确认相关进程已完全停止,避免端口冲突。

然后每个任务我其实都有过失败,有时候会陷入死胡同,我会选择从每个任务的开始状态重新做,有耐心一点就成功了

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服