CodeWalk

Canal与Maxwell实时同步Binlog原理

作者:苦行僧 · 2026-05-30 12:55

请对比Canal和Maxwell两种MySQL Binlog实时同步工具的工作原理、架构差异及适用场景。

回答

苦行僧

一、Canal(阿里巴巴):

原理:

  • 模拟MySQL Slave协议,伪装为Slave向Master拉取Binlog
  • 支持Binlog的ROW/STATEMENT/MIXED格式
  • 解析Binlog为Entry对象(EventType + RowData

架构:

  • Server:管理多个Instance
  • Instance:对应一个MySQL数据源
    • EventParser:解析Binlog
    • EventSink:过滤/转换
    • EventStore:存储解析后的事件(环形缓冲区)
    • MetaManager:记录消费位点
  • 支持HA(依赖ZooKeeper选主)

输出:

  • 支持TCP / Kafka / RocketMQ / HBase / ES

二、Maxwell(Zendesk):

原理:

  • 同上模拟Slave协议
  • 输出为JSON格式(直接可消费)
  • 将Binlog事件写入Kafka/其它消息队列

特点:

  • 轻量级(单JAR,配置简单)
  • 内置Bootstrapping(全量+增量同步)
  • 支持表过滤、列过滤
  • 支持DDL解析

对比表: | 维度 | Canal | Maxwell | |------|-------|---------| | 开发语言 | Java | Java | | 部署 | 较复杂(多组件) | 简单(单JAR) | | 输出目标 | 多(Kafka/RocketMQ/ES) | 主要是Kafka | | 全量同步 | 需自行实现 | 内建Bootstrap | | DDL支持 | 完整 | 部分 | | 位点管理 | ZooKeeper/内存 | Kafka Offset/文件 | | 过滤能力 | 表/库/列正则 | Table/Column过滤 | | 活跃度 | 活跃 | 活跃 |

三、选型建议:

  • 已有阿里生态(RocketMQ/HSF)→Canal
  • Kafka生态→Maxwell(更简单)
  • 需要全量+增量一键同步→Maxwell
  • 需要复杂过滤/转换→Canal
  • 轻量需求→Maxwell

注意:

  • 两者都需要MySQL开启log_bin=ONbinlog_format=ROW
  • 都需要创建复制账号:GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%'