使用Canal实现MySQL数据同步的完整指南

 更新时间:2025年06月16日 09:41:48   作者:酷爱码  
Canal 是阿里巴巴开源的一个基于 MySQL 数据库增量日志(binlog)解析的组件,本文主要介绍了如何使用Canal实现MySQL数据同步功能,希望对大家有所帮助

一、Canal 简介与核心原理

Canal 是阿里巴巴开源的一个基于 MySQL 数据库增量日志(binlog)解析的组件,通过模拟 MySQL 从库的方式,实时捕获主库的数据变更(如 INSERT、UPDATE、DELETE 操作),并将这些变更以事件的形式推送给下游系统。其核心原理如下:

  • 模拟 MySQL 从库:Canal 伪装成 MySQL 的从库,通过 MySQL 的 dump 协议向主库请求 binlog 日志。
  • 解析 binlog 日志:将 MySQL 主库的 binlog 日志解析为结构化的数据(如 JSON 格式),便于下游系统消费。
  • 事件分发与存储:解析后的事件通过 EventSink 模块进行过滤、分发、归并等操作,并存储到内存队列(环形队列)中。
  • 下游系统对接:支持将增量数据同步到 Kafka、RabbitMQ、Elasticsearch 等系统,或通过适配器写入其他数据库。

Canal 的优势在于其低延迟、高可靠性和灵活的扩展性,广泛应用于数据同步、缓存更新、数据索引构建等场景。

二、环境准备与依赖

1. 系统要求

操作系统:Linux(如 Ubuntu 20.04)、Windows 或 macOS。

JDK:1.8 或以上版本。

MySQL:5.7 或 8.x。

Docker(可选):用于快速部署 Canal 服务。

2. 软件下载

Canal:从 GitHub 下载最新版本(如 canal.deployer-1.1.7.tar.gz)。

MySQL:确保 MySQL 已安装并开启 binlog 功能。

三、MySQL 配置

1. 开启 binlog

MySQL 默认未开启 binlog,需手动配置:

[mysqld]
log-bin=mysql-bin          # 启用 binlog
binlog-format=ROW          # 设置 binlog 格式为 ROW(记录行级变更)
server-id=1                # 唯一服务器 ID(主库和从库需不同)

修改配置后重启 MySQL 服务:

# Linux 系统
systemctl restart mysql

# Windows 系统
net stop MySQL
net start MySQL

2. 创建同步用户

为 Canal 创建专用用户,并授予必要的权限:

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

REPLICATION SLAVE:允许读取 binlog。

REPLICATION CLIENT:允许查询 binlog 状态。

3. 验证 binlog 配置

登录 MySQL 并检查 binlog 状态:

SHOW VARIABLES LIKE 'log_bin';  -- 确保 log_bin 的值为 ON
SHOW MASTER STATUS;            -- 查看当前 binlog 文件和位置

四、Canal 安装与配置

1. 下载与解压

从 GitHub 下载 Canal 并解压:

wget https://github.com/alibaba/canal/releases/download/canal-1.1.7/canal.deployer-1.1.7.tar.gz
tar -zxvf canal.deployer-1.1.7.tar.gz -C /usr/local/canal

2. 配置 Canal 实例

进入 Canal 配置目录并修改实例配置文件:

cd /usr/local/canal/conf

修改 canal.properties

canal.destinations=example  # 实例名称
canal.server.port=11111     # Canal 服务端口
canal.metrics.pull.port=11112

修改 example/instance.properties

canal.instance.master.address=127.0.0.1:3306  # MySQL 主库地址
canal.instance.dbUsername=canal                 # 同步用户
canal.instance.dbPassword=canal                 # 同步用户密码
canal.instance.connectionCharset=UTF-8
canal.instance.filter.regex=springboot_data\\..*  # 表过滤规则(匹配 springboot_data 库下的所有表)

五、Docker 部署(可选)

如果希望通过 Docker 快速部署 Canal,可以创建自定义网络并运行容器:

# 创建网络
docker network create canal-network

# 运行 MySQL 容器(假设已存在 MySQL 容器)
docker network connect canal-network mysql

# 运行 Canal 容器
docker run -d \
  --name canal \
  -p 11111:11111 \
  --network canal-network \
  -e canal.destinations=example \
  -e canal.instance.master.address=mysql:3306 \
  -e canal.instance.dbUsername=canal \
  -e canal.instance.dbPassword=canal \
  -e canal.instance.connectionCharset=UTF-8 \
  -e canal.instance.filter.regex=springboot_data\\..* \
  canal/canal-server:v1.1.7

六、启动与验证

1. 启动 Canal 服务

cd /usr/local/canal/bin
./startup.sh

2. 检查日志

查看 Canal 启动日志,确保无错误:

tail -n 50 /usr/local/canal/logs/example/example.log

3. 测试数据同步

在 MySQL 中插入测试数据:

USE springboot_data;
CREATE TABLE test_table (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(255)
);
INSERT INTO test_table (name) VALUES ('test1'), ('test2');

观察 Canal 日志,确认是否捕获到数据变更事件:

[INFO] [main] c.a.o.canal.instance.core.AbstractCanalInstance - Start the canal instance.
[INFO] [main] c.a.o.canal.deployer.CanalLauncher - ## Start the canal server.
[INFO] [main] c.a.o.canal.deployer.CanalLauncher - ## The canal server is running now !!!

七、数据同步到下游系统

1. 同步到 Kafka/RabbitMQ

修改 application.yml(Canal Adapter 配置):

canal.conf:
  mode: tcp
  flatMessage: true
  zookeeperHosts: 
  syncBatchSize: 1000
  retries: -1
  timeout: 3000
  accessKey: 
  secretKey: 
  consumerProperties:
    canal.tcp.server.host: 127.0.0.1:11111
    canal.tcp.batch.size: 500
    canal.tcp.username: 
    canal.tcp.password: 

2. 同步到 Elasticsearch

配置 application.yml 并启动 Canal Adapter:

cd /usr/local/canal/canal-adapter
bash bin/startup.sh

八、常见问题与解决方案

1. Canal 无法连接 MySQL

原因:MySQL 用户权限不足或网络不通。

解决:检查 MySQL 用户权限(REPLICATION SLAVE)和防火墙设置。

2. binlog 格式错误

原因:MySQL 的 binlog-format 未设置为 ROW。

解决:修改 my.cnf 并重启 MySQL。

3. Canal 启动失败

原因:配置文件路径错误或依赖缺失。

解决:检查 canal.properties 和 instance.properties 的配置,确保路径正确。

4. 数据同步延迟

原因:MySQL 主库压力大或 Canal 解析性能不足。

解决:优化 MySQL 索引,增加 Canal 实例数量。

九、总结

通过上述步骤,我们完成了从 MySQL 配置到 Canal 安装、启动及数据同步的全流程。Canal 的核心价值在于其对 MySQL binlog 的高效解析和灵活的数据分发能力,使其成为实时数据同步领域的首选工具。在实际应用中,建议结合 Kafka、Elasticsearch 等技术栈,构建高效、可靠的数据同步体系。

随着业务规模的增长,Canal 还支持集群部署、动态配置管理(通过 Zookeeper)等功能,进一步提升系统的稳定性和可扩展性。掌握 Canal 的配置与优化技巧,将为数据一致性保障和业务解耦提供强大支持。

到此这篇关于使用Canal实现MySQL数据同步的完整指南的文章就介绍到这了,更多相关Canal MySQL数据同步内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL5.7的安装与配置详细操作步骤

    MySQL5.7的安装与配置详细操作步骤

    本文分步骤详细给大家介绍了MySQL5.7的安装与配置详细操作方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • MySQL联合索引遵循最左前缀匹配原则

    MySQL联合索引遵循最左前缀匹配原则

    这篇文章主要介绍了MySQL联合索引遵循最左前缀匹配原则, MySQL联合索引遵循最左前缀匹配原则,即最左优先,查询的时候会优先匹配最左边的索引
    2022-08-08
  • MySQL中insertOrUpdate的功能实现方式

    MySQL中insertOrUpdate的功能实现方式

    文章介绍了MySQL中实现`insertOrUpdate`功能的`INSERT INTO...ON DUPLICATE KEY UPDATE`语句,并探讨了其工作原理、执行流程以及潜在的死锁问题,同时,还提到了类似SQL语句如`REPLACE INTO`和`INSERT IGNORE INTO`的区别,并讨论了主键跳跃的现象
    2025-12-12
  • 数据结构-树(三):多路搜索树B树、B+树

    数据结构-树(三):多路搜索树B树、B+树

    这篇文章主要介绍了多路搜索树B树、B+树,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • mysql5.7.23版本安装教程及配置方法

    mysql5.7.23版本安装教程及配置方法

    这篇文章主要介绍了mysql5.7.23版本安装教程及配置方法,需要的朋友可以参考下
    2018-11-11
  • MySQL8.0.23免安装版配置详细教程

    MySQL8.0.23免安装版配置详细教程

    这篇文章主要介绍了MySQL8.0.23免安装版配置教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • MySQL脚本批量自动插入数据及数据可按条件插入实现

    MySQL脚本批量自动插入数据及数据可按条件插入实现

    在初始化数据库或者导入一些数据时,常常会用到批量的操作,本文主要介绍了MySQL脚本批量自动插入数据及数据可按条件插入实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • mysql非主键自增长用法实例分析

    mysql非主键自增长用法实例分析

    这篇文章主要介绍了mysql非主键自增长用法,结合实例形式分析了MySQL非主键自增长的基本设置、使用方法与操作注意事项,需要的朋友可以参考下
    2020-02-02
  • mysql read_buffer_size 设置多少合适

    mysql read_buffer_size 设置多少合适

    很多朋友都会问mysql read_buffer_size 设置多少合适,其实这个都是根据自己的内存大小等来设置的
    2016-05-05
  • SQL JOIN 子句合并多个表中相关行全面指南

    SQL JOIN 子句合并多个表中相关行全面指南

    这篇文章主要为大家介绍了SQL JOIN 子句合并多个表中相关行全面指南,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11

最新评论