当数据同步链路不再是简单的"源→目标",而是需要引入一个独立的数据中转层来解耦生产和消费时,DSS(数据存储服务)就成了不可或缺的枢纽。
本文手把手带你完成 CPT → DSS → EXEC 三节点架构的搭建,涵盖DSS配置、CPT投递改造、EXEC消费对接,并附上真实踩坑记录和解决方案。
在DMDRS的生态中,我们最熟悉的模式是CPT 直连 EXEC——捕获端直接把数据推给执行端。这种模式简单高效,但在高并发、多消费者、需要数据缓冲或断点续传的场景下,就暴露了短板:CPT和EXEC必须同时在线,任何一方重启或网络抖动都可能造成数据积压或丢失。
**DSS(Data Storage Service)**就是为解决这些问题而生的。它作为一个独立的数据存储中转模块,接收CPT投递的数据并持久化到磁盘,再由EXEC按需拉取消费。这样一来:
CPT和EXEC解耦,互不影响
数据在DSS中持久化存储,支持断点续传
多个EXEC可订阅同一个Topic,实现多路分发
配合过期策略,实现自动清理,防止磁盘撑爆
本文将带你从零搭建一套**CPT(135)→ DSS(139)→ EXEC(139)**的完整链路,并验证数据同步。所有配置均基于实验环境优化,适配小内存和小磁盘场景。
角色 机器IP 部署内容 管理端口
源端数据库 + 192.168.21.135 DM8 源库 + CPT 5345
CPT 捕获模块
DSS + EXEC + 192.168.21.139 DM8 目标库 + DSS DSS:5345,
目标端数据库 中转 + EXEC EXEC:5346
执行模块
关键点:
DSS 和 EXEC 部署在同一台机器(139),但端口必须不同(5345 vs 5346)。
CPT 负责从源库抓取日志,推送到 DSS 的 Topic。
DSS 持久化数据,EXEC 从 DSS 拉取并写入目标库。
在两台机器(135、139)上分别检查:
# 数据库是否运行
ps -ef | grep dmserver | grep -v grep
# DMDRS 安装目录
ls -la /data/dmdrs5/bin/
# 环境变量(必须包含DMDRS和达梦的lib路径)
echo $LD_LIBRARY_PATH
# 应包含 /data/dmdrs5/bin 和 /home/dmdba/dmdbms/bin
在139机器上,DSS和EXEC共用IP,端口必须错开:
DSS Manager 端口:5345
EXEC Manager 端口:5346
检查端口是否被占用:
netstat -tlnp | grep 5345
netstat -tlnp | grep 5346
# 如有占用,kill掉残留进程
pkill -9 -f “dssvr”
pkill -9 -f “drsvr.*exec”
mkdir -p /data/dmdrs5/dss_data
chown -R dmdba:dinstall /data/dmdrs5/dss_data
chmod 755 /data/dmdrs5/dss_data
DSS 是本次架构的核心,它的配置文件需要仔细调优,尤其是内存和磁盘参数。
在139机器的EXEC工作目录(我们统一用/data/dmdrs5/bin_exec_dm8_5345)下创建dss.xml:
<?xml version=“1.0” encoding=“GB18030”?>
<drs>
<base>
<mgr_port>5345</mgr_port>
<siteid>3</siteid> <!-- 全局唯一 -->
<mem_size>0</mem_size> <!-- 0表示不限制 -->
<lang>ch-utf8</lang>
</base>
<dss>
<name>dss_active</name> <!-- DSS模块名称,CPT/EXEC通过它定位 -->
<dir>/data/dmdrs5/dss_data</dir>
<resvd_size>1</resvd_size> <!-- 预留1GB,低于此值触发清理 -->
<file_size>256</file_size> <!-- 单文件256MB(默认2GB) -->
<total_file_limit>4</total_file_limit> <!-- 总大小上限4GB -->
<delete_policy>1</delete_policy> <!-- 自动删除最旧文件 -->
<buf_size>512</buf_size> <!-- 缓冲区512MB(最小值) -->
<io_thr>1</io_thr> <!-- IO线程数(默认4,降为1节约内存) -->
<bak_thr>1</bak_thr> <!-- 备份线程数 -->
<!-- 在线Topic配置 -->
<topic_online>
<topic>
<item>cpt_dm8</item> <!-- Topic名称,与CPT配置一致 -->
</topic>
<!-- 注意:不配置dir,避免路径嵌套 -->
<bak_dir></bak_dir> <!-- 不启用备份 -->
<bak_interval>0</bak_interval>
<accept_ip>192.168.21.135,192.168.21.139</accept_ip>
</topic_online>
</dss>
</drs>
参数调优说明(针对1GB内存、7.4GB磁盘):
buf_size:有效范围 512~4096 MB,此处设为最小值。
file_size和total_file_limit:控制单文件和总大小,防止磁盘写满。
io_thr/bak_thr:降低线程数,节约内存。
topic_online.dir留空,避免数据写入嵌套路径。
cd /data/dmdrs5/bin_exec_dm8_5345
export
LD_LIBRARY_PATH=/data/dmdrs5/bin:/home/dmdba/dmdbms/bin:$LD_LIBRARY_PATH
# 先前台启动观察日志
./dssvr dss.xml
# 看到 CMD> 提示符即成功,按Ctrl+C退出,再后台运行
nohup ./dssvr dss.xml >> dss.log 2>&1 &
tail -f dss.log # 看到CMD>即可
常见启动错误:
DRS-3074:buf_size小于512 → 调大。
DRS-3072:用了drsvr而非dssvr→ 改用./dssvr。
内存不足 → 降低buf_size,保持mem_size=0。
DSS服务启动后,模块默认不运行,需手动启动:
./drcsl dss.xml
CSL> connect
CSL> start dss_active
CSL> exit
验证监听端口:
netstat -tlnp | grep 5345 # 应显示 dssvr 监听
原本CPT直接投递给EXEC,现在需要改为投递给DSS。
在/data/dmdrs5/bin_cpt_dm8_master_135/cpt.xml中,修改<send>部分:
<send>
<ip>192.168.21.139</ip> <!-- DSS所在IP -->
<port>5345</port> <!-- DSS Manager端口 -->
<target_name>dss_active</target_name> <!-- DSS模块名称 -->
<topic>cpt_dm8</topic> <!-- Topic名称,与DSS一致 -->
<map>
<item>DMDRS.*==TEST_DB.*</item> <!-- 模式映射 -->
</map>
</send>
其他配置(数据库连接等)保持不变。
cd /data/dmdrs5/bin_cpt_dm8_master_135
pkill -9 -f “drsvr.*cpt”
rm -rf cpt_dm8_master/ log/ mgr/ # 清理缓存
nohup ./drsvr cpt.xml >> cpt_master.log 2>&1 &
tail -f cpt_master.log # 看到CMD>
# 启动CPT模块
./drcsl cpt.xml
CSL> connect
CSL> start cpt_dm8_master
CSL> exit
在139机器DSS控制台查看生产者列表:
cd /data/dmdrs5/bin_exec_dm8_5345
./drcsl dss.xml
CSL> connect
CSL> show dss_active savelist
预期输出:
主题: cpt_dm8
源端名称: cpt_dm8
源端IP: 192.168.21.135
连接状态: 已连接
终止LSN: xxxxx (持续增长)
如果终止LSN为0或不增长,说明CPT未正常发送,检查网络和配置。
EXEC 不再直接接收CPT的推送,而是主动从DSS拉取数据。
注意:EXEC 的 Manager 端口必须与 DSS 不同,我们设为5346。
<base>
<mgr_port>5346</mgr_port> <!-- 与DSS区分 -->
<siteid>30</siteid> <!-- 全局唯一,且不同于旧siteid -->
<mem_size>0</mem_size>
<lang>ch-utf8</lang>
</base>
<exec>
<name>exec_dm8_new</name> <!-- 建议改名,避免旧消费者位点冲突 -->
<!-- 目标库连接 -->
<login>
<dbtype>dm8</dbtype>
<server>192.168.21.135</server> <!-- 目标库IP -->
<user>TEST_DB</user>
<pwd>Dameng123</pwd>
<port>5237</port>
</login>
<!-- 从DSS消费 -->
<dss>
<item>
<name>dss_active</name> <!-- DSS模块名 -->
<ip>192.168.21.139</ip>
<port>5345</port> <!-- DSS端口 -->
<topic>cpt_dm8</topic> <!-- 订阅的Topic -->
<start_lsn>0</start_lsn> <!-- 从最小LSN开始 -->
</item>
</dss>
<!-- 其他exec参数(工作线程、缓冲区等)按需配置 -->
<work_thr>16</work_thr>
<error_policy>1</error_policy> <!-- 忽略错误继续同步 -->
<!-- 省略其他参数,参考完整配置文件 -->
</exec>
cd /data/dmdrs5/bin_exec_dm8_5345
pkill -9 -f “drsvr.*exec”
rm -rf exec_dm8_new # 删除旧缓存目录
nohup ./drsvr exec.xml >> exec.log 2>&1 &
tail -f exec.log # 看到CMD>,注意日志中应显示"EXEC模块以DSS模式启动"
./drcsl exec.xml
CSL> connect
CSL> start exec_dm8_new # 用新名称启动
CSL> exit
在DSS控制台查看消费者列表:
./drcsl dss.xml
CSL> connect
CSL> show dss_active readlist
预期输出:
模块名称: exec_dm8_new
目标端IP: 192.168.21.139
目标端管理端口号: 5346
当前LSN: xxxxx (逐步增长)
连接状态: 已连接
如果当前LSN卡在某个固定值不增长,说明消费位点卡住——此时需要再次确认是否修改了siteid和name,并清除了缓存。
检查项 命令(在对应控制台) 预期结果
DSS生产者 show dss_active savelist CPT已连接,终止LSN增长
DSS消费者 show dss_active readlist EXEC已连接,当前LSN增长
EXEC接收 show exec_dm8_new info 最新接收LSN有值且增长
CPT状态 show cpt_dm8_master state 读取/解析/发送LSN均增长
在源端(135)插入一条记录:
INSERT INTO DMDRS.EMPL1 VALUES (99999, ‘DSS链路验证’, 30, 9999.00);
COMMIT;
由于CPT端配置了映射DMDRS.*==TEST_DB.*,数据会写入目标库的TEST_DB.EMPL1。
# 在135机器查询目标库(目标库也在135)
./disql TEST_DB/Dameng123@localhost:5237
SELECT * FROM TEST_DB.EMPL1 WHERE ID=99999;
若返回一行数据,则全链路CPT → DSS → EXEC → 目标库成功打通。
命令 功能
show dss_active savelist 查看所有生产者(CPT)信息
show dss_active saveinfo cpt_dm8 查看指定生产者的文件详情
show dss_active readlist 查看所有消费者(EXEC)信息
show dss_active readinfo 查看指定消费者的详细进度
exec_dm8_new
命令 功能
show exec_dm8_new info 查看消费接收状态、LSN、时间
show exec_dm8_new state 查看整体统计信息
show exec_dm8_new thr 查看工作线程状态
show exec_dm8_new lag 查看各表同步延迟
命令 功能
show cpt_dm8_master state 查看整体统计
show cpt_dm8_master send 查看发送LSN
show cpt_dm8_master read 查看读取LSN
CPT → DSS → EXEC 架构为DMDRS带来了更高的可靠性和灵活性。通过引入独立的数据中转层,我们实现了生产者和消费者的解耦,支持数据持久化、多路分发和断点续传。
文章
阅读量
获赞
