1.安装环境

本次基于银河麒麟操作系统开展达梦 DM8 主备数据守护集群搭建工作,采用单台主机内部部署一主一备双实例的架构方案。

主库

备库

业务 IP

192.168.140.130

192.168.140.130

实例名

GRP1_RT_01

GRP1_RT_02

数据库名

DB01

DB02

实例端口

6236

7236

MAL 端口

6336

7336

MAL_DW_PORT

6436

7436

MAL_INST_DW_PORT

6536

7536

OGUID

66123

66123

守护组

GRP1

GRP1

安装目录

/home/dmdba/dmdbms

/home/dmdba/dmdbms

实例目录

/dmdata/data/DB01

/dmdata/data/DB02

2.集群搭建

2.1配置A节点

初始化实例

./dminit PATH=/dmdata/data/ DB NAME=DBO1 INSTANCE NAME=GRPI RT 01 PAGE SIZE=8 EXTENT SIZE=16 LOG SIZE=256 PORT NUM=6236 SYSDBA PWD=ZS010310 SYSAUDITOR PWD=ZS010310

启动服务

./DmServiceDB0l start

开启归档

./disql 'SYSDBA/Zs010310@127.0.1.1:6236'

SQLALTER DATABASE MOUNT;

SQLALTER DATABASE ARCHIVELOG;

SQLALTER DATABASE ADD ARCHIVELOG 

'DEST=/dmdata/data/DB01/arch, TYPE=LOCAL, FILE_SIZE=256, SPACE_LIMIT=51200';

SQLALTER DATABASE OPEN;

备份数据

SQL> BACKUP DATABASE BACKUPSET '/dmdata/data/DB01/bak/FULL_BACKUP_20260720';

修改 dm.ini

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);

关闭实例服务,修改 dmarch.ini

#DaMeng Database Archive Configuration file

#this is comments

ARCH_WAIT_APPLY        = 0

[ARCHIVE_LOCAL1]

        ARCH_TYPE        = LOCAL

        ARCH_DEST        = /dmdata/data/DB01/arch

        ARCH_FILE_SIZE   = 64

        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 链路检测时间间隔

MAL_CONN_FAIL_INTERVAL     = 10  #判定 MAL 链路断开的时间

MAL_TEMP_PATH              = /dmdata/data/DB01/malpath/  #临时文件目录:注意,搭建伪集群时,2个节点使用不同的目录

MAL_BUF_SIZE               = 64  #单个 MAL 缓存大小,单位 MB

MAL_SYS_BUF_SIZE           = 2048  #MAL 总大小限制,单位 MB

MAL_COMPRESS_LEVEL         = 0  #MAL 消息压缩等级,表示不压缩

[MAL_INST1]

MAL_INST_NAME            = GRP1_RT_01  #实例名,和 dm.ini  INSTANCE_NAME 一致

MAL_HOST                 = 192.168.140.130  #MAL 系统监听 TCP 连接的 IP 地址

MAL_PORT                 = 6336  #MAL 系统监听 TCP 连接的端口

MAL_INST_HOST            = 192.168.140.130  #实例的对外服务 IP 地址

MAL_INST_PORT            = 6236  #实例对外服务端口,和 dm.ini  PORT_NUM 一致(实例的)

MAL_DW_PORT              = 6436  #实例对应的守护进程监听 TCP 连接的端口(守护进程的)

MAL_INST_DW_PORT         = 6536  #实例监听守护进程 TCP 连接的端口(实例的)

[MAL_INST2]

MAL_INST_NAME            = GRP1_RT_02

MAL_HOST                 = 192.168.140.130

MAL_PORT                 = 7336

MAL_INST_HOST            = 192.168.140.130

MAL_INST_PORT            = 7236

MAL_DW_PORT              = 7436

MAL_INST_DW_PORT         = 7536

创建 dmwatcher.ini

vi /dmdata/data/DB01/dmwatcher.ini

[GRP1]

DW_TYPE                  = GLOBAL  #全局守护类型

DW_MODE                  = AUTO  #MANUAL:故障手切 AUTO:故障自切

DW_ERROR_TIME            = 20  #远程守护进程故障认定时间

INST_ERROR_TIME          = 20  #本地实例故障认定时间

INST_RECOVER_TIME        = 60  #主库守护进程启动恢复的间隔时间

INST_OGUID               = 66123  #守护系统唯一 OGUID 

INST_INI                 = /dmdata/data/DB01/dm.ini  #dm.ini 文件路径

INST_AUTO_RESTART        = 1  #打开实例的自动启动功能

INST_STARTUP_CMD         = /home/dmdba/dmdbms/bin/dmserver  #命令行方式动

RLOG_SEND_THRESHOLD      = 0  #指定主库发送日志到备库的时间阈值,默认关闭

RLOG_APPLY_THRESHOLD     = 0  #指定备库重演日志的时间阈值,默认关闭

注册服务

注册DB01数据库实例服务

[root@zhangsu ~]# /home/dmdba/dmdbms/script/root/dm_service_shturl.cc/sL -t dmserver -p GRP1_RT_01 -dm_ini /dmdata/data/DB01/dm.ini -m mount

注册DB01守护进程服务

[root@zhangsu ~]# /home/dmdba/dmdbms/script/root/dm_service_shturl.cc/sL -t dmwatcher -p Watcher01 -watcher_ini /dmdata/data/DB01/dmwatcher.ini

2.2 配置B节点

初始化实例

./dminit PATH=/dmdata/data/ DB_NAME=DB02 INSTANCE_NAME=GRP1_RT_02 PAGE_SIZE=8 EXTENT_SIZE=16 LOG_SIZE=256 PORT_NUM=7236 SYSDBA_PWD=Zs010310 SYSAUDITOR_PWD=Zs010310

恢复数据

./dmrman CTLSTMT="RESTORE DATABASE '/dmdata/data/DB02/dm.ini' 

FROM BACKUPSET '/dmdata/data/DB01/bak/FULL_BACKUP_20260720'"

./dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data/DB02/dm.ini'

FROM BACKUPSET '/dmdata/data/DB01/bak/FULL_BACKUP_20260720'"

./dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data/DB02/dm.ini' UPDATE DB_MAGIC"

配置dmarch.ini

vi /dmdata/data/DB02/dmarch.ini

[ARCHIVE_LOCAL]

ARCH_TYPE                = LOCAL  #本地归档类型

ARCH_DEST                = /dmdata/data/DB02/arch/  #本地归档存放路径

ARCH_FILE_SIZE           = 256  #单个归档大小,单位 MB

ARCH_SPACE_LIMIT         = 51200  #归档上限,单位 MB

[ARCHIVE_REALTIME1]

ARCH_TYPE                = REALTIME  #实时归档类型

ARCH_DEST                = GRP1_RT_01  #实时归档目标实例名

dm.ini配置

INSTANCE_NAME  = GRP1_RT_02

PORT_NUM = 7236                               #数据库实例监听端口

DW_INACTIVE_INTERVAL = 60              #接收守护进程消息超时时间

ALTER_MODE_STATUS = 0                     #不允许手工方式修改实例模式/状态/OGUID

ENABLE_OFFLINE_TS  = 2                      #不允许备库 OFFLINE 表空间

MAL_INI = 1                                           #打开 MAL 系统

ARCH_INI = 1                                         #打开归档配置

RLOG_SEND_APPLY_MON = 64             #统计最近 64 次的日志重演信息

配置dmmal.ini

vi /dmdata/data/DB02/dmmal.ini

MAL_CHECK_INTERVAL         = 10  #MAL 链路检测时间间隔

MAL_CONN_FAIL_INTERVAL     = 10  #判定 MAL 链路断开的时间

MAL_TEMP_PATH              = /dmdata/data/DB02/malpath/  #临时文件目录:注意,搭建伪集群时,2个节点使用不同的目录

MAL_BUF_SIZE               = 64  #单个 MAL 缓存大小,单位 MB

MAL_SYS_BUF_SIZE           = 2048  #MAL 总大小限制,单位 MB

MAL_COMPRESS_LEVEL         = 0  #MAL 消息压缩等级,表示不压缩

[MAL_INST1]

MAL_INST_NAME            = GRP1_RT_01  #实例名,和 dm.ini  INSTANCE_NAME 一致

MAL_HOST                 = 192.168.140.130  #MAL 系统监听 TCP 连接的 IP 地址

MAL_PORT                 = 6336  #MAL 系统监听 TCP 连接的端口

MAL_INST_HOST            = 192.168.140.130  #实例的对外服务 IP 地址

MAL_INST_PORT            = 6236  #实例对外服务端口,和 dm.ini  PORT_NUM 一致

MAL_DW_PORT              = 6436  #实例对应的守护进程监听 TCP 连接的端口

MAL_INST_DW_PORT         = 6536  #实例监听守护进程 TCP 连接的端口

[MAL_INST2]

MAL_INST_NAME            = GRP1_RT_02

MAL_HOST                 = 192.168.140.130

MAL_PORT                 = 7336

MAL_INST_HOST            = 192.168.140.130

MAL_INST_PORT            = 7236

MAL_DW_PORT              = 7436

MAL_INST_DW_PORT         = 7536

dmwatcher.ini配置

vi /dmdata/data/DB02/dmwatcher.ini

[GRP1]

DW_TYPE                  = GLOBAL  #全局守护类型

DW_MODE                  = AUTO  #MANUAL:故障手切 AUTO:故障自切

DW_ERROR_TIME            = 20  #远程守护进程故障认定时间

INST_ERROR_TIME          = 20  #本地实例故障认定时间

INST_RECOVER_TIME        = 60  #主库守护进程启动恢复的间隔时间

INST_OGUID               = 66123  #守护系统唯一 OGUID 

INST_INI                 = /dmdata/data/DB02/dm.ini  #dm.ini 文件路径

INST_AUTO_RESTART        = 1  #打开实例的自动启动功能

INST_STARTUP_CMD         = /home/dmdba/dmdbms/bin/dmserver  #命令行方式启动

RLOG_SEND_THRESHOLD      = 0  #指定主库发送日志到备库的时间阈值,默认关闭

RLOG_APPLY_THRESHOLD     = 0  #指定备库重演日志的时间阈值,默认关闭

注册服务

/home/dmdba/dmdbms/script/root/dm_service_shturl.cc/iZ -t dmserver -p GRP1_RT_02 -dm_ini /dmdata/data/DB02/dm.ini -m mount

/home/dmdba/dmdbms/script/root/dm_service_shturl.cc/iZ -t dmwatcher -p Watcher02 -watcher_ini /dmdata/data/DB02/dmwatcher.ini

2.3配置监视器

创建 dmmonitor.ini(确认监视器)

MON_DW_CONFIRM             = 1  #0:非确认(故障手切) 1:确认(故障自切)

MON_LOG_PATH               = ../log  #监视器日志文件存放路径

MON_LOG_INTERVAL           = 60  #每隔 60s 定时记录系统信息到日志文件

MON_LOG_FILE_SIZE          = 64  #单个日志大小,单位 MB

MON_LOG_SPACE_LIMIT        = 2048  #日志上限,单位 MB

[GRP1]

MON_INST_OGUID           = 66123  # GRP1 的唯一 OGUID 

MON_DW_IP                = 192.168.140.130:6436  #IP 对应 MAL_HOSTPORT 对应 MAL_DW_PORT

MON_DW_IP                = 192.168.140.130:7436

创建 dmmonitor_manual.ini非确认监视器)

配置确认监视器后,额外准备一份 MON_DW_CONFIRM=0 的非确认监视器配置文件,便于前台启动执行手动主备切换。(可选)

MON_DW_CONFIRM             = 0  #0:非确认(故障手切) 1:确认(故障自切)

MON_LOG_PATH               = ../log  #监视器日志文件存放路径

MON_LOG_INTERVAL           = 60  #每隔 60s 定时记录系统信息到日志文件

MON_LOG_FILE_SIZE          = 64  #单个日志大小,单位 MB

MON_LOG_SPACE_LIMIT        = 2048  #日志上限,单位 MB

[GRP1]

MON_INST_OGUID           = 66123  # GRP1 的唯一 OGUID 

MON_DW_IP                = 192.168.140.130:6436  #IP 对应 MAL_HOSTPORT 对应 MAL_DW_PORT

MON_DW_IP                = 192.168.140.130:7436

2.4启动服务

启动数据库并修改参数

##A节点 GRP1_RT_01

启动数据库实例服务

/home/dmdba/dmdbms/bin/DmServiceGRP1_RT_01 start

# disql登录数据库

/home/dmdba/dmdbms/bin/disql SYSDBA/Zs010310@192.168.140.130:6236

SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);   开启允许手动修改数据库模式

SQL>SP_SET_OGUID(66123);                            设置集群统一OGUID

SQL>ALTER DATABASE PRIMARY;                         将当前实例设置为主库

SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);   关闭手动修改模式权限

##B节点 GRP1_RT_02

启动数据库实例服务

/home/dmdba/dmdbms/bin/DmServiceGRP1_RT_02 start

# disql登录数据库

/home/dmdba/dmdbms/bin/disql SYSDBA/Zs010310@192.168.140.130:7236

SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);   开启允许手动修改数据库模式

SQL>SP_SET_OGUID(66123);                            设置集群统一OGUID

SQL>ALTER DATABASE STANDBY;                         将当前实例设置为备库

SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);   关闭手动修改模式权限

启动守护进程和确认监视器

/home/dmdba/dmdbms/bin/DmWatcherServiceWatcher01 start

/home/dmdba/dmdbms/bin/DmWatcherServiceWatcher02 start

/home/dmdba/dmdbms/bin/dmmonitor /home/dmdba/dmdbms/bin/dmmonitor.ini

3. 测试

3.1数据同步测试 

在主库创建新表TB_TEST,插入数据,登录备库查询TB_TEST.

   

3.2 主库故障,备库自动接管

4.读写分离

客户端连接时使用服务名访问,驱动自动按照规则完成读写请求分发,实现读写分离;当主节点故障时,支持自动切换访问节点。

##全局配置区

TIME_ZONE=(480)          设置时区,480代表东八区

LANGUAGE=(cn)            设置客户端语言为中文

DMRW=(192.168.220.128:6236,192.168.220.128:7236服务名,填写主库、备库地址端口

##服务配置

[DMRW]

LOGIN_MODE=(1)           优先连接主库,主库故障自动切换备库

RW_SEPARATE=(1)          开启读写分离功能,0关闭、1开启

RW_PERCENT=(30)          # 30%请求访问主库,剩余读请求分发至备库

SWITCH_TIMES=(60)        访问故障节点最大重试次数

SWITCH_INTERVAL=(1000)   节点重试连接间隔,单位ms

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐