背景
业务需要实时分析 MySQL 数据变更,用于实时告警、多维统计和 ERP 数据同步。方案选型 Alibaba Canal 解析 binlog,投递至 Kafka,下游 Flink/TiDB 消费。
架构设计
MySQL(binlog) → Canal Server → Kafka → Flink/TiDB/大数据平台
↓
Canal Admin (WebUI 管理)
环境信息
| 组件 | 版本 | 节点 | 备注 |
|---|---|---|---|
| Canal Admin | 1.1.4 | 192.168.93.21 | WebUI 管理 |
| Canal Server | 1.1.4 | 192.168.93.20/21 | 双节点 HA |
| Kafka | 2.12-2.2.0 | 192.168.93.10/11/12 | 3 节点集群 |
| Zookeeper | 3.5.6 | 192.168.93.10/11/12 | Kafka 依赖 |
| Kafka Eagle | 2.0.4 | 192.168.93.20 | Web 监控 |
| MySQL | 5.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 多分区 | partitionHash | PK 级有序 | 高 | 热点表 |
| 多 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 Web | Server 状态、Instance 配置 |
| Kafka 集群 | Kafka Eagle | Topic、Consumer Group、Offset |
| MySQL | 自建/云监控 | binlog 延迟、主从同步 |
| 端到端 | 自定义脚本 | binlog → Kafka 延迟 |
故障排查 Checklist
- MySQL 权限:
SHOW GRANTS FOR 'canal' - binlog 状态:
SHOW VARIABLES LIKE 'log_bin' - Canal Server 注册 Admin 成功
- Instance 配置:topic 名、分区数、hash 规则
- 网络连通:Canal → MySQL、Canal → Kafka
- 造数据验证:创建临时表 → 插入数据 → 查看 Kafka Consumer
生产注意事项
- 部署目录必须非系统盘(
/data/canal/) - 至少 2 个 Canal Server 节点保障 HA
- MD5 加密密码,避免明文存储
- Topic 命名避免下划线和点(Kafka 规范)
- 阿里云限制:RDS 从库不支持 binlog,必须直连主库
复盘
问题根因:阿里云 RDS 从库 binlog 读取权限限制
改进措施:
- 文档化云厂商限制清单
- 部署前确认主从库权限
- 建立 Canal → Kafka 延迟监控告警
本文首发于 wr.mrchi.cn,转载请注明出处。