Skip to content
云间札记
Go back

Canal + Kafka CDC 数据同步实战:从 MySQL binlog 到实时数仓

Updated:

背景

业务需要实时分析 MySQL 数据变更,用于实时告警、多维统计和 ERP 数据同步。方案选型 Alibaba Canal 解析 binlog,投递至 Kafka,下游 Flink/TiDB 消费。

架构设计

MySQL(binlog) → Canal Server → Kafka → Flink/TiDB/大数据平台

           Canal Admin (WebUI 管理)

环境信息

组件版本节点备注
Canal Admin1.1.4192.168.93.21WebUI 管理
Canal Server1.1.4192.168.93.20/21双节点 HA
Kafka2.12-2.2.0192.168.93.10/11/123 节点集群
Zookeeper3.5.6192.168.93.10/11/12Kafka 依赖
Kafka Eagle2.0.4192.168.93.20Web 监控
MySQL5.6.42数据源binlog ROW 模式

MySQL 前置配置

[mysqld]
log-bin=mysql-bin
binlog-format=ROW
server_id=201
CREATE USER 'canal'@'%' IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;

Canal Admin 部署

mkdir -p /data/admin-canal/
wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.admin-1.1.4.tar.gz
tar -zxvf canal.admin-1.1.4.tar.gz -C /data/admin-canal/

application.yml 配置:

server:
  port: 8089
spring.datasource:
  address: bigdata-microservice.mysql.rds.aliyuncs.com:3306
  database: canal_manager
  username: canal
  password: canal
canal:
  adminUser: admin
  adminPasswd: admin

Canal Server 配置

canal.register.ip = 192.168.93.21
canal.admin.manager = 192.168.93.21:8089
canal.admin.register.auto = true
canal.zkServers = 192.168.93.10:2181,192.168.93.11:2181,192.168.93.12:2181
canal.serverMode = kafka
canal.mq.servers = 192.168.93.10:9092,192.168.93.11:9092,192.168.93.12:9092
canal.admin.register.cluster = BigData-Canal-Cluster

Kafka 分区策略(顺序性保障)

模式配置顺序性TPS适用场景
单 topic 单分区默认严格有序2-3k强顺序要求
单 topic 多分区partitionHashPK 级有序热点表
多 topic 单分区dynamicTopic表级有序库级隔离

PK Hash 配置:

canal.mq.partitionsNum=3
canal.mq.partitionHash=my_dc_test\.cyc_test:id

阿里云 RDS 坑点

问题:Canal 启动成功,Kafka 无数据

根因:阿里云 RDS 从库不支持用户读取 binlog

解决:必须连接主库或自建从库

工单确认:阿里云从库不开放 binlog 读取权限
解决方案:直连主库 或 自建 MySQL 从库

监控体系

层级工具监控内容
Canal 集群Canal Admin WebServer 状态、Instance 配置
Kafka 集群Kafka EagleTopic、Consumer Group、Offset
MySQL自建/云监控binlog 延迟、主从同步
端到端自定义脚本binlog → Kafka 延迟

故障排查 Checklist

  1. MySQL 权限:SHOW GRANTS FOR 'canal'
  2. binlog 状态:SHOW VARIABLES LIKE 'log_bin'
  3. Canal Server 注册 Admin 成功
  4. Instance 配置:topic 名、分区数、hash 规则
  5. 网络连通:Canal → MySQL、Canal → Kafka
  6. 造数据验证:创建临时表 → 插入数据 → 查看 Kafka Consumer

生产注意事项

复盘

问题根因:阿里云 RDS 从库 binlog 读取权限限制

改进措施

本文首发于 wr.mrchi.cn,转载请注明出处。



Previous Post
n8n 工作流自动化平台 Docker 部署实战
Next Post
AWS S3 挂载 EC2 实战:s3fs-fuse 与实时同步监控