达梦读写分离集群底层依赖数据守护机制,主库全权承担数据写入、修改事务操作,备库实时同步主库数据,同时分担业务查询压力,有效提升数据库整体吞吐量,适配读多写少业务场景。
本文记录单机双实例、两节点DM8读写分离集群完整搭建流程,重点标注读写分离集群与普通主备集群的核心配置差异,通用基础配置步骤精简处理,可直接复刻部署。
| 角色 | IP地址 | 实例名 | 数据库端口 | MAL端口 | 守护端口 | 监听守护端口 |
|---|---|---|---|---|---|---|
| 主库 | 192.168.200.208 | GRP1_RT_01 | 5236 | 61141 | 52141 | 33141 |
| 备库 | 192.168.201.128 | GRP1_RT_02 | 5237 | 61142 | 52142 | 33142 |
| 确认监视器 | 192.168.200.208 | — | — | — | — | — |
基础环境信息
所有差异化核心配置如下,为集群搭建关键,需严格对照配置。
MAL为集群节点日志传输、状态同步核心通道,读写分离集群必须配置,主备库文件内容需完全相同。
MAL_CHECK_INTERVAL = 10
MAL_CONN_FAIL_INTERVAL = 10
MAL_TEMP_PATH = /data/dmdata/malpath
[MAL_INST1]
MAL_INST_NAME = GRP1_RT_01
MAL_HOST = 192.168.200.208
MAL_PORT = 61141
MAL_INST_HOST = 192.168.200.208
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.128
MAL_PORT = 61142
MAL_INST_HOST = 192.168.201.128
MAL_INST_PORT = 5237
MAL_DW_PORT = 52142
MAL_INST_DW_PORT = 33142
端口说明:MAL_PORT=日志传输端口;MAL_DW_PORT=守护进程通信端口;MAL_INST_DW_PORT=监视器连接端口
读写分离集群禁止使用REALTIME实时归档,必须使用TIMELY即时归档,日志写入联机日志后立即同步至备库。
主库 dmarch.ini
ARCH_WAIT_APPLY = 0 # 0=高性能模式,1=事务强一致模式
[ARCHIVE_TIMELY1]
ARCH_TYPE = TIMELY
ARCH_DEST = GRP1_RT_02
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /data/dmdata/dmarch
备库 dmarch.ini(必须配置反向TIMELY归档,否则守护进程启动报错)
[ARCHIVE_TIMELY1]
ARCH_TYPE = TIMELY
ARCH_DEST = GRP1_RT_01
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /data/dmarch_STB/DAMENG_STB
读写分离集群守护进程类型必须为 GLOBAL,主备库配置基本一致,仅 INST_INI 路径不同。
主库 dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO # AUTO自动切换/MANUAL手动切换
INST_OGUID = 453331
INST_INI = /data/dmdata/DAMENG/dm.ini
INST_AUTO_RESTART = 1
备库 dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO
INST_OGUID = 453331
INST_INI = /data/dmdata_STB/DAMENG_STB/dm.ini
INST_AUTO_RESTART = 1
该文件控制客户端读写请求分流策略,存放于应用服务器,Linux默认路径:/etc/dm_svc.conf。
TIME_ZONE=(480)
LANGUAGE=(cn)
RW_CLUSTER=(192.168.200.208:5236,192.168.201.128:5237)
[RW_CLUSTER]
LOGIN_MODE=(1) # 写请求仅连接主库
RW_SEPARATE=(1) # 开启读写分离功能
RW_PERCENT=(30) # 读请求分流比例:主库30%、备库70%
SWITCH_TIMES=(3)
SWITCH_INTERVAL=(200)
修改主备库 dm.ini 核心参数:
ALTER_MODE_STATUS=0
ENABLE_OFFLINE_TS=2
MAL_INI=1
ARCH_INI=1
创建确认监视器配置 dmmonitor.ini(MON_DW_CONFIRM=1 开启确认监视器)
# 1. Mount方式启动主备数据库
dmserver /data/dmdata/DAMENG/dm.ini mount
dmserver /data/dmdata_STB/DAMENG_STB/dm.ini mount
# 2. 设置集群OGUID及数据库角色
## 主库执行
SP_SET_OGUID(453331);
ALTER DATABASE PRIMARY;
## 备库执行
SP_SET_OGUID(453331);
ALTER DATABASE STANDBY;
# 3. 启动主备库守护进程
dmwatcher /data/dmdata/DAMENG/dmwatcher.ini
dmwatcher /data/dmdata_STB/DAMENG_STB/dmwatcher.ini
# 4. 启动集群监视器
dmmonitor /home/dmdba/dmdbms/bin/dmmonitor.ini
主库执行建表、插入数据
CREATE TABLE TEST_RW (ID INT, NAME VARCHAR(50));
INSERT INTO TEST_RW VALUES (1, 'PRIMARY_INSERT');
COMMIT;
备库执行查询验证
SELECT * FROM TEST_RW;
预期结果:备库可正常查询到主库新增数据,数据同步正常。
通过集群服务名 RW_CLUSTER 建立多个数据库连接,执行以下SQL查看当前连接实例:
SELECT SF_GET_PARA_STRING_VALUE(1, 'INSTANCE_NAME');
预期效果:多次新建连接查询,实例名交替出现 GRP1_RT_01(主库)、GRP1_RT_02(备库),符合 30%主库、70%备库的读请求分流比例。
| 对比维度 | 实时主备集群 | 读写分离集群 |
|---|---|---|
| 归档类型 | REALTIME 实时归档 | TIMELY 即时归档(强制) |
| MAL配置 | 无需配置 | 必须配置dmmal.ini |
| 备库角色 | 冷/温备,不承担查询 | 热备,分担读负载 |
| 备库状态 | 默认MOUNT | 必须OPEN |
| 客户端路由 | 手动指定IP连接 | dm_svc.conf自动读写分流 |
| 数据一致性 | 强一致性 | 最终一致性(可参数调整) |
问题1:备库守护启动报错 not configured TIMELY archive
解决:检查备库dmarch.ini是否配置指向主库的TIMELY归档,缺失则补充配置。
问题2:备库无法查询,始终为MOUNT状态
解决:正常启动守护进程后会自动OPEN;可手动在监视器执行 open standby 唤醒备库。
问题3:集群读写不分离
解决:确认dm_svc.conf中 RW_SEPARATE=1,且配置文件被数据库驱动正常加载。
DM8读写分离集群核心依赖三大配置:dmmal.ini节点通信、TIMELY即时归档、dm_svc.conf读写分流。相较于普通主备集群,可充分利用备库算力,分担查询压力,在保证集群高可用的同时,大幅提升读多写少业务的系统吞吐量。
搭建核心在于区分归档类型、开启全局守护模式、配置客户端分流策略,其余通用部署步骤与标准主备集群一致。
读写分离集群 vs 主备集群:核心差异
读写分离集群:高可用 + 高性能,提升并发吞吐量
读写分离集群:热备,主动承担读查询负载
读写分离集群:TIMELY(即时归档),日志写入后发送备库
读写分离集群:必须为 OPEN(才能提供读服务)
读写分离集群:通过 dm_svc.conf 自动分发读写
读写分离集群:存在"写后读"延迟风险,通过 ARCH_WAIT_APPLY 控制(0=高性能/最终一致,1=强一致/性能衰减)
读写分离集群:同样支持切换,但切换后需更新路由或等待驱动自动感知
文章
阅读量
获赞
