问题

从 Canal 到 Doris 的数据同步链路 一文中,我写了用 Canal 做 MySQL → Kafka → Doris 的同步。但有一个问题一直没展开:

Canal 一定是对的选择吗?

如果你在做 MySQL → Doris 的实时同步,可选的 CDC 工具至少有四个:Canal、Debezium、Maxwell、阿里云 DTS。它们都能读 MySQL binlog,都能把变更发到 Kafka。但选错了,运维成本和踩坑深度完全不同。

四个工具各自是什么

Canal(阿里)

阿里开源的 MySQL binlog 增量订阅组件。国内 Java 生态使用最广泛。

  • 架构:伪装成 MySQL Slave,接收 binlog 事件
  • 数据格式:自定义 protobuf + JSON
  • 部署模型:Server-Client 模式,Canal Server 作为独立进程
  • 管理界面:Canal Admin(Web UI)
  • 社区活跃度:国内活跃,国际几乎无人用

Debezium(Red Hat)

Red Hat 开源,基于 Kafka Connect 框架,国际化标准 CDC 方案。

  • 架构:Kafka Connect Source Connector,原生 Kafka 生态
  • 数据格式:标准 Kafka Connect Source Records(JSON/Avro)
  • 部署模型:Kafka Connect Worker(分布式模式)
  • 管理界面:Kafka Connect REST API + Kafka UI(如 AKHQ、Confluent Control Center)
  • 社区活跃度:全球主流 CDC 方案,社区非常活跃

Maxwell(Zendesk)

轻量级 MySQL binlog 解析工具,设计目标是”简单到极致”。

  • 架构:单进程,伪装成 MySQL Slave
  • 数据格式:JSON(每行变更一条 JSON 消息)
  • 部署模型:一个 JAR 包,java -jar 启动
  • 管理界面:无(配置文件驱动)
  • 社区活跃度:维护中,更新频率低

阿里云 DTS(商业服务)

阿里云的数据传输服务,商业产品,包含增量同步 + 全量迁移 + 结构同步。

  • 架构:全托管 SaaS,用户不需要部署任何组件
  • 数据格式:阿里云自定义格式
  • 部署模型:云控制台配置
  • 管理界面:阿里云 Web Console
  • 社区活跃度:不适用(商业产品)

逐维度对比

维度 Canal Debezium Maxwell 阿里云 DTS
运维复杂度 中(需维护 Canal Server + Admin) 高(需维护 Kafka Connect 集群) 低(单 JAR 包) 零(全托管)
Kafka 生态集成 需要自己写 Producer 原生 Kafka Connect 内置 Producer 不适用
数据格式标准化 Canal 自定义格式 Kafka Connect 标准(支持 Avro/JSON) Maxwell JSON DTS 自定义格式
DDL 支持 支持 支持 支持 支持
高可用 需 ZooKeeper + Canal HA Kafka Connect 原生分布式 单点(需自己做 HA) 阿里云保证
Schema 变更通知 有(Schema Registry 集成)
国内社区/文档 最丰富 一般 阿里云支持
国际化/多云 几乎无 主流选择 有一定使用量 仅阿里云
成本 开源免费 开源免费 开源免费 按量付费
适合规模 中大型 大型 中小型 任意(按钱)

真正的选择逻辑

选 Canal 的理由

你在国内 Java 生态,团队已经有 Canal 运维经验。

Canal 在国内的文档、踩坑文章、运维经验是最多的。出了问题搜得到答案。如果你的团队已经熟悉 Canal 的配置模式(instance.properties / canal.properties / Canal Admin),切换到其他工具的学习成本不值得。

选 Canal 不选的理由:它的 Kafka 集成不如 Debezium 原生。Canal 的 Producer 是自己实现的,不是 Kafka Connect 的一部分。这意味着你无法享受 Kafka Connect 的 offset 管理、exactly-once 语义、Schema Registry 等能力。

选 Debezium 的理由

你的基础设施以 Kafka 为中心,追求标准化和可移植性。

Debezium 是 Kafka Connect 的 Source Connector。这意味着:

  • offset 管理由 Kafka Connect 负责(不是自己维护)
  • 数据格式是 Kafka Connect 标准(支持 Avro + Schema Registry)
  • 可以和其他 Source/Sink Connector 组合(如 Debezium MySQL Source → JDBC Sink Connector → Doris,不需要中间写代码)

选 Debezium 不选的理由:运维门槛高。你需要维护 Kafka Connect 集群(独立于 Kafka Broker 的 Worker 集群),理解 Connect 的 offset 机制、Converter 配置、Schema Registry。如果团队没有 Kafka 生态经验,学习曲线陡。

选 Maxwell 的理由

你的同步需求简单,不想维护复杂基础设施。

Maxwell 的部署模式就是 java -jar maxwell.jar,一个进程搞定。不需要 ZooKeeper,不需要 Canal Admin,不需要 Kafka Connect Worker。适合”只把 MySQL 变更发到 Kafka,不需要复杂路由”的简单场景。

选 Maxwell 不选的理由:单点部署,没有原生 HA。如果你需要高可用,要么自己用 supervisor + 多实例 + 消费端去重,要么就不用它。功能也最少——没有 Schema 变更通知、没有 DDL 解析的丰富性、没有 Canal 的 Canal-Admin 管理界面。

选阿里云 DTS 的理由

你的基础设施在阿里云上,不想自己运维 CDC。

DTS 是全托管服务。你不需要部署任何组件,在控制台配一下源库和目标库就行。阿里云负责高可用、故障恢复、监控告警。

选 DTS 不选的理由:锁定阿里云。DTS 的数据格式是阿里云自定义的,如果你的消费端需要标准化格式(如 Debezium 的 Kafka Connect 格式),需要额外做格式转换。成本也更高——按同步实例规格 + 数据量付费,数据量大时月费不低。

AI 后端场景下的具体建议

场景 1:MySQL → Kafka → Doris(你的核心场景)

这是 Canal 到 Doris 同步链路 文章的场景。

选择 适合情况
Canal 团队熟悉 Canal,国内生态,Doris 的 Routine Load 原生支持 Canal 格式
Debezium 已有 Kafka Connect 集群,追求标准化
DTS 全在阿里云上,不想运维

推荐:如果团队已经用 Canal,没必要换。Canal + Kafka + Doris Routine Load 的链路在国内是成熟方案。

场景 2:MySQL → ES(搜索同步)

MySQL 业务数据变更 → 实时同步到 ES 做搜索索引。

选择 适合情况
Canal 和 Doris 同步复用同一套 Canal 实例,分流到不同 topic
Debezium 已有 Kafka Connect,可以用 JDBC Sink Connector 直接写 ES(不需要写消费端代码)
Maxwell 简单场景,一个进程搞定

推荐:如果你的 ES 同步和 Doris 同步共用一条链路(同一套 Canal → 不同 topic → 不同消费端),用 Canal 最省事。如果 ES 同步是独立链路且需求简单,Maxwell 的单进程部署更轻量。

场景 3:MySQL → Outbox → 多下游

如果你用了 Outbox 模式,需要一个 CDC 工具读 outbox 表的 binlog。

选择 适合情况
Canal 读 outbox 表的 binlog,发到 Kafka,消费端处理
Debezium 原生 Kafka Connect,可以配置只监听 outbox 表(table.whitelist

推荐:Debezium 更适合 Outbox 场景。原因:Debezium 的 table.whitelist 配置可以精确到表级别,只读 outbox 表的变更。Canal 虽然也能配 canal.instance.filter.regex,但粒度和灵活性不如 Debezium。

一个容易被忽略的点:全量初始化

CDC 工具只做增量同步(binlog)。但你的同步链路启动时,MySQL 里已经有存量数据了。这些数据不在 binlog 里。

工具 全量初始化能力
Canal 无(需自己写脚本做全量 dump)
Debezium 有(Incremental Snapshot,原地全量+增量切换)
Maxwell 无(需自己写)
DTS 有(全量+增量自动切换)

Debezium 的 Incremental Snapshot 是一个被低估的能力。 它可以在不锁表的情况下做全量初始化,然后无缝切到 binlog 增量。Canal 没有这个能力——你必须自己写全量 dump 脚本,然后切到 Canal 做增量。

如果你的同步链路需要频繁重建(如 Doris 重建表后重新同步),Debezium 的全量+增量一体化能力会省很多事。

更新已有判断

从 Canal 到 Doris 的数据同步链路 一文中,默认使用 Canal。

需要补充:

Canal 是国内生态最成熟的选择,但不是唯一选择。选型时真正要问的是三个问题:(1) 你是否已有 Kafka Connect 集群?有 → Debezium 更原生。(2) 你的同步需求是否简单到”一个进程搞定”?是 → Maxwell 更轻量。(3) 你是否在阿里云上且不想运维?是 → DTS 最省心。如果这三个问题的答案都是”否”,Canal 仍然是最稳妥的选择——不是因为 Canal 最好,而是因为它的国内生态和踩坑经验最丰富。

参考链接