开发者

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

目录
  • 一、Canal 简介与核心原理
  • 二、环境准备与依赖
    • 1. 系统要求
    • 2. 软件下载
  • 三、mysql 配置
    • 1. 开启 binlog
    • 2. 创建同步用户
    • 3. 验证 binlog 配置
  • 四、Canal 安装与配置
    • 1. 下载与解压
    • 2. 配置 Canal 实例
  • 五、docker 部署(可选)
    • 六、启动与验证
      • 1. 启动 Canal 服务
      • 2. 检查日志
      • 3. 测试数据同步
    • 七、数据同步到下游系统
      • 1. 同步到 Kafka/RabbitMQ
      • 2. 同步到 Elasticsearch
    • 八、常见问题与解决方案
      • 九编程客栈、总结

        一、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

        cajsnal.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 INhttp://www.devze.comT 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 无法连接 sXCqAMySQL

        原因: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数据同步内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

        0

        上一篇:

        下一篇:

        精彩评论

        暂无评论...
        验证码 换一张
        取 消

        最新数据库

        数据库排行榜