基于数据同步canal的使用详解
canal服务简谈
Canal 是阿里巴巴开源的一个基于 MySQL 数据库 binlog 的增量订阅和消费组件,主要用于实现 MySQL 数据库的实时数据同步。
附:文章结尾附项目配置详解及相关具体文档说明
文章目录
- canal服务简谈
- canal的核心工作原理
- 一、canal的主要特性
- 二、基本架构
- 三、使用前确认
- 1.确认目标数据库的binlog是否开启及为用户赋权限
- 打开binlog
- 选择ROW(行)模式
- 四、MQ信息初始化
- 五、canal的adapter配置详解
- 六、常用同步执行脚本
- 七、常见问题处理
- 总结
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中配置的数据源srcDataSourcesdestination: canal_topic # 对应application.yml中配置的instance:
groupId: g1 #对应application.yml中配置的groupId:
outerAdapterKey: mysql1 #对应application.yml中配置的outerAdapters.keyconcurrent: 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