Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > Canal MySQL数据同步

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

作者:酷爱码

Canal 是阿里巴巴开源的一个基于 MySQL 数据库增量日志(binlog)解析的组件,本文主要介绍了如何使用Canal实现MySQL数据同步功能,希望对大家有所帮助

一、Canal 简介与核心原理

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

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数据同步内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文