0 参考列表
CSDN:canal简介及canal部署、原理和使用介绍https://blog.csdn.net/wt334502157/article/details/119763273
CSDN:使用Canal同步MySQL数据到Kafkahttps://blog.csdn.net/manba_yqq/article/details/122304202
1 概念
Canal是一款MySQL数据增量同步工具,基于数据库增量日志解析,提供增量数据实时订阅和消费.
2 原理
Canal把自己伪装成MySQL slave,模拟MySQL slave的交互协议向MySQL Mater发送 dump协议;MySQL mater 收到 Canal 发送过来的 dump 请求,开始推送 binary log 给 Canal,然后 Canal 解析binary log,再发送到存储目的地.
3 使用
3.1 安装
(1) 下载 canal-deployerGitHub:Canalhttps://github.com/alibaba/canal/releases
(2) 创建Canal目录: mkdir canal
(3) 解压:tar -xf canal.deployer-1.1.6.tar.gz -C /soft/canal/
3.2 同步数据到 Kafka
(1) 在 MySQL 中配置canal 账号
-- 创建cannal账号
create user 'canal'@'%' identified by 'canal';
-- 赋予账号权限
grant select,replication slave,replication client on *.* to 'canal'@'%';
-- 刷新设置
flush privileges;
(2) 在 Canal 中配置 MySQL 信息
canal/conf/example/instance.properties
# 修改ID
canal.instance.mysql.slaveId=0
canal.instance.master.address=ip:3306
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset=UTF-8
canal.mq.topic=student
(3) 在 Canal 中配置Kafka信息
canal/conf/canal.properties
canal.zkServers = node01:2181,node02:2181,node03:2181
canal.serverMode = kafka
kafka.bootstrap.servers = node01:6667,node03:6667
(4) 启动 Canal
启动 Canal :bin/startup.sh
Canal 服务日志:canal/logs/canal/canal.log
Canal 实例日志:canal/logs/example/example.log
(5) 启动 Zookeeper 和 Kafka,并监控 Kafka 中"canal_topic"的数据(不需要创建).
(6) 在MySQL中创建、修改、删除数据.
(7) 查看 Kafka监控
①Kafka数据:
[{
"data": null,
"database": "testdb",
"es": 1641278962000,
"id": 1,
"isDdl": false,
"mysqlType": null,
"old": null,
"pkNames": null,
"sql": "create database testdb",
"sqlType": null,
"table": "",
"ts": 1641278962857,
"type": "QUERY"
},
{
"data": null,
"database": "testdb",
"es": 1641278978000,
"id": 2,
"isDdl": true,
"mysqlType": null,
"old": null,
"pkNames": null,
"sql": "create table person(id int ,name varchar(255),age int)",
"sqlType": null,
"table": "person",
"ts": 1641278978622,
"type": "CREATE"
},
{
"data": [{
"id": "1",
"name": "zs",
"age": "18"
}, {
"id": "2",
"name": "ls",
"age": "19"
}, {
"id": "3",
"name": "ww",
"age": "20"
}],
"database": "testdb",
"es": 1641278984000,
"id": 3,
"isDdl": false,
"mysqlType": {
"id": "int",
"name": "varchar(255)",
"age": "int"
},
"old": null,
"pkNames": null,
"sql": "",
"sqlType": {
"id": 4,
"name": 12,
"age": 4
},
"table": "person",
"ts": 1641278985191,
"type": "INSERT"
}
]
②字段说明:
data:最新的数据,为JSON数组,如果是插入则表示最新插入的数据,如果是更新,则表示更新后的最新数据,如果是删除,则表示被删除的数据.
database:数据库名称.
es:事件时间,13位的时间戳.
id:事件操作的序列号,1,2,3…
isDdl:是否是DDL操作.
mysqlType:字段类型.
old:旧数据.
pkNames:主键名称.
sql:SQL语句.
sqlType:是经过canal转换处理的,比如unsigned int会被转化为Long,unsigned long会被转换为BigDecimal.
table:表名.
ts:日志时间.
type:操作类型,比如DELETE,UPDATE,INSERT.
4 问题
(1) 监控MySQL时报错:caching_sha2_password Auth failed
原因:创建用户时默认的密码加密方式为caching_sha2_password,需要修改为mysql_native_password
解决方案:
alter user 'canal'@'%' identified with mysql_native_password by 'canal';
flush privileges;
(2) 监控MySQL时报错:com.alibaba.otter.canal.parse.exception.CanalParseException: java.io.IOException: connect localhost/127.0.0.1:3306 failure
原因:Canal自带的mysql-connector-java.jar的版本为5.1,而MySQL数据库的版本为8.0.
解决方案:将 canal/lib 下的mysql-connector-java-5.1.48.jar 替换成 MySQL8对应的 mysql-connector-java.