Canal配置监控mysql数据变化并将数据传输到kafka (mysql -> canal -> kafka
零.前提条件是有安装Zookeeper(zookeeper集群)和kafka(集群)
1.修改MySQL的配置
1.1修改Mysql配置文件
vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin #添加这⼀⾏就ok
binlog-format=ROW #选择row模式
server_id=1 #配置mysql replaction需要定义,不能和canal的slaveId重复
1.2重启MySQL
service mysqld restart
1.3在mysql中添加一个新的用户
#先设置密码安全级别,看1.3.2
1.3.1CREATE USER canal IDENTIFIED BY 'canal123';
#1.3.2可选:如果因为数据库的安全级别对密码要求比较高,无法正常创建用户,需要修改安全策略和密码策略在添加用户(生产环境不用修改,要使用复杂的密码)
set global validate_password_policy=LOW;
set global validate_password_length=6;
1.4赋予权限
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON . TO ‘canal’@‘%’;
1.5刷新权限
FLUSH PRIVILEGES;
1.6创建⼀个数据库
CREATE DATABASE db CHARSET utf8;
2.安装Canal
2.1下载Cannal 1.1.6版本(canal.deployer-1.1.6.tar.gz)
https://github.com/alibaba/canal/releases/tag/canal-1.1.6
2.2上传到Canan到服务器上,然后解压
注意:Canal可以与MySQL安装在同一台服务器,也可以在同一台服务器,这里是和MySQL安装在同一台服务器上。
mkdir -p /usr/local/canal
cp canal.deployer-1.1.6.tar.gz /usr/local/canal
tar -zxvf canal.deployer-1.1.6.tar.gz
2.3 配置修改参数
修改instance 配置文件 vi conf/example/instance.properties
# 按需修改成自己的数据库信息
#################################################
...
canal.instance.master.address=192.168.1.20:3306
# username/password,数据库的用户名和密码
...
canal.instance.dbUsername = canal
canal.instance.dbPassword = canal
...
# mq config
canal.mq.topic=example
# 针对库名或者表名发送动态topic
# 注意:如果开启dynamicTopic,动态传输数据也要保留canal.mq.topic=example,当然example的名字可以改成其他的
#canal.mq.dynamicTopic=mytest,.*,mytest.user,mytest\\..*,.*\\..*
#例如canal.mq.dynamicTopic=topic1:db1\\.tb1,user1:doit\\.user表示的就是
#将mysql数据库 db1中的tb1表的数据传输到kafka的topic1当中
canal.mq.partition=0
# hash partition config
#canal.mq.partitionsNum=3
#库名.表名: 唯一主键,多个表之间用逗号分隔
#canal.mq.partitionHash=mytest.person:id,mytest.role:id
#################################################
2.4修改canal 配置文件vi /usr/local/canal/conf/canal.properties
# ...
# 可选项: tcp(默认), kafka,RocketMQ,rabbitmq,pulsarmq
canal.serverMode = kafka
# ...
# Canal的batch size, 默认50K, 由于kafka最大消息体限制请勿超过1M(900K以下)
canal.mq.canalBatchSize = 50
# Canal get数据的超时时间, 单位: 毫秒, 空为不限超时
canal.mq.canalGetTimeout = 100
# 是否为flat json格式对象
canal.mq.flatMessage = false