部署canal同步mysql-binlog到kafka具体操作(canal多数据源同步到kafka)
准备
[mysqld]
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
安装canal
cd canal
wget https://github.com/alibaba/canal/releases/download/canal-1.1.6/canal.deployer-1.1.6.tar.gz
tar -xvf canal.deployer-1.1.6.tar.gz
修改配置文件
vim /data/canal/conf/example/instance.properties
修改为数据源地址:
# position info
canal.instance.master.address=127.0.0.1:3306
# username/password
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
#过滤库表table regex
#所有库表:
canal.instance.filter.regex=.*\\..*
#只同步test库:
canal.instance.filter.regex=test\\..*
#只同步test库的t1 t2表
canal.instance.filter.regex=test.t1,test.t2
# mq config 修改topic名字
canal.mq.topic=canal_test
同步到kafka,修改相关配置项
vim /data/canal/conf/canal.properties
# tcp, kafka, rocketMQ, rabbitMQ, pulsarMQ
canal.serverMode = kafka
#kafka地址 注意直接写 addr:port 不要加引号 egg:192.168.0.1:9092,192.168.0.2:9092,192.168.0.3:9092
kafka.bootstrap.servers = xxx
同步多数据源到kafka
properties配置分为两部分:
canal.properties (系统根配置文件)
instance.properties (instance级别的配置文件,每个instance一份)
对应关系:
canal.properties中的配置canal.destinations后,要对应在canal.conf.dir目录下建立同名文件
比如: canal.destinations = example,mysql_test
要创建example和mysql_test两个目录,每个目录里各自有一份instance.properties. 内容可参考conf/example下的自带那个。
增加canal.properties如下配置:
######### destinations #############
#################################################
canal.destinations = example,mysql_test
docker版本安装方法:
提前准备好instance.properties和canal.properties配置文件并修改具体配置(参考如上配置),放到各自目录下
mkdir -p /data/canal/conf & /data/canal/conf/pro_mysql & /data/canal/logs
下载镜像(我的是v1.1.6)
docker pull canal/canal-server:v1.1.6
docker run --name canal -p 11111:11111 -d -v /data/canal/conf/pro_mysql/instance.properties:/home/admin/canal-server/conf/pro_mysql/instance.properties -v /data/canal/conf/canal.properties:/home/admin/canal-server/conf/canal.properties -v /data/canal/logs:/home/admin/canal-server/logs canal/canal-server:v1.1.6
也可以映射出整个目录
docker run --name canal -p 11111:11111 -d -v /data/canal/conf/pro_mysql:/home/admin/canal-server/conf/pro_mysql -v /data/canal/conf:/home/admin/canal-server/conf -v /data/canal/logs:/home/admin/canal-server/logs canal/canal-server:v1.1.6
报错解决方法
Could not find first log file name in binary log index file
解决方案:停掉canal服务然后进到canal-server/conf/example/目录下,把meta.dat文件删掉,然后重启cannalCanalParseException: parse row data failed. column size is not match for table:xx.xx,37 vs 36
默认开启tsdb功能,也就是会通过h2数据库缓存解析的表结构,但有时候,如果上游变更了表结构,h2数据库对应的缓存是不会更新的(旧版本)(我的新版本是1.1.6,手动复现并没有出现表结构不一致的情况,如果canal停止过一段时间重新启动时候,最好删除$CANAL_HOME/conf/example/h2.mv.db文件和beta文件再重新启动),该异常还会导致一个严重的后果:解析线程被阻塞,也就是binlog事件不会再接收和解析。
解决方案:要先停止Canal服务,接着删除$CANAL_HOME/conf/目标数据库实例标识/h2.mv.db文件,然后启动Canal服务(注意做好meta文件的备份,重新启动后binlog同步不会连续)。