程序猿的进阶屋canal

canal+kafka,canal.instance.filte

2020-10-22  本文已影响0人  和所有的烦恼说拜拜

问题描述:

       canal+kafka+mysql 的方式进行数据同步,instance.properties中配置的过滤器不生效canal.instance.filter.regex ,所有表的改动都会向kafka发送消息

问题分析:

1. canal的问题:配置不正确,版本bug等

2. mysql的binlog的问题:canal不能正确解析binlog中的表名。

参照官方常见问题中的解决方案,一项一项的进行比对。

1. 过滤器正则表达式是否正确

    1. All the tables: .* or .*\\..*

    2. All the tables in canal scheme: canal\\..*

    3. Tables starting with canal in canal scheme: canal\\.canal.*

    4. Access a table in canal scheme: canal.test1

2. mysql配置

    [mysqld]  

    log-bin=mysql-bin #添加这一行就ok 

    binlog-format=ROW #选择row模式 

    server_id=1 #配置mysql replaction需要定义,不能和canal的slaveId重复 

3. (因为我是canal直接发kafka略过这条)检查CanalConnectors是否调用了subscription(filter)方法。如果是这样,则过滤器应与instance.properties中的canal.instance.filter.regex一致,否则订阅过滤器将覆盖实例中的设置。请注意,如果用于订阅的过滤器是。* / .. *,则您已消耗了所有更新的数据。

4. 看instance的启动日志中,过滤器是否设置正确

日志目录/canal目录/logs/example/example.log

c.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert - --> init table filter :^.*\..*$

c.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert - --> init table black filter :

以上都检查之后,问题还是没有解决。

之前在其他环境部署过canal ,这个环境的过滤器是好用的,随后比较两个环境canal的配置文件,并下载最新的canal1.1.5,重新配置canal,还是不行。把其他环境的canal修改配置拿过来运行还是不行。所以感觉不是不是canal的配置问题,把注意力转移到mysql的binlog上,比较两个环境mysql产生binlog文件的内容,发现一个binlog中有执行的sql,一个没有执行的sql,有执行sql的环境,canal过滤器不起作用。

随后修改mysql的配置文件/etc/my.cnf  将binlog中的sql去掉,问题解决!

binlog中的sql可能影响了canal对binlog中表名的解析。

上一篇下一篇

猜你喜欢

热点阅读