MySQL + Canal + Kafka 数据同步方案
概述
本方案详细介绍如何使用 Canal 将 MySQL 的 binlog 数据实时同步到 Kafka,实现 CDC(Change Data Capture,变更数据捕获)功能。这种架构广泛应用于数据同步、缓存更新、搜索索引构建、数据仓库等场景。
方案优势
- 实时性:基于 MySQL binlog,实现毫秒级数据同步
- 低侵入:无需修改业务代码,通过 binlog 采集数据
- 高可靠:支持断点续传,保证数据不丢失
- 高性能:异步处理,不影响 MySQL 主业务
- 易扩展:Kafka 天然支持多消费者,便于下游扩展
- 解耦合:生产者和消费者完全解耦,提升系统灵活性
应用场景
- 缓存同步:MySQL 数据变更实时同步到 Redis
- 搜索索引:MySQL 数据变更实时更新到 Elasticsearch
- 数据仓库:实时将业务数据同步到数据仓库
- 消息通知:数据变更触发业务通知
- 数据分发:将数据分发给多个下游系统
- 数据分析:实时数据分析与监控
目录
1. 架构设计
1.0 部署架构说明
本文档采用分布式部署架构,各组件独立部署在不同服务器上:
| 组件 | 服务器 IP | 端口 | 说明 |
|---|---|---|---|
| MySQL | 192.168.1.100 | 3306 | 数据库服务器 |
| Canal Server | 192.168.1.100 | 11111 | Canal 部署在 MySQL 同服务器 |
| Canal Adapter | 192.168.1.100 | 8081 | Canal Adapter(可选) |
| Kafka 节点 1 | 192.168.1.101 | 9092 | Kafka Broker 1 |
| Kafka 节点 2 | 192.168.1.102 | 9092 | Kafka Broker 2 |
| Kafka 节点 3 | 192.168.1.103 | 9092 | Kafka Broker 3 |
注意:以上 IP 地址仅为示例,请根据实际环境修改。
1.1 整体架构
1.2 Canal 架构
1.3 数据流向
MySQL → binlog → Canal Server → Canal Adapter → Kafka → 消费者
详细流程:
- MySQL 产生数据变更(INSERT/UPDATE/DELETE)
- MySQL 将变更记录到 binlog
- Canal Server 模拟 MySQL Slave,拉取 binlog
- Canal Server 解析 binlog,转换为结构化事件
- Canal Adapter 将事件转换为 Kafka 消息格式
- Kafka 接收并存储消息
- 消费者从 Kafka 拉取消息并处理
2. 前置条件
2.1 环境要求
| 组件 | 版本要求 | 说明 |
|---|---|---|
| MySQL | 5.6.x / 5.7.x / 8.0.x | 需要开启 binlog |
| Canal | 1.1.6+ | 推荐使用最新稳定版 |
| Kafka | 2.8+ / 3.0+ | 推荐 KRaft 模式 |
| JDK | 1.8+ | Canal 和 Kafka 运行环境 |
| Zookeeper | 3.5+ | Kafka 传统模式需要,KRaft 模式不需要 |
2.2 硬件配置
| 组件 | 最小配置 | 推荐配置 |
|---|---|---|
| MySQL | 2核 4GB | 4核 8GB |
| Canal | 2核 2GB | 4核 4GB |
| Kafka | 2核 4GB | 4核 8GB |