Canal详解

Canal 是阿里巴巴开源的分布式 MySQL binlog 增量订阅&消费 中间件,最初用于阿里巴巴集团数据库异地多活的同步场景,现在也广泛用于业务的数据同步、缓存更新、数据监控等领域。
从 Canal 的工作原理、核心组件、使用场景、优缺点、部署架构等方面进行全面讲解。


一、Canal 是什么?

Canal 模拟 MySQL 的 slave 协议,伪装自己为 MySQL 的一个从库,主动拉取主库的 binlog 日志,并解析出数据变更内容(Insert、Update、Delete 等),再以事件形式推送给下游。


二、核心原理

Canal 的本质是一个 MySQL binlog 解析工具,其核心机制为:

1. 模拟 MySQL Slave

Canal 内部使用了 mysql-binlog-connector-java 模拟从库的行为,通过 COM_BINLOG_DUMP 命令向主库拉取 binlog。

2. 解析 Binlog

拉到 binlog 后,Canal 会对其进行解析,将二进制格式转化为结构化的数据对象。

3. 发送事件

Canal 提供多种消费方式(如 TCP、Kafka、RocketMQ)将解析后的数据推送给客户端。


三、核心组件结构

Canal 的整体结构分为三层:

MySQL
 └─ Canal Server
     ├─ Instance(实例,负责连接一个 MySQL)
     ├─ Parser(binlog 解析器)
     └─ Sink(数据分发模块,支持 Kafka、RocketMQ、TCP)
         └─ Client(订阅端,如缓存更新、ES、消息系统等)

四、典型使用场景

场景说明
缓存同步数据库更新后,自动刷新 Redis 缓存
全文检索同步数据库更新后同步更新到 Elasticsearch
多数据库同步(异地多活)多机房数据同步,做到容灾冗余
数据备份/审计binlog 实时解析,用于业务审计、操作记录等
异构数据库同步如 MySQL -> HBase / Kafka / MongoDB 等

五、部署模式

1. 单机模式(开发测试使用)

  • Canal Server + Instance 全部在一台机器上
  • 配置简单,适合调试

2. 集群模式(生产推荐)

  • 支持多 Instance,多 Canal Server 部署
  • 与 ZooKeeper 搭配进行 HA(高可用)
  • 每个 instance 负责监听一个 MySQL 实例

六、如何使用 Canal

1. MySQL 配置

确保 MySQL 开启 binlog,推荐使用 ROW 模式:

[mysqld]
log-bin=mysql-bin
binlog-format=ROW
server-id=1

并创建同步账户:

CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';

2. Canal Server 配置

  • 编辑 instance 的配置文件 instance/example/instance.properties
  • 设置数据源、拉取起始位置、解析库表名等

3. 启动 Canal Server

sh bin/startup.sh

4. 客户端消费(举例)

  • TCP 客户端使用 com.alibaba.otter.canal.client.CanalConnector
  • Kafka 模式下监听指定 topic 消费 binlog 数据

七、输出的数据格式(简化)

Canal 会输出如下结构的 JSON:

{
  "data": [
    {
      "id": "1001",
      "name": "张三"
    }
  ],
  "database": "test",
  "table": "user",
  "type": "INSERT",
  "es": 1629779298000,
  "ts": 1629779298000
}

八、Canal 与其他工具比较

工具说明特点
Canal基于 binlog 的 MySQL 数据同步支持高可用、灵活扩展
Debezium基于 Kafka 的 CDC 框架支持多种数据库(MySQL/Postgres/Mongo)
Maxwell轻量级 MySQL binlog 推送工具简单易用,但功能较弱
DTS(阿里云)阿里云的数据传输服务SaaS 服务,配置简单但受限于云平台

九、优缺点总结

优点:

  • 基于 binlog,不影响线上性能
  • 支持事务、行级数据变更
  • 支持 Kafka、RocketMQ 等异步消费方式
  • 灵活可扩展,开源生态活跃

缺点:

  • 仅支持 MySQL(PostgreSQL 支持需借助其他工具)
  • 需要管理 Canal Server 高可用
  • binlog 格式需设置为 ROW,否则无法获取行级变更

十、实践建议

  • Canal Server 和 Kafka/RocketMQ 组合使用,可靠性更高
  • 配置多个 instance 实现多个库同步
  • 使用 Spring Boot 整合 canal 客户端可实现缓存、ES等业务更新
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思静鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值