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

主备集群搭建

雾岛听风 2026/08/07 224 0 0

主备集群搭建

1前情概述

1.1 主节点工正常作时备节点是待机状态,当主节点出现故障时备节点会自动变为主节点(避免同步中断的情况),此时原来的主节点会降级为备节点成为待机状态,

1.1.1 主节点负责全量数据和增量数据的同步
1.1.2 备节点实时同步主节点的环境,以便随时变更升级为主节点使用
1.1.3 目标DMDRS主备:备节点会在数据库创建一个辅助表,主节点和备节点都会到这个辅助表上锁。谁上锁成功,此时谁就是主节点→承担全量数据和增量数据的同步工作 这里没有数据库限制
1.1.4 源DMDRS主备:源节点都会去给目标节点发消息,谁先发送成功,谁就是主节点,另一个就是备节点 源端目前只支持dm7/dm8/ora/pg等
DMDRS主备可支持动态新增、删除节点 单节点→主备 主备→单节点 (动态)
主节点动态修改参数会自动同步到备节点 但是手动改变时,备节点不会同步更新参数
DMDRS主备切换的限制条件:
1、主节点访问备节点时间间隔不能超过5min
2、主节点和备节点的同步时延不超过1h
3、主节点和备节点的检查点差值不能超过阈值(DM8为100000)

标准启动流程(生产环境下强制)

Ⅰ、主库实例mont启动

Ⅱ、备库实例 mount 启动

Ⅲ、主库、备库分别启动 dmwatcher

Ⅳ、启动 dmmonitor 监视器 (守护进程协商完成后,自动下发 OPEN 命令,数据库对外提供服务。)

新初始化空白库:首次启动不能用 mount,必须正常 OPEN 一次再关闭,之后才能 mount 启动做主备;
达梦主备集群实例必须 mount 方式启动;直接 OPEN 会生成脏 REDO、打开计数错乱、集群分裂、业务乱写入;mount 状态锁住数据读写,交给 dmwatcher 统一协调 OPEN,保证主备数据一致性与自动切换正常。

1.2 规划配置信息

这里我把主节点的数据、归档、备份目录设置为 data01、arch01、dmbak01,备节点的设置为data02、arch02、dmbak02 方便后续区分

2主节点配置

2.1 初始化实例:一个实例相当于一个服务器,这两个实例的地址path、实例名字(因为dmarch是根据实例名去寻找)、端口需不同(因为在一个服务器同一ip下)

128774

2.2 启动服务:这是在前台开启的服务,现在需要重新开一个terminal去进行归档、备份数据、修改dm.ini参数等操作

128769

128770

2.2.1 再开一个terminal进行操作

cd /home/dmdba/dmdbms/bin ./disql SYSDBA/Sysdba123.@127.0.0.1:5236 *ALTER DATABASE MOUNT;* *ALTER DATABASE ARCHIVELOG;* ALTER DATABASE ADD ARCHIVELOG 'DEST=/dmdata/arch01, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=51200'; *ALTER DATABASE OPEN;*

1. ALTER DATABASE MOUNT;

作用:将数据库切换到MOUNT 挂载模式

  • 达梦数据库三种启动状态:SHUTDOWN关闭MOUNT挂载OPEN打开

  • 开启 / 修改归档、控制文件、备份配置等操作必须在 MOUNT 阶段执行,OPEN 状态下无法修改归档模式。

  • 前置操作:数据库需要先执行 STARTUP MOUNT; 启动到挂载状态,再执行这条语句。

2. ALTER DATABASE ARCHIVELOG;

作用:开启数据库归档日志模式

  • 默认达梦是非归档(NOARCHIVELOG)模式;

  • 开启归档后:数据库重做日志会持续归档备份,支持时间点恢复、完整备份恢复,生产环境必须开启;

  • 关闭归档用:ALTER DATABASE NOARCHIVELOG;

3. ALTER DATABASE ADD ARCHIVELOG 'DEST=/opt/dmdbms/data/DAMENG/arch, TYPE=...';

作用:新增归档文件存储路径配置

参数说明:

  • DEST=/opt/dmdbms/data/DAMENG/arch:归档文件存放目录,达梦实例 DAMENG 的 arch 文件夹;

  • TYPE:归档类型(常用值:FILE本地文件归档、REMOTE远程归档);

  • 这条语句用来指定归档日志保存位置,支持配置多份归档路径实现冗余。

4. ALTER DATABASE OPEN;

作用:将挂载状态的数据库打开,对外提供业务访问

完成归档配置后,切换到正常运行 OPEN 状态,应用程序、用户才能连接数据库读写数据。

BACKUP DATABASE BACKUPSET '/dmdata/dmbak01/BACKUP_FILE';
这里是在disql里用sql语句完成 SP_SET_PARA_VALUE (2,'PORT_NUM',5236); //主节点设置为5236 备节点设置为5237 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);

128776

2.2.2 此操作后即可返回之前terminal里ctrl+c关闭前台服务

2.3 创建修改dmmal.ini参数(该.ini文件和dm.ini文件在同一目录下,下面的.ini文件不特别指出时就都和这个在一起)

vim dmmal.ini MAL_CHECK_INTERVAL = 10 #MAL 链路检测时间间隔 MAL_CONN_FAIL_INTERVAL = 10 #判定 MAL 链路断开的时间 MAL_TEMP_PATH = /malpath #临时文件目录 MAL_BUF_SIZE = 512 #单个 MAL 缓存大小,单位 MB MAL_SYS_BUF_SIZE = 2048 #MAL 总大小限制,单位 MB MAL_COMPRESS_LEVEL = 0 #MAL 消息压缩等级,0 表示不压缩 [MAL_INST1] MAL_INST_NAME = DM_YQ_01 #实例名 MAL_HOST = 192.168.200.50 #MAL 系统监听 TCP 连接的 IP 地址 MAL_PORT = 5336 #MAL 系统监听 TCP 连接的端口 MAL_INST_HOST = 192.168.200.50 #实例的对外服务 IP 地址 MAL_INST_PORT = 5236 #实例对外服务端口,和 dm.ini 的 PORT_NUM 一致 MAL_DW_PORT = 5436 #实例对应的守护进程监听 TCP 连接的端口 MAL_INST_DW_PORT = 5536 #实例监听守护进程 TCP 连接的端口 [MAL_INST2] MAL_INST_NAME = DM_YQ_02 MAL_HOST = 192.168.200.50 MAL_PORT = 5337 MAL_INST_HOST = 192.168.200.50 MAL_INST_PORT = 5237 MAL_DW_PORT = 5437 MAL_INST_DW_PORT = 5537

128756

ARCH_WAIT_APPLY = 0 #0:高性能 1:事务一致 [ARCHIVE_LOCAL] ARCH_TYPE = LOCAL #本地归档类型 ARCH_DEST = /dmdata/arch01 #本地归档存放路径 ARCH_FILE_SIZE = 1024 #单个归档大小,单位 MB ARCH_SPACE_LIMIT = 51200 #归档上限,单位 MB [ARCHIVE_REALTIME1] ARCH_TYPE = REALTIME #实时归档类型 ARCH_DEST = DM_YQ_02 #实时归档目标实例名

128772

[GRP1] DW_TYPE = GLOBAL #全局守护类型 DW_MODE = AUTO #MANUAL:故障手切 AUTO:故障自切 DW_ERROR_TIME = 20 #远程守护进程故障认定时间 INST_ERROR_TIME = 20 #本地实例故障认定时间 INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间 INST_OGUID = 45331 #守护系统唯一 OGUID 值 INST_INI = /dmdata/data01/DMTESTdm.ini #dm.ini 文件路径 INST_AUTO_RESTART = 1 #打开实例的自动启动功能 INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver #命令行方式启动 RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭 RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭

128758

2.4 拷贝备份文件从dmdata/dmbak01到dmdba账户中dmdata/dmbak02里 (这里使用网络传输模拟真实场景 也可使用cp直接复制)

scp -r /dmdata/dmbak01/BACKUP_FILE dmdba@192.168.200.50:/dmdata/dmbak02

128759

128766

2.5 注册服务操作

cd /home/dmdba/dmdbms/script/root ./dm_service_installer.sh -t dmserver -p DM_YQ_01 -dm_ini /dmdata/data01/DMTEST/dm.ini ./dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini/dmdata/data01/DMTEST/dmwatcher.ini

128757

上面是主节点的配置流程,接下来是备节点的参数配置操作

3备节点配置

3.1 配置实例(上面已经一次性把两个实例弄好了 这里略过)

3.2 恢复数据操作

达梦数据库用 dmrman 物理备份还原流程,分为还原(RESTORE) 和恢复(RECOVER) 两步

RESTORE DATABASE:物理还原(拷贝备份数据)

核心作用

  1. 把已有全量 / 增量备份集里的数据文件、数据页,完整物理拷贝到刚初始化好的 B 机器实例目录;

  2. 相当于 “复制一份备份快照”,把历史备份里的表、数据、索引文件还原到本地磁盘;

  3. 局限性: 备份时数据库有正在运行的事务,只做 RESTORE 后数据不一致,存在未提交 / 未完成事务,数据库无法正常启动。

RECOVER DATABASE:日志恢复(事务一致性修复)

核心作用

  1. 重做 REDO 归档日志:把备份结束后产生的归档日志重新执行一遍,补全备份快照之后所有增删改事务;

  2. 解决 RESTORE 后的 “数据残缺”,把数据库修正到事务一致状态;

  3. 最后更新数据库 DB_MAGIC 魔数,标记恢复完成,数据库才能正常启动;

  4. 场景延伸:搭建备库时,通过 RECOVER 持续应用归档,让 B 机器数据和主库保持同步。

配置 B 机器,备库搭建目的

  1. B 机器刚用dminit新建空实例,没有业务数据;

  2. 先用RESTORE把主库备份数据完整拉到 B 机器本地;

  3. 再用RECOVER应用归档日志,补齐备份后新增业务操作,让 B 机器数据和主库一致;

  4. 之后修改dmarch.ini归档配置,搭建主备实时同步架构。

一句话总结区别

  • RESTORE(还原):物理拷贝备份文件,只拿到某一时间点静态快照;

  • RECOVER(恢复):回放归档日志,补齐所有事务,让数据完整可用,是数据库能启动的必要步骤。

./dmrman CTLSTMT="RESTORE DATABASE '/dmdata/data02/DMTEST/dm.ini' FROM BACKUPSET '/dmdata/dmbak01/BACKUP_FILE'" ./dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data02/DMTEST/dm.ini' FROM BACKUPSET '/dmdata/dmbak01/BACKUP_FILE'" ./dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data02/DMTEST/dm.ini' UPDATE DB

3.3配置

ARCH_WAIT_APPLY = 0 #0:高性能 1:事务一致 [ARCHIVE_LOCAL] ARCH_TYPE = LOCAL #本地归档类型 ARCH_DEST = /dmdata/arch02 #本地归档存放路径 ARCH_FILE_SIZE = 1024 #单个归档大小,单位 MB ARCH_SPACE_LIMIT = 51200 #归档上限,单位 MB [ARCHIVE_REALTIME1] ARCH_TYPE = REALTIME #实时归档类型 ARCH_DEST = DM_YQ_01 #实时归档目标实例名

128765

INSTANCE_NAME = DM_YQ_02 PORT_NUM = 5237 #数据库实例监听端口 DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间 ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间 MAL_INI = 1 #打开 MAL 系统 ARCH_INI = 1 #打开归档配置 RLOG_SEND_APPL
MAL_CHECK_INTERVAL = 10 #MAL 链路检测时间间隔 MAL_CONN_FAIL_INTERVAL = 10 #判定 MAL 链路断开的时间 MAL_TEMP_PATH = /malpath #临时文件目录 MAL_BUF_SIZE = 512 #单个 MAL 缓存大小,单位 MB MAL_SYS_BUF_SIZE = 2048 #MAL 总大小限制,单位 MB MAL_COMPRESS_LEVEL = 0 #MAL 消息压缩等级,0 表示不压缩 [MAL_INST1] MAL_INST_NAME = DM_YQ_01 MAL_HOST = 192.168.200.50 #MAL 系统监听 TCP 连接的 IP 地址 MAL_PORT = 5336 #MAL 系统监听 TCP 连接的端口 MAL_INST_HOST = 192.168.200.50 #实例的对外服务 IP 地址 MAL_INST_PORT = 5236 #实例对外服务端口,和 dm.ini 的 PORT_NUM 一致 MAL_DW_PORT = 5436 #实例对应的守护进程监听 TCP 连接的端口 MAL_INST_DW_PORT = 5536 #实例监听守护进程 TCP 连接的端口 [MAL_INST2] MAL_INST_NAME = DM_YQ_02 MAL_HOST = 192.168.200.50 MAL_PORT = 5337 MAL_INST_HOST = 192.168.200.50 MAL_INST_PORT = 5237 MAL_DW_PORT = 5437 MAL_INST_DW_PORT = 5537
[GRP1] DW_TYPE = GLOBAL #全局守护类型 DW_MODE = AUTO #MANUAL:故障手切 AUTO:故障自切 DW_ERROR_TIME = 20 #远程守护进程故障认定时间 INST_ERROR_TIME = 20 #本地实例故障认定时间 INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间 INST_OGUID = 45331 #守护系统唯一 OGUID 值 INST_INI = /dmdata/data02/DMTESTdm.ini #dm.ini 文件路径 INST_AUTO_RESTART = 1 #打开实例的自动启动功能 INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver #命令行方式启动 RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭 RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭

128760

3.4注册服务

./dm_service_installer.sh -t dmserver -p DM_YQ_02 -dm_ini /dmdata/data02/DMTEST/dm.ini ./dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdata/data02/DMTEST/dmwatcher.ini

128763

3.5启动数据库并修改相关参数

cd /home/dmdba/dmdbms/bin ./DmServiceDM_YQ_01 start ./disql SYSDBA/Sysdba123.@127.0.0.1:5236 SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); SP_SET_OGUID(45331); ALTER DATABASE PRIMARY; SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

128764

cd /home/dmdba/dmdbms/bin ./DmServiceDM_YQ_02 start ./disql SYSDBA/Sysdba123.@127.0.0.1:5237 SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); SP_SET_OGUID(45331); ALTER DATABASE STANBY; SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

128771

3.6启动守护进程

cd /home/dmdba/dmdbms/bin ./DmWatcherServiceWatcher start

128768

在没有监视器的时候必须关闭守护进程才可关闭两个实例服务DM_YQ_01和DM_YQ_02 ,否则守护进程会检测到实例宕机-进行重启动作

3.7配置确认监视器:

MON_DW_CONFIRM = 1 #0:非确认(故障手切) 1:确认(故障自切) MON_LOG_PATH = ../log #监视器日志文件存放路径 MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件 MON_LOG_FILE_SIZE = 512 #单个日志大小,单位 MB MON_LOG_SPACE_LIMIT = 2048 #日志上限,单位 MB [GRP1] MON_INST_OGUID = 45331 #组 GRP1 的唯一 OGUID 值 MON_DW_IP = 192.168.200.50:5336 #IP 对应 MAL_HOST,PORT 对应 MAL_DW_PORT MON_DW_IP = 192.168.200.50:5337

128767

3.8注册服务

./dm_service_installer.sh -t dmmonitor -p Monitor -monitor_ini /home/dmdba/dmdbms/bin/dmmonitor.ini

128761

3.9配置非确认监视器:

MON_DW_CONFIRM = 0 #0:非确认(故障手切) 1:确认(故障自切) MON_LOG_PATH = ../log #监视器日志文件存放路径 MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件 MON_LOG_FILE_SIZE = 512 #单个日志大小,单位 MB MON_LOG_SPACE_LIMIT = 2048 #日志上限,单位 MB [GRP1] MON_INST_OGUID = 45331 #组 GRP1 i的唯一 OGUID 值 MON_DW_IP = 192.168.200.50:5336 #IP 对应 MAL_HOST,PORT 对应 MAL_DW_PORT MON_DW_IP = 192.168.200.50:5337

非确认监视器无需注册服务

128762

4 打开监视器查看主备节点情况

在打开监视器之前须先打开两个数据库的实例,然后打开相对应的守护进程,最后打开监视器进行查看

su dmdba cd /home/dmdba/dmdbms/bin ./dmmonitor dmmonitor.ini show

128773

128775

https://eco.dameng.com

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服