canal:阿里巴巴的一款开源中间件,用于读取数据库binlog日志,实时发送给客户端。

问题:使用canal后运行一段时间,客户端一直轮询,但是batchId始终为-1,手动改动数据库数据后,仍然还是获取不到。

1.canal 服务读取出错了

检查canal日志关键是 logs\example下的,看是否由报错提示,如报错列不匹配,或者类型转换异常等,可能是你修改了表结构导致,直接配置tsdb数据库,然后删除meta.dat缓存即可。可参考上一篇文章

2.canal读取的binlog已被删除

这里首先要介绍 meta.data
位置位于 conf\example下

{"clientDatas":[{"clientIdentity":{"clientId":1001,"destination":"example","filter":".*\\..*"},"cursor":{"identity":{"slaveId":-1,"sourceAddress":{"address":"rm-m5epj85txc6175on5zo.mysql.rds.aliyuncs.com","port":3306}},"postion":{"gtid":"","included":false,"journalName":"mysql-bin.002943","position":151295060,"serverId":1430559368,"timestamp":1627023747000}}}],"destination":"example"}

这个主要是用来记录binlog读取位置的。
首先我们找到 journalName,对应的是master数据库binlog日志文件名。
position为读取到binlog的位置。
而数据库的binlog会随着运行越来越多,所以它会自动删除之前的binlog日志。

然后去数据库执行

show master logs

数据库binlog

log_name 则为现有的binlog日志,查找binlog是否和meta.dat里面记录的一致,若meta.data记录的binlog不在里面,则表示已被删除。
可将 journalName值改为现有的binlog日志,然后把position置为4

为什么canal读取的binlog会被删除呢
1.手动删除,服务器磁盘容易满,所以偶尔会有人手动删除binlog文件。

2.client端报错,客户端读取到canal发过来的数据后进行处理,若处理出错,程序在逻辑上没有ack此batchId,而是去反复执行,那么client端会一直执行此条batchId数据,此时后面数据会进入client,而在后面的batchid数据进来后会报canal的错误,batchId ***,大致意思就是执行的前面的batchId发现后面的batchid了,然后canal就卡在这了,不在读取后面的binlog,当后面的binlog被删除后,就和数据库的binlog对应不上了

首先要检查client端是否有报错,然后检查canal服务是否有报错,在检查binlog是否一致,若不一致再分析原因

GitHub 加速计划 / ca / canal
28.21 K
7.57 K
下载
alibaba/canal: Canal 是由阿里巴巴开源的分布式数据库同步系统,主要用于实现MySQL数据库的日志解析和实时增量数据订阅与消费,广泛应用于数据库变更消息的捕获、数据迁移、缓存更新等场景。
最近提交(Master分支:2 个月前 )
1e5b8a20 - 2 个月前
ff82fd65 2 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐