注册
DM8数据守护和读写分离集群
专栏/技术分享/ 文章详情 /

DM8数据守护和读写分离集群

好好先生 2025/11/21 107 0 0
摘要

环境规划

A机器 B机器
业务IP 192.168.236.21 192.168.236.22
心跳IP 10.10.10.11 10.10.10.12
实例名 DMSERVER DMSERVERSTD
实例端口 dm.PORT_NUM dmmal.MAL_INST_PORT 15236 25236
MAL端口 dmmal.MAL_PORT 15336 25336
MAL守护进程端口 dmmal.MAL_DW_PORT 15436 25436
守护进程端口 dm.DW_PORT 15536 25536
OGUID 251113
守护组 GDW1
安装目录 /dm8 /dm8
实例目录 /dm8/data /dm8/data
归档上限 5120
确认监视器IP 10.10.10.10

DMRWC.jpg

1配置A机器(192.168.236.21)

1.1 初始化实例和数据备份

-初始化实例 [dmdba@~]# /dm8/bin/dminit PATH=/dm8/data/ INSTANCE_NAME=DMSERVER PAGE_SIZE=32 LOG_SIZE=256 SYSDBA_PWD=Dameng.com123 SYSAUDITOR_PWD=Dameng.com123 --启动服务 [dmdba@~]# /dm8/bin/dmserver /dm8/data/DAMENG/dm.ini --开启归档 [dmdba@~]# /dm8/bin/disql SYSDBA/*****@192.168.236.21:15236 SQL> ALTER DATABASE MOUNT; SQL> ALTER DATABASE ARCHIVELOG; SQL> ALTER DATABASE ADD ARCHIVELOG 'DEST=/dm8/data/DAMENG/arch, TYPE=LOCAL,FILE_SIZE=128, SPACE_LIMIT=5120'; SQL> ALTER DATABASE OPEN; --备份数据 SQL> BACKUP DATABASE BACKUPSET '/dm8/data/DAMENG/bak/BACKUP_FILE'; --修改dm.ini 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);

此外,生产环境上还应设置重演日志的相关参数:

1.REDOS_BUF_SIZE:待重演日志堆积的内存限制,堆积的日志缓冲区占用内存超过此限制,则新的日志将会被延迟加入重演队列,等待重演释放部分内存后再加入。

2.REDOS_BUF_NUM:待重演日志缓冲区允许堆积的数目限制,超过限制则新的日志将会被延迟加入重演队列,等待堆积数减少后再加入。

3.REDOS_MAX_DELAY:备库重演日志缓冲区的时间限制,超过此限制则认为重演异常,服务器自动宕机,防止日志堆积、主库不能及时响应用户请求。

注意:REDOS_BUF_SIZE和REDOS_BUF_NUM同时起作用,只要达到一个条件即会触发延迟处理。以上参数建议值如下:

SP_SET_PARA_VALUES(2,’REDO_BUF_NUM’,99999); SP_SET_PARA_VALUES(2,’REDOS_BUF_SIZE’,10240); SP_SET_PARA_VALUES(2,’REDOS_MAX_DELAY’,180);

关闭前台实例服务。

1.2替换dmarch.ini

[dmdba@~]# vi /dm8/data/DAMENG/dmarch.ini

[ARCHIVE_LOCAL] ARCH_TYPE = LOCAL #本地归档类型 ARCH_DEST = /dm8/data/DAMENG/arch/ #本地归档存放路径 ARCH_FILE_SIZE = 256 #单个归档大小,单位MB ARCH_SPACE_LIMIT = 5120 #归档上限,单位MB [ARCHIVE_REALTIME] ARCH_TYPE = REALTIME #实时归档类型 ARCH_DEST = DMSERVERSTD #实时归档目标实例名

1.3创建dmmal.ini

[dmdba@~]# vi /dm8/data/DAMENG/dmmal.ini
MAL_CHECK_INTERVAL = 10 #MAL链路检测时间间隔 MAL_CONN_FAIL_INTERVAL = 10 #判定MAL链路断开的时间 MAL_TEMP_PATH = /dm8/data/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 = DMSERVER #实例名,和 dm.ini的INSTANCE_NAME一致 MAL_HOST = 10.10.10.11 #MAL系统监听TCP连接的IP地址 MAL_PORT = 15336 #MAL系统监听TCP连接的端口 MAL_INST_HOST = 192.168.236.21 #实例的对外服务IP地址 MAL_INST_PORT = 15236 #实例对外服务端口,和dm.ini的PORT_NUM一致 MAL_DW_PORT = 15436 #实例对应的守护进程监听TCP连接的端口 MAL_INST_DW_PORT = 15536 #实例监听守护进程TCP连接的端口 [MAL_INST2] MAL_INST_NAME = DMSERVERSTD MAL_HOST = 10.10.10.12 MAL_PORT = 25336 MAL_INST_HOST = 192.168.236.22 MAL_INST_PORT = 25236 MAL_DW_PORT = 25436 MAL_INST_DW_PORT =25536

1.4创建dmwatcher.ini

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

​ 注意:DM8里不再生成dmwatcher.ctl文件。

1.5拷贝实例

[dmdba@~]# scp -r /dm8/data/DAMENG dmdba@10.10.10.12:/dm8/data/

1.6注册服务

[root@~]# /dm8/script/root/dm_service_installer.sh -t dmserver -p DMSERVER -dm_ini /dm8/data/DAMENG/dm.ini -m mount [root@~]# /dm8/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dm8/data/DAMENG/dmwatcher.ini

备注:卸载或禁用的时候删除自启,现在不需要执行

[root@~]# /dm8/script/root/dm_service_uninstaller.sh -n DmServiceDMSERVER [root@~]# /dm8/script/root/dm_service_uninstaller.sh -n DmWatcherServiceWatcher

2配置B机器(192.168.236.22)

2.1修改dm.ini

[dmdba@~]# vi /dm8/data/DAMENG/dm.ini

修改对应备库的实例名

INSTANCE_NAME = DMSERVERSTD #数据库实例名

2.2替换dmarch.ini

[dmdba@~]# vi /dm8/data/DAMENG/dmarch.ini
[ARCHIVE_LOCAL] ARCH_TYPE = LOCAL #本地归档类型 ARCH_DEST = /dm8/data/DAMENG/arch/ #本地归档存放路径 ARCH_FILE_SIZE = 256 #单个归档大小,单位MB ARCH_SPACE_LIMIT = 5120 #归档上限,单位MB [ARCHIVE_REALTIME] ARCH_TYPE = REALTIME #实时归档类型 ARCH_DEST = DMSERVER #实时归档目标实例名

2.3配置dmmal.ini,dmwatcher.ini相同配置文件

与A机器DMSERVER的dmmal.ini、dmwatcher.ini相同,不用修改。

2.4注册服务

[root@~]# /dm8/script/root/dm_service_installer.sh -t dmserver -p DMSERVERSTD -dm_ini /dm8/data/DAMENG/dm.ini -m mount [root@~]# /dm8/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dm8/data/DAMENG/dmwatcher.ini

备注:卸载或禁用的时候删除自启,现在不需要执行

[root@~]# /dm8/script/root/dm_service_uninstaller.sh -n DmServiceDMSERVERSTD [root@~]# /dm8/script/root/dm_service_uninstaller.sh -n DmWatcherServiceWatcher

2.5恢复数据

[dmdba@~]# /dm8/bin/dmrman CTLSTMT="RESTORE DATABASE '/dm8/data/DAMENG/dm.ini' FROM BACKUPSET '/dm8/data/DAMENG/bak/BACKUP_FILE'" [dmdba@~]# /dm8/bin/dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' FROM BACKUPSET '/dm8/data/DAMENG/bak/BACKUP_FILE'" [dmdba@~]# /dm8/bin/dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' UPDATE DB_MAGIC"

3配置确认监视器(10.10.10.10)

1.在各节点数据库的bin目录中 存放非确认监视器配置文件。
注意:建议在各节点上至少放置一个非确认监视器,以免确认监视器机器故障时,无法进行及时切机。
2.在确认监视器机器上(非集群节点) 注册确认监视器自启服务。

3.1创建dmmonitor.ini

[dmdba@~]# vi /dm8/bin/dmmonitor.ini
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 [GDW1] MON_INST_OGUID = 251113 #组GDW1的唯一OGUID 值 MON_DW_IP = 10.10.10.11:15436 #IP对应MAL_HOST,PORT对应MAL_DW_PORT MON_DW_IP = 10.10.10.12:25436

3.2注册服务

[root@~]# /dm8/script/root/dm_service_installer.sh -t dmmonitor -p Monitor -monitor_ini /dm8/bin/dmmonitor.ini

备注:卸载或禁用的时候删除自启,现在不需要执行

[root@~]# /dm8/script/root/dm_service_uninstaller.sh -n DmMonitorServiceMonitor

3.3监视器使用

命令 含义
list 查看守护进程的配置信息
show global info 查看所有实例组的信息
tip 查看系统当前运行状态
login 登录监视器
logout 退出登录
choose switchover GDW1 主机正常:查看可切换为主机的实例列表
switchover GDW1.实例名 主机正常:使用指定组的指定实例,切换为主机
choose takeover GDW1 主机故障:查看可切换为主机的实例列表
takeover GDW1.实例名 主机故障:使用指定组的指定实例,切换为主机
choose takeover force GDW1 强制切换:查看可切换为主机的实例列表

更多常用命令和参数介绍请参考监视器 | 达梦技术文档

4启动服务及查看信息

4.1启动数据库并修改参数

–A机器

[dmdba@~]# /dm8/bin/DmServiceDMSERVER start [dmdba@~]# /dm8/bin/disql SYSDBA/*****@192.168.236.21:5236
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); SQL> SP_SET_OGUID(251113); SQL> ALTER DATABASE PRIMARY; SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

–B机器

[dmdba@~]# /dm8/bin/DmServiceDMSERVERSTD start [dmdba@~]# /dm8/bin/disql SYSDBA/*****@192.168.236.22:5236
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); SQL> SP_SET_OGUID(251113); SQL> ALTER DATABASE STANDBY; SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

4.2启动守护进程

A/B机器:

[dmdba@~]# /dm8/bin/DmWatcherServiceWatcher start

4.3前台启动监视器

监视器机器:

[dmdba@~]# /dm8/bin/dmmonitor /dm8/bin/dmmonitor.ini

注意

一个数据守护集群,只能配置一个确认监视器。如果同时启动多个确认监视器,后启动的确认监视器将报错并自动退出。

后台启动命令:[dmdba@~]# /dm8/bin/dmmonitor /dm8/bin/dmmonitor.ini

4.4启停集群

4.4.1启动数据守护系统

手动方式启动数据守护系统时,对于守护进程,数据库实例和监视器的启动顺序没有严格要求,也可以通过监视器命令启动守护系统(前提是所有守护进程已经启动)。

配置了INST_AUTO_RESTART = 1 ,只需要启动A/B机器守护进程,守护进程会自动启动对应的DMSERVER主库和DMSERVERSTD备库。

A/B机器:

[dmdba@~]# /dm8/bin/DmWatcherServiceWatcher start

4.4.2关闭数据守护系统

关闭守护系统时,必须按照一定的顺序来关闭守护进程和数据库实例。特别是自动切换模式,如果退出守护进程或主备库的顺序不正确,可能会引起主备切换,甚至造成守护进程组分裂。

通过监视器执行 Stop Group 命令关闭数据守护系统,是最简单、安全的方式。命令执行成功后,数据库实例正常关闭。但守护进程并没有真正退出,而是将状态切换为 Shutdown 状态。

在监视器节点:

[dmdba@~]# /dm8/bin/dmmonitor path=/dm8/bin/dmmonitor.ini login 用户名:sysdba 密码: [monitor] 2025-11-17 10:17:36: 登录监视器成功! 输入命令非法,请输入help命令查看帮助信息! stop group GDW1 [monitor] 2025-11-17 10:17:48: STOP实例DMSERVER[PRIMARY, OPEN, ISTAT_SAME:TRUE]的守护进程 [monitor] 2025-11-17 10:17:48: 守护进程(DMSERVER)状态切换 [OPEN-->SHUTDOWN] [monitor] 2025-11-17 10:17:49: STOP实例DMSERVER[PRIMARY, OPEN, ISTAT_SAME:TRUE]的守护进程成功 [monitor] 2025-11-17 10:17:49: STOP实例DMSERVERSTD[STANDBY, OPEN, ISTAT_SAME:TRUE]的守护进程 [monitor] 2025-11-17 10:17:49: 守护进程(DMSERVERSTD)状态切换 [OPEN-->SHUTDOWN] [monitor] 2025-11-17 10:17:49: STOP实例DMSERVERSTD[STANDBY, OPEN, ISTAT_SAME:TRUE]的守护进程成功 [monitor] 2025-11-17 10:17:49: 通知实例(DMSERVER)SHUTDOWN [monitor] 2025-11-17 10:17:58: 通知实例(DMSERVER)SHUTDOWN成功,请等待实例完全退出 [monitor] 2025-11-17 10:17:58: 通知实例(DMSERVERSTD)SHUTDOWN [monitor] 2025-11-17 10:18:09: 通知实例(DMSERVERSTD)SHUTDOWN成功,请等待实例完全退出 [monitor] 2025-11-17 10:18:09: 通知组(GDW1)的守护进程执行清理操作 [monitor] 2025-11-17 10:18:09: 清理守护进程(DMSERVER)请求成功 [monitor] 2025-11-17 10:18:09: 清理守护进程(DMSERVERSTD)请求成功 [monitor] 2025-11-17 10:18:10: 退出组(GDW1)中所有活动实例成功

Stop Group 命令内部流程如下:

  1. 通知守护进程切换为 Shutdown 状态
  2. 通知主库退出
  3. 通知其他备库退出

如果使用手动方式关闭数据守护系统,请严格按照以下顺序执行:

  1. 如果启动了确认监视器,先关闭确认监视器(防止自动接管)
  2. 关闭备库守护进程(防止重启实例)
  3. 关闭主库守护进程(防止重启实例)
  4. Shutdown 主库
  5. Shutdown 备库

如果是只关闭主库,并且不想引发备库自动接管,有以下两种方法:

方法一:

1.通过 Detach database 命令将所有备库分离

2.通过 Stop database 命令退出主库

方法二:严格按照以下顺序执行:

  1. 通过 Stop dmwatcher 命令关闭所有守护进程监控
  2. 手动正常退出主库

如果是只关闭备库,并且不想引发主库发送日志失败进入 Suspend 状态,请严格按照以下顺序执行:

  1. 通过 Detach database 命令将备库分离出数据守护系统
  2. 正常退出备库(手动退出或者通过 Stop database 命令退出)

注意

关闭整个数据守护系统时,先关闭主库再关闭备库,顺序一定不能错。对于本地守护类型的库,在关闭数据守护系统时,不受此顺序限制。

因为主库 Shutdown 过程中,需要 Purge 所有已提交事务,会修改数据,并产生 Redo 日志。如果先 Shutdown 备库,会导致主库发送归档日志失败,并且由于主库已经处于 Shutdown 状态,会导致主库异常关闭。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服