注册
CPT-DSS-EXEC 架构实战指南
专栏/技术分享/ 文章详情 /

CPT-DSS-EXEC 架构实战指南

Cath Palug 2026/09/04 74 0 0
摘要

CPT-DSS-EXEC 架构实战指南:从零搭建数据中转站,解锁DMDRS高吞吐同步

当数据同步链路不再是简单的"源→目标",而是需要引入一个独立的数据中转层来解耦生产和消费时,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)**的完整链路,并验证数据同步。所有配置均基于实验环境优化,适配小内存和小磁盘场景。

1. 整体架构与角色划分


角色 机器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 拉取并写入目标库。

2. 环境准备与前置检查

2.1 确认基础环境

在两台机器(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

2.2 端口规划与冲突预防

在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”

2.3 创建DSS数据目录(139机器)

mkdir -p /data/dmdrs5/dss_data

chown -R dmdba:dinstall /data/dmdrs5/dss_data

chmod 755 /data/dmdrs5/dss_data

3. 配置并启动 DSS(中转站)

DSS 是本次架构的核心,它的配置文件需要仔细调优,尤其是内存和磁盘参数。

3.1 编写 dss.xml

在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留空,避免数据写入嵌套路径。

3.2 启动DSS服务(注意:用 dssvr 而非 drsvr)

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。

3.3 手动启动DSS模块

DSS服务启动后,模块默认不运行,需手动启动:

./drcsl dss.xml

CSL> connect

CSL> start dss_active

CSL> exit

验证监听端口:

netstat -tlnp | grep 5345 # 应显示 dssvr 监听

4. 配置 CPT 指向 DSS(生产者)

原本CPT直接投递给EXEC,现在需要改为投递给DSS。

4.1 修改 cpt.xml(135机器)

在/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>

其他配置(数据库连接等)保持不变。

4.2 重启CPT并启动模块

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

4.3 验证CPT是否连接到DSS

在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未正常发送,检查网络和配置。

5. 配置 EXEC 从 DSS 消费(消费者)

EXEC 不再直接接收CPT的推送,而是主动从DSS拉取数据。

5.1 修改 exec.xml(139机器)

注意: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>

5.2 重启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

5.3 验证EXEC是否连接到DSS

在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,并清除了缓存。

6. 全链路验证

6.1 汇总检查状态


检查项 命令(在对应控制台) 预期结果

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均增长


6.2 插入测试数据

在源端(135)插入一条记录:

INSERT INTO DMDRS.EMPL1 VALUES (99999, ‘DSS链路验证’, 30, 9999.00);

COMMIT;

6.3 查询目标端

由于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 → 目标库成功打通。

7. 常用运维命令速查

DSS控制台(./drcsl dss.xml)


命令 功能

show dss_active savelist 查看所有生产者(CPT)信息

show dss_active saveinfo cpt_dm8 查看指定生产者的文件详情

show dss_active readlist 查看所有消费者(EXEC)信息

show dss_active readinfo 查看指定消费者的详细进度
exec_dm8_new


EXEC控制台(./drcsl exec.xml)


命令 功能

show exec_dm8_new info 查看消费接收状态、LSN、时间

show exec_dm8_new state 查看整体统计信息

show exec_dm8_new thr 查看工作线程状态

show exec_dm8_new lag 查看各表同步延迟


CPT控制台(./drcsl cpt.xml)


命令 功能

show cpt_dm8_master state 查看整体统计

show cpt_dm8_master send 查看发送LSN

show cpt_dm8_master read 查看读取LSN


结语

CPT → DSS → EXEC 架构为DMDRS带来了更高的可靠性和灵活性。通过引入独立的数据中转层,我们实现了生产者和消费者的解耦,支持数据持久化、多路分发和断点续传。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服