基于数据同步canal的使用详解

发布于:2025-06-27 ⋅ 阅读:(15) ⋅ 点赞:(0)

canal服务简谈

Canal 是阿里巴巴开源的一个基于 MySQL 数据库 binlog 的增量订阅和消费组件,主要用于实现 MySQL 数据库的实时数据同步。
附:文章结尾附项目配置详解及相关具体文档说明



canal的核心工作原理

Canal 通过模拟 MySQL slave 的交互协议,伪装自己为 MySQL 的 slave,向 MySQL master 发送 dump 协议。MySQL master 收到 dump 请求后,开始推送 binary log 给 slave (即 Canal),Canal 解析 binary log 对象 (原始为 byte 流),转换为结构化数据供下游消费。


一、canal的主要特性

实时性:基于 MySQL binlog 实现秒级数据同步

高性能:单线程解析能力可达 5-10W TPS

低侵入:对业务系统无侵入,不需要修改业务代码

多种消费模式:支持直接 API 调用、MQ 消息队列等多种消费方式

高可用:支持集群部署,具备故障自动转移能力

二、基本架构

MySQL Master → Canal Server → Canal Client → 目标系统
(解析binlog) (数据转换) (如ES/Redis/其他DB)

三、使用前确认

1.确认目标数据库的binlog是否开启及为用户赋权限

– 使用命令登录:mysql -u root -p
– 创建用户 用户名:canal 密码:Canal@123456
create user ‘canal’@‘%’ identified by ‘canal’;
– 授权 *.表示所有库
grant SELECT, REPLICATION SLAVE, REPLICATION CLIENT on . to ‘canal’@‘%’ identified by ‘canal’;
– 授权 stat 库写权限
grant select,insert,update,delete on stat.
to ‘canal’@‘%’ identified by ‘canal’;

针对已有的账户可通过grants查询权限:

mysql> show grants for ‘root’ ;
±--------------------------------------------------------------------------+
| Grants for root@% |
±--------------------------------------------------------------------------+
| GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON . TO root@% |
±--------------------------------------------------------------------------+

2.下一步在MySQL配置文件my.cnf设置如下信息(已有忽略):
[mysqld]

打开binlog

log-bin=mysql-bin

选择ROW(行)模式

binlog-format=ROW

3.改了配置文件之后,重启MySQL,使用命令查看是否打开binlog模式:
mysql> show variables like ‘binlog_format’;
±--------------±------+
| Variable_name | Value |
±--------------±------+
| binlog_format | ROW |
±--------------±------+

mysql> show variables like ‘log_bin’;
±--------------±------+
| Variable_name | Value |
±--------------±------+
| log_bin | ON |
±--------------±------+

四、MQ信息初始化

rabbitmq.host =10.0.0.1
rabbitmq.virtual.host =/
rabbitmq.exchange =canal_exchange
rabbitmq.username =user_name
rabbitmq.password =pass_word
rabbitmq.deliveryMode =2

五、canal的adapter配置详解

dataSourceKey: storestockDS # 对应application.yml中配置的数据源srcDataSources

destination: canal_topic  # 对应application.yml中配置的instance:
groupId: g1 #对应application.yml中配置的groupId:
outerAdapterKey: mysql1  #对应application.yml中配置的outerAdapters.key

concurrent: false
dbMapping:
  database: storestock #数据源库库名
  dbpatition: 1  # 源库分库数量
  tablepatition: 1 # 源库分表数量
  table: store_stock_receiving_order # 源库表名
  targetDb: stat # 目标库名
  targetTable: store_stock_receiving_order # 目标表名
  targetPk:
    id: id # 同步主键
  commitBatch: 3000 # 提交批次
  mapAll: true # true标识同步所有字段

六、常用同步执行脚本

历史数据增量同步命令
增量数据同步(按主键查询,已存在调过)
curl http://127.0.0.1:18802/etl/rdbnyls/mysql1/****.yml  -X POST -d "params=2018-01-25;2018-01-26"
全量数据同步(要先清空目标表)
curl   http://127.0.0.1:18802/etl/rdbnyls/mysql1/****.yml   -X POST 

七、常见问题处理

curl http://127.0.0.1:18802/etl/rdbnyls/mysql1/****.yml -X POST
同步报错task not fuond
检查storestock.store_stock_in_batch.yml配置【检查标红的部分是否配置一致】
dataSourceKey: sunboxDS #数据源application.yml中
destination: canal_topic #队列topic
groupId: g1 #application.yml中目标库分组
outerAdapterKey: mysql1 #application.yml中目标库分组key

检查配置“:” 这个冒号后面是有空格的

总结

Canal 相比其他数据同步工具的最大优势在于其基于 MySQL 原生复制协议实现,具有低延迟、高可靠的特点,特别适合需要实时数据同步的场景。

https://pan.quark.cn/s/3d6b24c701e1

网站公告

今日签到

点亮在社区的每一天
去签到