Canal实时读取mysql变化,并把消息投递到rocketmq
修改mysql配置
ps:mysql在docker中启动
进入容器:
docker exec -it 容器名 bash
cd etc/mysql
下载vim
apt-get update
apt-get install vim
在mysql的conf.d文件夹中的docker.cnf中修改配置
vim conf.d/docker.cnf
添加
[mysqld]
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
进入mysql
mysql -uroot -p
创建用户
CREATE USER canal IDENTIFIED BY 'canal';
//查询和主从同步权限
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
//授予super权限
GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;
部署和配置canal
配置instance.properties
canal.instance.mysql.slaveId=1235
canal.instance.master.address=192.168.*
canal.instance.dbUsername=root
canal.instance.dbPassword=123456
#同步哪些表
canal.instance.filter.regex=.*\\..*
# 过滤哪些表
canal.instance.filter.black.regex=mysql\..*
配置canal.properties
#多核cpu此处大于2
canal.instance.parser.parallelThreadSize = 20
启动bin/startup.sh
部署和配置rocketmq
在配置文件中添加添加java_Home
#启动namesrv
/Users/js/Downloads/rocketmq-all-4.7.0-bin-release/bin/mqnamesrv
#启动broker
/Users/js/Downloads/rocketmq-all-4.7.0-bin-release/bin/mqbroker -n 192.168.205.34:9876 autoCreateTopicEnable=true
验证roketmq是否启动正常:我的另一篇文章rocketmq整合Springboot
或者直接把canal的消息投递到rocketmq
canal整合rocketmq
修改canal.properties
canal.serverMode = RocketMQ
canal.mq.servers = 192.168.*.*:9876
#生产者组
canal.mq.producerGroup = test
下载canal项目中的example模块,导入到自己项目再导入相关依赖
项目地址:https://github.com/alibaba/canal/blob/master/example/src/main/java/com/alibaba/otter/canal/example
修改AbstractRocektMQTest 里面的配置然后启动项目
修改数据库后如果控制台打印出改变的数据即整合成功
遇到的问题:
1.canal连接mysql出现:example.log ERROR com.alibaba.otter.canal.common.alarm.LogAlarmHandler - destination:example[com.alibaba.otter.canal.parse.exception.CanalParseException: java.io.IOException: connect /192.168.205.34:3306 failure
网上的说法是将服务端配置文件canal.properties 中的并行线程数关掉即可,单例单线程运行。不适用我的情况,
反复修改配置文件无效,最后发现是开了代理导致的
参考文章: