注册
DM8 两节点读写分离集群搭建与功能测试技术文档
技术分享/ 文章详情 /

DM8 两节点读写分离集群搭建与功能测试技术文档

派仔 2026/07/31 145 0 0

1. 实验背景

  • 达梦读写分离集群是基于即时归档(TIMELY)实现的高性能数据库集群,在数据守护基础上增加了读写操作自动分离、负载均衡等特性。通过配置事务一致模式保证主备库数据一致性,配合达梦数据库接口,将只读操作自动分流到备库执行,有效降低主库负载,提升系统吞吐量。
  • 本次实验环境:CentOS 7 + DM8 版本,两台 VMware NAT 虚拟机,一主一备读写分离集群,完整覆盖部署、同步验证、读写分发比例配置、主备集群差异分析全流程。
  • 2. 实验内容与要求

  • 部署 DM8 两节点读写分离集群,验证建表和插入数据备机可实时同步并可查询。
  • 配置读写事务分发比例,实现读请求自动分流。
  • 理解读写分离集群与主备集群的架构差异。

3. 集群规划

  • 参数项 1号机(主节点) 2号机(备节点)
  • 业务IP/心跳IP 192.168.10.138 192.168.10.139
  • 数据库实例名 GRP1_RT_01 GRP1_RT_02
  • 数据库端口 5236 5236
  • MAL通信端口 61141 61142
  • MAL_DW_PORT(守护进程监听) 52141 52142
  • MAL_INST_DW_PORT(实例监听守护) 33141 33142
  • 集群角色 PRIMARY(主库) STANDBY(备库)
  • 归档类型 TIMELY(即时归档) TIMELY(即时归档)
  • 达梦安装路径 /home/dmdba/dmdbms /home/dmdba/dmdbms
  • 操作系统用户 dmdba:dinstall dmdba:dinstall
  • 数据库管理员账号 SYSDBA,密码 Dameng@123 SYSDBA,密码 Dameng@123
  • 守护组名 GRP1 GRP1
  • OGUID 453331 453331

4. 集群前置准备(双节点统一操作)

4.1 配置主机名解析

cat >> /etc/hosts << EOF
192.168.10.138 dm1
192.168.10.139 dm2
EOF

4.2 关闭防火墙和 SELinux

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

4.3 时间同步配置

yum install -y chrony
systemctl start chronyd
systemctl enable chronyd
chronyc tracking

5. 主节点(192.168.10.138)集群配置

5.1 安装达梦数据库软件

bashsu - dmdba
/mnt/dm_iso/DMInstall.bin -i

安装类型:典型安装,安装目录:/home/dmdba/dmdbms。
安装完成后以 root 执行:

/home/dmdba/dmdbms/script/root/root_installer.sh

5.2 配置环境变量

cat >> /home/dmdba/.bash_profile << "EOF"
export DM_HOME=/home/dmdba/dmdbms
export PATH=\$PATH:\$DM_HOME/bin
export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:\$DM_HOME/bin
EOF
source /home/dmdba/.bash_profile

5.3 初始化主库实例

dminit PATH=/home/dmdba/dmdbms/data INSTANCE_NAME=GRP1_RT_01 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048 SYSDBA_PWD=Dameng@123 SYSAUDITOR_PWD=Dameng@123

5.4 配置 dm.ini

cd /home/dmdba/dmdbms/data/DAMENG
sed -i 's/^INSTANCE_NAME.*/INSTANCE_NAME = GRP1_RT_01/' dm.ini
sed -i 's/^PORT_NUM.*/PORT_NUM = 5236/' dm.ini
sed -i 's/^DW_INACTIVE_INTERVAL.*/DW_INACTIVE_INTERVAL = 60/' dm.ini
sed -i 's/^ALTER_MODE_STATUS.*/ALTER_MODE_STATUS = 0/' dm.ini
sed -i 's/^ENABLE_OFFLINE_TS.*/ENABLE_OFFLINE_TS = 2/' dm.ini
sed -i 's/^MAL_INI.*/MAL_INI = 1/' dm.ini
sed -i 's/^ARCH_INI.*/ARCH_INI = 1/' dm.ini
echo "RLOG_SEND_APPLY_MON = 64" >> dm.ini

5.5 创建 dmmal.ini(双节点必须完全一致)

cat > dmmal.ini << "EOF"
MAL_CHECK_INTERVAL = 5
MAL_CONN_FAIL_INTERVAL = 5

[MAL_INST1]
MAL_INST_NAME = GRP1_RT_01
MAL_HOST = 192.168.10.138
MAL_PORT = 61141
MAL_INST_HOST = 192.168.10.138
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.10.139
MAL_PORT = 61142
MAL_INST_HOST = 192.168.10.139
MAL_INST_PORT = 5236
MAL_DW_PORT = 52142
MAL_INST_DW_PORT = 33142
EOF

5.6 创建 dmarch.ini(读写分离使用 TIMELY 归档)

cat > dmarch.ini << "EOF"
[ARCHIVE_TIMELY1]
ARCH## 二级标题_TYPE = TIMELY
ARCH_DEST = GRP1_RT_02

[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /home/dmdba/dmdbms/data/DAMENG/arch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
EOF

5.7 创建 dmwatcher.ini

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

5.8 以 Mount 方式启动,设置 OGUID 和 PRIMARY 模式

dmserver /home/dmdba/dmdbms/data/DAMENG/dm.ini mount
另开终端连接:
bash
disql SYSDBA/Dameng@123@192.168.10.138:5236
执行:
sql
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SP_SET_OGUID(453331);
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE ADD ARCHIVELOG 'DEST=/home/dmdba/dmdbms/data/DAMENG/arch, TYPE=LOCAL, FILE_SIZE=128, SPACE_LIMIT=0';
ALTER DATABASE ADD ARCHIVELOG 'DEST=GRP1_RT_02, TYPE=TIMELY';
ALTER DATABASE PRIMARY;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

5.9 脱机全量备份

dmrman CTLSTMT="BACKUP DATABASE '/home/dmdba/dmdbms/data/DAMENG/dm.ini' FULL BACKUPSET '/home/dmdba/dmdbms/backup/BACKUP_FULL'"

5.10 传输文件到备机

scp -r /home/dmdba/dmdbms/backup dmdba@192.168.10.139:/home/dmdba/dmdbms/
scp /home/dmdba/dmdbms/data/DAMENG/dm.ini dmdba@192.168.10.139:/home/dmdba/dmdbms/data/DAMENG/
scp /home/dmdba/dmdbms/data/DAMENG/dmmal.ini dmdba@192.168.10.139:/home/dmdba/dmdbms/data/DAMENG/
scp /home/dmdba/dmdbms/data/DAMENG/dmwatcher.ini dmdba@192.168.10.139:/home/dmdba/dmdbms/data/DAMENG/

6. 备节点(192.168.10.139)集群配置

6.1 安装达梦软件

(同主库步骤,安装目录 /home/dmdba/dmdbms)

6.2 配置环境变量

cat >> /home/dmdba/.bash_profile << "EOF"
export DM_HOME=/home/dmdba/dmdbms
export PATH=\$PATH:\$DM_HOME/bin
export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:\$DM_HOME/bin
EOF
source /home/dmdba/.bash_profile

6.3 修改实例名

cd /home/dmdba/dmdbms/data/DAMENG
sed -i 's/^INSTANCE_NAME.*/INSTANCE_NAME = GRP1_RT_02/' dm.ini

6.4 创建备库 dmarch.ini(TIMELY 归档指向主库)

cat > dmarch.ini << "EOF"
[ARCHIVE_TIMELY1]
ARCH_TYPE = TIMELY
ARCH_DEST = GRP1_RT_01
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /home/dmdba/dmdbms/data/DAMENG/arch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
EOF

6.5 RMAN 恢复备库

dmrman CTLSTMT="RESTORE DATABASE '/home/dmdba/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/home/dmdba/dmdbms/backup/BACKUP_FULL'"
dmrman CTLSTMT="RECOVER DATABASE '/home/dmdba/dmdbms/data/DAMENG/dm.ini' FOR STANDBY FROM BACKUPSET '/home/dmdba/dmdbms/backup/BACKUP_FULL'"
dmrman CTLSTMT="RECOVER DATABASE '/home/dmdba/dmdbms/data/DAMENG/dm.ini' UPDATE DB_MAGIC"

6.6 设置备库 OGUID 和 STANDBY 模式

dmserver /home/dmdba/dmdbms/data/DAMENG/dm.ini mount
另开终端:
disql SYSDBA/Dameng@123@192.168.10.139:5236
执行:
sql
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);

7. 启动集群

7.1 启动顺序

主库 mount(主机138)
dmserver /home/dmdba/dmdbms/data/DAMENG/dm.ini mount &

备库 mount(备机139)
dmserver /home/dmdba/dmdbms/data/DAMENG/dm.ini mount &

备库守护进程(备机139)
dmwatcher /home/dmdba/dmdbms/data/DAMENG/dmwatcher.ini &

主库守护进程(主机138)
dmwatcher /home/dmdba/dmdbms/data/DAMENG/dmwatcher.ini 

7.2 创建并启动监视器(主机138)

cat > /home/dmdba/dmdbms/bin/dmmonitor.ini << "EOF"
MON_DW_CONFIRM = 1
MON_LOG_PATH = /home/dmdba/dmdbms/log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 32
MON_LOG_SPACE_LIMIT = 0

[GRP1]
MON_INST_OGUID = 453331
MON_DW_IP = 192.168.10.138:52141
MON_DW_IP = 192.168.10.139:52142
EOF

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

7.3 验证集群状态

在监视器执行show,应看到:

  • 主库 GRP1_RT_01:OPEN / PRIMARY
  • 备库 GRP1_RT_02:OPEN /STANDBY
  • 归档类型:TIMELY
  • 归档状态:VALID

8. 配置客户端读写分离(dm_svc.conf)

在客户端机器(主机138)配置:

cat > /etc/dm_svc.conf << "EOF"
TIME_ZONE=(480)
LANGUAGE=(cn)

DMRWW=(192.168.10.138:5236,192.168.10.139:5236)

[DMRWW]
LOGIN_MODE=(1)
RW_SEPARATE=(1)
RW_PERCENT=(25)
SWITCH_TIMES=(3)
SWITCH_INTERVAL=(1000)
EOF

参数说明:

  • RW_SEPARATE=(1):启用读写分离
  • RW_PERCENT=(25):25%读请求发往主库,75%发往备库
  • LOGIN_MODE=(1):优先连接主库

9. 集群功能测试

9.1 实验一:主备数据实时同步测试

主库(138)执行:

CREATE TABLE TEST_RW (ID INT, NAME VARCHAR(20)); INSERT INTO TEST_RW VALUES (1, '读写分离测试'); INSERT INTO TEST_RW VALUES (2, '数据同步验证'); COMMIT; SELECT * FROM TEST_RW;

image.png

备库(139)查询:

SELECT * FROM TEST_RW;

image.png

结果:返回相同数据,主备同步正常。

9.2 实验二:配置读写事务分发比例

修改 dm_svc.conf 中 RW_PERCENT 值:

  • 0:所有读请求发往备库
  • 25:25%发往主库,75%发往备库(默认)
  • 100:所有读请求发往主库
sed -i 's/RW_PERCENT=(.*)/RW_PERCENT=(0)/' /etc/dm_svc.conf

image.png

9.3 实验三:读写分离与主备集群差异分析

  • 对比维度 主备集群(REALTIME) 读写分离集群(TIMELY)
  • 归档类型 REALTIME TIMELY
  • 归档时机 写入联机日志前发送 写入联机日志后发送
  • 事务一致模式 默认高性能(WAIT_APPLY=FALSE) 默认事务一致(WAIT_APPLY=TRUE)
  • 备库查询延迟 可能有微秒级延迟 无延迟
  • KEEP_RLOG_PKG 存在 不存在
  • 应用场景 容灾高可用 读负载分担
  • 读写分离配置 不支持 支持(RW_SEPARATE=1)
  • 客户端验证方式 无法验证 备库 SQL 日志可验证

10. 实验总结

本次实验基于已有主备集群成功搭建 DM8 读写分离集群,核心步骤为:

  • 将归档类型从 REALTIME 切换为 TIMELY
  • 配置 dm_svc.conf 启用读写分离
  • 通过 RW_PERCENT 灵活控制读请求分发比例
  • 通过三大实验验证:
  • 主备数据同步正常,备库可实时查询
  • 读写分发比例可配置,读请求自动分流
  • 与主备集群在归档时机、事务一致性、应用场景等方面存在明确差异
  • 读写分离集群适用于读多写少的业务场景,可有效分担主库压力,提升系统整体吞吐量。
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服