canal是用java开发的基于数据库增量日志解析,提供增量数据订阅&消费的中间件。目前,canal主要支持了MySQL的binlog解析,解析完成后才利用canal client 用来处理获得的相关数据。
canal可以记录mysql的binlog的偏移量,对mysql侵入性比较小,支持灵活配置,可以配置输出的存储系统。
一、Canal工作原理
首先了解一下mysql主备复制原理:
(1)master主库将改变记录,发送到二进制文件(binary log)中
(2)slave从库向mysql Master发送dump协议,将master主库的binary log events拷贝到它的中继日志(relay log)
(3)slave从库读取并重做中继日志中的事件,将改变的数据同步到自己的数据库
canal的工作原理:把自己伪装成slave,从master复制数据。读取binlog是需要master授权的,因为binlog是加密的,授权分用户名密码才能读。master授权后不知道读他的binlog的是从机还是canal,他的所有传输协议都符合从机的标准,所以master一直以为是从机读的。
二、Canal安装
1、修改MySQL的配置
修改MySQL配置⽂件
vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin #添加这⼀⾏就ok
binlog-format=ROW #选择row模式
server_id=1 #配置mysql replaction需要定义,不能和canal的slaveId重复
重启mysql
service mysqld restart
在mysql中添加一个新的用户
CREATE USER canal IDENTIFIED BY 'canal123';
赋予权限
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
刷新权限
FLUSH PRIVILEGES;
创建⼀个数据库
CREATE DATABASE doit CHARSET utf8;
2、安装Canal
① 下载Cannal 1.1.4版本(canal.deployer-1.1.4.tar.gz)
https://github.com/alibaba/canal/releases
②上传到Canan到服务器上,然后解压
③修改canal的主配置⽂件canal.properties
#canal跟kafka整合,将数据发送到kafka
canal.serverMode = kafka
#指定kafka broker地址
canal.mq.servers = node-1.51doit.cn:9092,node-2.51doit.cn:9092,node-3.51doit.cn:9092
#数据发送kafka失败重试次数
canal.mq.retries = 10
④修改canal的实例配置⽂件example/instance.propertie
#mysql数据库的地址
canal.instance.master.address=127.0.0.1:3306
#mysql用户名
canal.instance.dbUsername=canal
#mysql密码
canal.instance.dbPassword=canal123
#注释掉使用默认的topic(将数据写入到默认的Topic)
#canal.mq.topic=example
# dynamic topic route by schema or table regex
#将doit的数据库的user表发送到kafka的user1的topic
canal.mq.dynamicTopic=topic1:db1\\.tb1,user1:doit\\.user
⑤启动Canal
bin/startup.sh
⑥ 启动Kafka客户端读取Kafka中的数据
/bigdata/kafka_2.12-2.4.1/bin/kafka-console-consumer.sh --bootstrap-server node-1.51doit.cn:9092,node-2.51doit.cn:9092,node-3.51doit.cn:9092 --topic topic1 --from-beginning