
做数据同步和实时数仓的同行应该都有同感前几年一聊 CDC默认就是 Debezium Kafka Flink 这套组合拳仿佛少了 Kafka 就不配叫实时。但真到了生产环境尤其是一些业务量中等、团队规模不大、预算也有限的场景这套默认架构往往不是最优解反而会带来一堆运维负担。2026 年回头看CDC 和流处理这两个词的边界已经在悄悄变化“轻量级”成了一个越来越重要的选型维度。这篇文章就是我个人在梳理 2026 年可用方案时的一份盘点。我会先讲清楚“轻量级”到底是在轻什么再把当前主流的 CDC 工具和流处理引擎按不同场景拆开对比最后会给出几个可以直接参考的小型落地路径也会把我在实际项目里踩过的一些坑放在后面。如果你正在为“要不要上 Kafka”“用 Flink CDC 还是 Debezium”“国产数据库怎么接 CDC”这类问题纠结这份盘点应该能帮你省掉不少调研时间。1. 盘点背景CDC 与流处理这几年为什么被反复提及CDC 全称是 Change Data Capture中文一般叫变更数据捕获。它的核心作用就一句话把数据库里已经发生的数据变更比如 INSERT、UPDATE、DELETE实时地捕获出来再交给下游系统处理。早期的增量同步大多靠业务代码里双写、定时任务扫表这类偏“硬凑”的方式实现性能和准确性都很差。而基于日志的 CDC 直接读取数据库的事务日志比如 MySQL 的 binlog、PostgreSQL 的 WAL不侵入业务表也不要求业务表必须有时间戳字段能够拿到完整且有序的变更记录。流处理则是 CDC 数据出去之后的那一段链路如何把变更事件做过滤、清洗、关联、聚合再写入数据仓库、数据湖、搜索引擎或者另一个数据库。所以说它俩是一对天然的搭档CDC 负责“把变化说出来”流处理负责“把变化用起来”。到了 2026 年这个领域出现了几个很明显的推动力。第一实时数仓和湖仓一体已经从小厂标杆变成了常规需求哪怕是中小团队也希望能做到分钟级甚至秒级的数据可见性。第二国产数据库的落地范围越来越大随之而来的就是达梦、人大金仓Kingbase这类数据库的 CDC 适配需求已经不再是“有没有都行”的状态而是很多政企项目的硬性要求。第三也是我觉得最关键的一点容器化和云上托管服务普及之后大家开始正视 Kafka 这套基础设施的成本——不是软件本身贵而是它需要专业的人去盯这恰恰是很多团队不具备的条件。1.1 轻量级到底是在轻什么我见过不少人对“轻量级”有误解觉得轻量级就是功能缩水、只适合 demo。实际上在 CDC 和流处理这个场景里轻量级至少包含三个完全不同维度的含义你得先分清自己需要的是哪一种轻。第一种是部署形态轻。典型代表是单机版的 CDC 工具或者一个进程就能跑完整个采集链路的方案。它们不需要你提前搭 Zookeeper、Kafka、Flink 集群下载一个包、填几行配置就能跑起来。第二种是依赖栈轻。比如 Debezium Server 这种形态它把 Debezium 的引擎直接封装成了一个可独立运行的 Java 服务你可以把变更事件直接写到目标端完全绕开 Kafka。这样带来的好处是排障链路短、资源占用小一台 2C4G 的机器跑好几个采集任务都没压力。第三种是学习成本轻。像 Flink CDC 这种把采集能力以 SQL 连接器的形式暴露出来的方案团队里只要有人会写 SQL就能在很短时间内搭出一条实时同步管道。我个人的看法是2026 年轻量级方案最大的价值不是替代重型架构而是给你多一个选择。数据量真的到了每秒几万 TPS、链路需要支撑多个消费者、需要长期保存事件回溯的时候Kafka 依然是不可替代的。但如果你只是想把两三个业务库的变更实时同步到数仓或者下游业务库那再用 Kafka 就显得有点“杀鸡用牛刀”了。1.2 这次盘点的取舍范围开头那串热搜词里混进来一些看着容易混淆的关键词比如 USB CDC 协议、STM32 的 CDC 复合设备、数字电路里的 CDCClock Domain Crossing这些其实是完全不同的技术领域只是恰好都叫 CDC。为了避免看文章的朋友带着不同预期进来先说明一下这篇文章讨论的 CDC 仅限数据集成领域也就是数据库变更数据捕获不涉及 USB 通信协议和芯片设计里的跨时钟域问题。另外“轻量级”这三个字也帮我划掉了一批方案。像 Oracle GoldenGate、IBM Data Replication 这种商业级工具功能确实强但授权费用和实施门槛都不低不在这次盘点的范围内。云厂商的托管同步服务比如各种 DTS也不展开聊因为它们和云平台强绑定没法脱离具体云厂商单独讨论选型。我会把重点放在开源、可自托管、社区活跃度较高的方案上同时会专门提一下国内数据库生态的适配现状。2. 2026 年 CDC 方案全景先别急着写代码如果你在网上搜“CDC 工具对比”大概率会看到一堆名词Debezium、Flink CDC、Canal、Maxwell、DataX、SeaTunnel、SymmetricDS、ETLEngine 等等。每个工具都有自己的目标用户和最佳适用场景但它们之间其实不是简单的“谁取代谁”的关系更像是在不同坐标系里各占一席之地。做选型之前把坐标系画清楚比记住每个工具的功能列表重要得多。2.1 主流 CDC 工具的现状坐标我给手头的方案做了一个坐标归类横轴是采集能力的实时性从准实时到真正的变更流纵轴是数据源生态的广度。这样放完之后你会发现几类工具的定位差异非常明显。先看老牌的 Canal 和 Maxwell。这两个都是 MySQL 生态里的轻量级方案Canal 是 Java 系Maxwell 是 Ruby 系它们都能解析 binlog 并输出 JSON 格式的变更事件。Canal 的优势是支持自定义消费位点管理可以和 MQ 深度集成Maxwell 则在 bootstrapping存量数据初始化和分区表支持上做得比较方便。但它们的共同局限也很明显基本只面向 MySQLPostgreSQL、Oracle、SQL Server 这些库的支持要么没有、要么很弱。所以我会把它们定位成“特定数据库场景下的够用方案”而不是通用底座。再看 Debezium 和 Flink CDC这俩是目前通用性做得最好的两个开源框架。Debezium 基于 Kafka Connect 架构天然适合和 Kafka 配合后来又推出了 Debezium Server 形态来支持无 Kafka 场景。Flink CDC 则是基于 Flink 的流处理框架在 Flink 生态内做实时计算和同步非常顺手。从社区活跃度来看Debezium 支持的数据库连接器数量更多Flink CDC 则在阿里开源之后逐渐形成了自己的用户群特别是国内团队用得非常多。SeaTunnel 是我最近两年重点关注的一个项目。它本来是一个数据集成中间件可以理解为“数据同步的乐高积木”支持 source、transform、sink 三段式配置后来把 CDC 也纳入到了 source 的体系里。也就是说你可以用 SeaTunnel 同时完成“采集数据库变更”和“把变更写入各种目标端”这两件事不需要自己拼装多个组件。它对这个盘点的特殊意义在于对达梦、Kingbase 等国产数据库的适配动作非常快如果你面临的是异构的国产数据库同步场景SeaTunnel 会是一个值得优先评估的入口。2.2 选型前先答完这三个问题我见过太多人一上来就翻工具的 Feature List然后被各种“支持列表”带偏。实际上选型之前先花点时间回答这三个问题答案会自然帮你过滤掉一大半不合适的方案。第一个问题你需要同步的数据库是单一种类还是多种混搭如果全部是 MySQL那 Canal、Maxwell 完全够用未必需要引入 Flink CDC 或 Debezium 这种偏重度的框架。如果同时涉及 MySQL、PostgreSQL、Oracle甚至还有达梦、Kingbase 这种国产库那就必须选择数据源生态足够广的方案。第二个问题数据出去之后下游是“人工消费”还是“自动化链路”如果只是触发缓存更新、刷新搜索引擎索引这类下游动作De Bezium Server 直连目标端就够如果要做复杂的流式关联、窗口计算那就必须上流处理引擎。第三个问题也是最重要的一个问题你的团队能接受多高的运维成本这一点经常被忽略。很多团队兴致勃勃选了 Debezium Kafka结果上线后没人会调 Kafka 的参数分区积压了也不知道怎么排查最后整个实时链路变成“实时故障链路”。不如选一个架构更简单、出问题更快定位的方案。这三个问题想清楚之后你再回头看各种工具会发现自己已经很自然地选出了 1 到 2 个候选。如果你正在两个方案之间纠结我的经验是优先选团队里有人真正用过、踩过坑的那个其次才是看功能对比表。工具只有被人真正用起来它的能力才算数。3. 轻量级路线怎么搭逐个方案过一遍下面按路线来展开讲。我选了几条在 2026 年仍然有代表性、且真实可用性较高的轻量级方案尽量讲清楚每条的适用边界、最小可运行形态以及我自己使用后的体会。3.1 Debezium Server去掉 Kafka 也能跑Debezium 是 Red Hat 开源的项目也是目前 CDC 领域事实上的标准之一。传统用法是把它跑在 Kafka Connect 上用 Connector 配置来定义数据源变更事件发布到 Kafka topic 里。这个模式的好处是稳定、通用、生态好但代价是 Kafka Connect 集群本身的部署和管理并不轻松。Debezium Server 是这个项目提供的一种轻量运行形态。它不是跑在 Kafka Connect 框架里而是一个独立的 Java 进程通过配置文件指定 source数据源、format事件格式、sink目标端。可以简单理解成Debezium Server 把 CDC 采集器做成了一个单进程程序没有 ZooKeeper、没有 Kafka Broker你的 CDC 链路最简化之后就变成“数据库 - Debezium Server - 目标端”。我用 Debezium Server 做过一个实际场景把客户的一个 MySQL 业务库实时同步到下游的 Elasticsearch用来支撑后台搜索。业务量不大峰值也就每秒两三百条变更但我需要的是稳定、低延迟、好维护。当时在 Debezium Server 和 Canal 之间犹豫了一下最后选 Debezium Server 是因为它的 source 配置支持增量快照incremental snapshot存量数据同步和增量变更可以在不停机的情况下衔接起来这是很多老牌工具做不到的。一个最简配置大概长这样debezium: connector: mysql offset: storage: type: file filename: /data/debezium/offset.dat database: hostname: 10.0.0.10 port: 3306 user: cdc_user password: cdc_password include: database: testdb history: storage: type: file filename: /data/debezium/schema-history.dat format: type: json sink: type: elasticsearch hosts: http://10.0.0.20:9200这里有几个细节容易踩坑。第一schema history 文件一定要单独配置并做好持久化它记录的是 DDL 变更如果你同时订阅多个表、经常做表结构变更这个文件坏了就直接罢工。第二cdc_user 的数据访问权限要按官方文档最小化授权不要图省事直接给 root后面排查问题的时候权限清晰能省很多事。第三Debezium Server 默认的 offset 存储是文件形式如果你需要高可用需要换成 Redis 或其它分布式存储否则同一时刻只能跑一个节点。提示文件型 offset 存储只适合单机部署。如果你打算做多节点容灾一开始就选分布式 offset 存储别等上了生产再迁移那时重放数据会让你怀疑人生。3.2 Flink CDCSQL 化接入带来的生态红利Flink CDC 是阿里巴巴开源后捐给 Apache Flink 生态的一个项目。它最核心的亮点是把 CDC 数据源封装成了 Flink 的连接器让用户在 Flink SQL 里可以直接把一张 MySQL 表映射成动态表然后像查询普通表一样去做实时计算和写入。这个方案的“轻”主要体现在开发人员的学习负担上。假设你想把 MySQL 里的订单表实时同步到 StarRocks 里并且顺带做一层简单的清洗用 Flink SQL 写起来非常直观CREATE TABLE orders ( id INT, customer_name STRING, amount DECIMAL(10, 2), PRIMARY KEY (id) NOT ENFORCED ) WITH ( connector mysql-cdc, hostname 10.0.0.10, port 3306, username cdc_user, password cdc_password, database-name testdb, table-name orders ); CREATE TABLE orders_sink ( id INT, customer_name STRING, amount DECIMAL(10, 2), PRIMARY KEY (id) NOT ENFORCED ) WITH ( connector starrocks, jdbc-url jdbc:mysql://10.0.0.30:9030, load-url 10.0.0.30:8030, username sink_user, password sink_password, database-name dws, table-name orders ); INSERT INTO orders_sink SELECT id, customer_name, amount FROM orders;你不需要自己写一行 Java 代码也不需要单独配置一个 Debezium Connector。Flink CDC 会在内部处理 binlog 的消费、位点管理和状态持久化。如果你的下游是消息中间件或者文件系统Flink 生态里同样有对应的 sink 可以直接用。说到生态这里就得回复一下热搜词里反复出现的“达梦 CDC”和“Seatunnel”。Flink CDC 在 2024、2025 年这两年里陆续补齐了不少数据库连接器达梦和 Kingbase 这类国产库也逐步有了可用的连接器实现。但我的观察是这些连接器的成熟度不完全一样有些是官方维护有些是社区贡献你在选型时一定要去确认你用的连接器版本和你数据库的版本是否匹配最好是先在测试环境跑一遍全量 增量的完整流程再上生产。Flink CDC 还有一个容易让人忽略的点它本身是 Flink 的一个连接器所以你的任务运行在 Flink 集群里。如果只是为了同步一张表就引入一套 Flink on YARN / K8s那在运维上是变重了。轻量一点的做法是用 Flink standalone 模式单机跑或者直接用 Flink SQL Gateway 这种服务化能力避免把集群搞得太大。如果后续业务量增长再平滑扩成集群也不迟。3.3 Canal / Maxwell 等老牌单机工具还在用吗聊到 2026 年我觉得可以给 Canal 和 Maxwell 一个明确的历史定位它们不是过时了而是在自己的射程范围内依然好使。特别是 Canal在我接触过的国内团队里它仍然是 MySQL 增量同步到消息队列的最常用方案之一。很多团队之所以不换不是因为不知道别的方案而是 Canal 已经跑得很稳没必要为了追新去动生产链路。Canal 的部署形态是一个 Java 服务通过配置把自己伪装成 MySQL 的从库然后接收主库推送的 binlog 事件。下游可以配置成 TCP 直连、RocketMQ、Kafka 等。我早期在做订单缓存更新时用过 Canal RocketMQ当时的感受是排查问题很直接一条消息从 binlog 到 MQ 的链路足够透明不像某些重框架一样中间隔了好几层。但 Canal 也有一个从架构上就绕不开的问题它把“定位”这件事做得太贴近 MySQL 了。一旦你的源端要扩展到 PostgreSQL、SQL Server、OracleCanal 基本帮不上忙你只能再去找别的工具。所以我的判断是如果你的现有系统是 MySQL 全覆盖并且未来三五年内没有引入其它数据库的规划那 Canal 依然是一个可靠且轻量级的选择如果你的系统在往多源异构方向走建议从一开始就不要押注在单库方案上。Maxwell 的情况和 Canal 类似它的输出格式统一为 JSON有不少人拿它做 binlog 到 Kafka 的轻量管道。不过它的社区活跃度和 Canal 相比要弱不少遇到问题时的参考案例也会少一些。我个人现阶段不会在新项目里主动选 Maxwell除非是维护老系统。3.4 国产数据库与数据集成中间件达梦、Kingbase 也只是个开头最近两三年我明显感觉到“国产数据库怎么接 CDC”已经从小众需求变成了常见需求。热搜词里“达梦 CDC seatunnel”和“kingbase cdc”反复出现也从侧面印证了这一点。从技术原理上看达梦和 Kingbase 都提供了类 Oracle / 类 PostgreSQL 的日志解析能力所以本质上是可以做基于日志的 CDC 的。但难点从来不在数据库侧能不能提供日志而在开源生态里有没有人愿意为这些库做适配、做驱动、做连接器。这里我特别想聊聊 SeaTunnel。它原本是 Apache 基金会下的数据集成项目最早大家拿它做离线批量同步对标的是 DataX。但从 2023 年之后SeaTunnel 明显加强了 CDC 能力利用其插件化架构能够接入各类数据源并在此基础上支持了达梦、Kingbase 等国产数据库的同步场景。也就是说如果你面对的是“国产数据库 A 到国产数据库 B”或者“国产数据库到 ClickHouse/StarRocks 等分析引擎”的同步需求SeaTunnel 的 Zeta 引擎可以独立完成 CDC 任务的调度和运行你不需要再额外搭建 Kafka、Flink 等框架因此它在国产化替代项目当中有不错的适用性。从配置结构上看SeaTunnel 把作业分成 env、source、transform、sink 几个区块整体上比较易于理解和维护。比如一个从达梦 CDC 同步到 StarRocks 的作业config 大概长这样env { parallelism 1 job.mode STREAMING checkpoint.interval 10000 } source { CDC { dialect DAMENG database-name dmdb table-names [dmdb.T_ORDER] result_table_name orders schema { fields { id { type bigint } customer_name { type string } amount { type double } } } } } sink { StarRocks { fenodes 10.0.0.40:8030 username sink_user password sink_password database dws table t_order save_mode_create_table true } }不过我要提醒一句国产数据库的 CDC 连接器迭代速度很快你现在查到的某条配置可能过几个月就有变化。最好的方式不是背配置文件而是理解 SeaTunnel 的核心设计source 负责把源端的数据语义统一成内部的数据流sink 负责把内部数据流翻译成目标端的写入协议。只要理解了这一层就算配置项变了你也能快速跟上版本变化。另外如果你要接的不是达梦而是 Kingbase原理是类似的区别主要在 dialect 参数和连接驱动上。建议在项目启动前先在官方的 issue 区和用户群里搜一遍确认你用的数据库小版本有没有已知的兼容问题。这一条建议看着不起眼却能让你避免在生产环境才第一次暴露兼容性问题。4. 流处理侧选择sink 端怎么接住 CDC 发出来的变更流CDC 只是数据管道的前半程数据从源端出来之后总得有一个地方承接。如果你只需要直接把变更灌入目标库那前面的 Debezium Server 或者 SeaTunnel 已经能解决大部分需求。但如果变更事件需要经过转换、清洗、多流关联、窗口计算才能写入下游或者多个下游系统都要消费同一份事件那就进入流处理引擎的选型范围了。4.1 自己运维 Kafka 还划算吗先说一句容易得罪人的话很多团队的实时链路里Kafka 不是必需的它是被各种架构图“带”进来的。一个单纯的 CDC 管道里Kafka 扮演的核心角色是消息缓冲和事件分发。它的价值在以下三种情况下才会真正体现出来多个消费者需要独立消费一份变更事件下游系统要回放历史事件或者整个流处理链路需要极高的吞吐。如果你的场景只是“一个源同步到一个目标”那在中间插一个 Kafka 等于白白增加了链路延迟和运维节点。我们做过一个性能对比。同样是一张日增量 50 万行的 MySQL 表同步到下游分析库直连模式Debezium Server - 目标库的端到端延迟大约在 1 到 3 秒。而中间加一层 Kafka 之后延迟大概会增加到 3 到 5 秒。这点延迟差距对很多报表场景来说无所谓但对延迟敏感的应用Kafka 的存在感就很强了。当然如果你的实时链路已经大到需要水平扩展消费者或者你有一套统一的实时事件中心规划那 Kafka 依然是值得投入的基础设施。我的建议很简单用 Kafka 是为了解决规模化问题而不是为了架构“看起来正规”。不要让架构上的虚荣心绑架了实际的资源成本。4.2 轻量流处理引擎的体会如果你确实需要流处理能力但不想一上来就堆一套大集群这几个方向值得参考。第一个方向是保留 Flink 但精简部署。Flink 本身不强制依赖 YARN 或 K8sstandalone 模式在单机上就能跑。对数据量中等、延迟要求秒级的场景一个 Flink standalone 进程加上 RocksDB 状态后端完全能撑起日常 CDC 任务的清洗和关联。等任务多了再平滑迁移到原生集群模式。第二个方向是关注轻量级流处理数据库比如 RisingWave。它把流处理做成了一张张“物化视图”你可以用 SQL 定义实时计算逻辑由引擎底层维护流式更新计算结果可以 sink 到下游或者直接被查询。对于一个 CDC 场景来说RisingWave 的接入路径很直观把 Debezium 或 Flink CDC 发出来的 Kafka 消息作为数据源然后建物化视图做实时关联和聚合。它的优点是屏蔽掉了大量 Flink State、Checkpoint、Watermark 的概念让平时写 SQL 的数据工程师也能上手流处理。它在架构上离“轻量级”更近。第三个方向是用 Kafka Streams 做轻量计算。如果链路里已经有 Kafka并且计算逻辑不是特别复杂Kafka Streams 是一个无需额外引擎的选项。它作为客户端库嵌入你的应用里不要求独立集群。不过它对开发者的 Java 功底有一定要求我就不展开细说了。做技术选型的时候我会经常提醒自己一句话实时链路里最贵的东西不是软件许可不是服务器而是人排查问题的时间。一个架构如果依赖的概念太多团队出问题时根本不知道该查引擎源码还是该查业务逻辑这才是最大的隐性成本。所以能少一个组件就少一个组件能写 SQL 就不要写代码这两条原则如果落实得好你后期维护会轻松非常多。5. 一个可复现的实操示例从 MySQL CDC 到轻量目标端讲了这么多方案对比可能会让人觉得信息量偏大。这部分我挑一条最符合“2026 年轻量级”定位的落地路径做一次完整实操演示。场景设定如下假设你需要把一个 MySQL 业务库中的订单表实时同步到另一台机器上的 PostgreSQL 数据库要求端到端延迟控制在 5 秒以内并且尽可能降低架构复杂度和运维成本。5.1 方案背景与选型理由针对这个场景我最终选的组合是 Debezium Server 加 JDBC Sink不引入 Kafka也不引入 Flink。选择理由是需求本身只有“单源单目标”这一条同步链路没有复杂的流式计算也没有多消费者分发目标的 PostgreSQL 只接受稳定的批量写入团队没有专职的大数据运维人员日常值班的是两三个后端开发。在这种背景下链路中每多出一个组件都意味着排障时多一个未知数所以尽量精简依赖栈是最高优先级。这种直连架构的天然弱点是缺少事件回放能力一旦目标库出了问题需要补数据源端的 binlog 可能已经被清理了。所以我在方案里额外加了一个兜底策略每隔 15 分钟对关键表做一次 count 比对发现差异就触发一次重新同步任务。这个兜底逻辑不复杂但能有效对冲直连模式的风险。5.2 完整配置拆解Debezium Server 的地址我放在 /opt/debezium-server。整个部署过程主要分三步准备数据库账号、准备目标库表结构、编写配置文件并启动。数据库账号这一步容易被轻视。CDC 账号不能只给 SELECT 权限还需要 RELOAD、REPLICATION SLAVE、REPLICATION CLIENT 这几个权限否则 Debezium 无法正常读取 binlog也无法执行锁表做快照。我当时第一次部署时只给了 SELECT结果启动直接报权限不足排查了好一会儿才反应过来。目标端的连接账号至少需要目标库的 INSERT、UPDATE、DELETE 权限如果 Debezium 需要自动建表那还要额外给 CREATE 权限。下面是一份实际用过的配置我删掉了敏感信息保留了完整结构。debezium: connector: mysql offset: storage: type: file filename: /data/debezium/offset.dat database: hostname: 10.0.0.10 port: 3306 user: cdc_user password: cdc_password server-id: 5401 include: database: testdb history: storage: type: file filename: /data/debezium/schema-history.dat format: type: json schema: enabled: false sink: type: jdbc url: jdbc:postgresql://10.0.0.20:5432/dwsdb username: sink_user password: sink_password insert: enabled: true update: enabled: true delete: enabled: true table: naming.strategy: lower说明几个关键配置项。database.server-id 是 Debezium 伪装成 MySQL 从库时的 server id同一链路上如果有多个 Debezium 实例读同一个主库server-id 必须不同否则会被主库踢掉。format.schema.enabled 设置为 false可以让输出事件去掉繁琐的 Avro schema 信息减小网络开销对简单同步场景够用。JDBC sink 的 insert、update、delete 三个开关分别对应三种变更事件的写入模式建议一开始就全部打开避免漏掉某个变更类型。5.3 启动顺序与验证过程启动前一定要先确认源库 binlog 格式是 ROW如果是 STATEMENT 或 MIXEDDebezium 会给出警告并且无法正确捕获数据变更。检查命令很简单SHOW VARIABLES LIKE binlog_format;确认无误后执行启动命令。Debezium Server 在 2.x 版本后可以不用 shell 脚本直接通过 Java 命令启动cd /opt/debezium-server bin/run.sh第一次启动时Debezium 会对符合条件的表做一次全量快照然后再进入 binlog 增量监听。快照期间要注意观察主库的负载因为默认的快照策略会对表加读锁如果表行数特别大尽量安排在业务低谷期做初始化。验证同步是否正常工作我一般按三个层级检查。第一层是看日志里有没有周期性输出 heartbeat 事件第二层是在源库执行一条 UPDATE观察目标库对应记录是否在几秒内发生变化第三层是在源库 DELETE 一条记录确认目标库也执行了删除。如果三层都通过这条链路基本可以交付。注意JDBC sink 对 DELETE 事件的处理默认依赖主键匹配。目标表必须定义主键或唯一索引否则删除或更新时会因为匹配不到记录而失败。这个坑在初始建表时就要规避否则上线后补主键会非常痛苦。6. 踩坑记录配置好了还得防着这些坑最后这部分是实战记录把我这些年做 CDC 链路时踩过的坑、以及帮别人排查过的典型问题整理成速查表。很多问题在官方文档里都有提及但基本都是“一句话带过”真遇到时你未必能第一时间反应过来。现象可能原因排查步骤解决方式CDC 任务启动后日志报权限不足数据库账号缺少 REPLICATION 相关权限检查账号权限SHOW GRANTS按官方文档授权最小化 CDC 权限同步延迟持续增大目标库写入性能不足或存在锁等待查看目标库慢查询、活跃会话对目标库做索引优化调整 sink 批量参数目标表数据可以插入但无法更新/删除目标表缺少主键或唯一索引查看目标表表结构为目标表补主键重新执行全量初始化schema-history 文件损坏导致启动失败实例异常重启或文件被手动改动查看启动日志中的 DDL history 报错重建 schema-history并触发一次全量重新同步源库表结构变更后同步任务中断DDL 解析失败或目标端不兼容查看日志中的 DDL 记录评估 DDL 影响范围必要时人工介入处理同步到目标库的数据有时间差快照与增量切换时没有无缝衔接对比切换前后记录数使用增量快照模式避免锁表导致的数据遗漏除了表格里的常见项还有几个偏“独家”的经验想多说两句。第一关于时区。CDC 工具读取 binlog 里的时间类型时默认会按 JVM 时区去解析。如果你源库和目标库不在同一个时区或者 JVM 时区设置不一致同步过去的时间字段会差好几个小时。这个问题很隐蔽因为数据本身没错就是差了时区。建议在启动参数里显式指定数据库连接时区不要依赖系统默认值。第二关于大事务。如果你源库有一个事务里更新了百万行binlog 会记录大量事件Debezium 或 Flink CDC 会尝试一次性处理完这个大事务再继续往下走。在事务提交瞬间同步延迟会突然拉高看起来像卡住了。这时候不要慌先看这个事务涉及多少行观察它是否在正常推进。如果经常有大事务建议在源端推动业务拆分事务而不是加并行度硬扛。第三关于字段类型映射。不同 CDC 工具对数据库字段类型的映射规则不完全一致。比如 MySQL 的 decimal 在某些工具里会被转成字符串避免精度丢失而在另一些工具里会被转成 double可能带来精度损失。你在建目标表时一定要按照实际输出的事件格式来定义字段不要想当然地认为“源是 int目标也是 int”。实际操作中我先开启格式输出到日志观察一阵子再建目标表这个步骤能省掉很多返工。还有一个多位同行问过的问题清理任务重启以后发现漏了一段数据怎么办这个大概率是 offset 文件被回退了、或者任务崩溃前没来得及提交 offset。在 Debezium 这类工具里offset 的提交语义是“处理成功才提交”所以你重启后一般会从上次提交点继续读不丢数据但可能会重复消费。下游如果对重复执行不敏感比如目标表走主键去重重启后把延迟追平就行如果下游是单纯 append 写入就必须在 sink 侧做幂等处理。7. 对轻量级路线的一点个人结论回到文章标题那句话“2026年轻量级 CDC 与流处理方案盘点”。这一圈盘下来我的结论其实可以概括成一句话轻量级不是单一方案而是一种设计思路——尽可能减少不必要的组件和概念让链路里每一个节点都有存在的必要。如果你现在的场景是单库同步、目标明确Debezium Server 加各种 sink或者 SeaTunnel 这类集成中间件都是非常值得优先考虑的路线如果要做流式计算但不是那种超大规模的数据量Flink standalone 或 RisingWave 已经能覆盖绝大多数需求等哪天你的消费者数量变多、事件需要回放、或者吞吐需求真的上来了再平滑地把 Kafka 引入链路也不迟。数据架构不必一步到位但它一定要能“按需生长”。我自己的项目经验是很多实时链路的痛点不是技术不够先进而是引入了超出场景需要的基础设施。数据同步这件事稳定和可维护往往比“看起来很高级”更重要。这套轻量级取向的选型思路帮我避开了好几次在半夜三点被叫起来排查 Kafka 集群的窘境。希望这篇盘点也能帮你在做技术决策时省掉一些不必要的折腾。