数据同步_Canal

0 参考列表

CSDN:canal简介及canal部署、原理和使用介绍icon-default.png?t=O83Ahttps://blog.csdn.net/wt334502157/article/details/119763273

CSDN:使用Canal同步MySQL数据到Kafkaicon-default.png?t=O83Ahttps://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:Canalicon-default.png?t=O83Ahttps://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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值