部署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

报错解决方法

  1. Could not find first log file name in binary log index file
    解决方案:停掉canal服务然后进到canal-server/conf/example/目录下,把meta.dat文件删掉,然后重启cannal
  2. CanalParseException: 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同步不会连续)。
posted @ 2023-02-15 18:08  君要上天么  阅读(417)  评论(0编辑  收藏  举报