canal 监听数据库会有订阅不到数据变化的情况

2021-09-10 16:49:02 +08:00
 BadCat

不知道有多少人用过 canal 碰巧也遇到过这个奇葩问题

今天做了一天的测试,这个问题遇到的次数不算多,只有 4 次。

怎么触发的都不清楚,log 也看不出来什么问题。包括阿里给的 demo 也有这个问题

手动执行 update sql

mysql> update hello set context='testtest' where id=1;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

然而 canal 监控不到,控制台什么都没输出,甚至是 canal 的 log 里啥有用的信息都没 一开始猜的的是 mysql 空闲时间导致的数据库断连,执行 sql 主库日志并不会有变化,所以 canal 没有监控到主库日志的消费变化,后来发现空闲时间是 480 分钟,并不符合猜想。github 上看了半天工单也没找到类似的问题。

现在生产环境不敢上,还得用老一套的 trigger 来同步。郁闷死了

2012 次点击
所在节点    程序员
15 条回复
ChrisFreeMan
2021-09-10 17:12:58 +08:00
求头像出处
0x0208v0
2021-09-10 17:16:11 +08:00
求头像出处
PeterYang1996
2021-09-10 17:17:09 +08:00
头像不错
0x0208v0
2021-09-10 17:17:34 +08:00
你这个不是 autocommit 吧?得 commit 一下才会有 log ?
BadCat
2021-09-10 17:21:09 +08:00
@v2exblog 不会,默认提交是开启的
BadCat
2021-09-10 17:34:55 +08:00
在想会不会是 mysql 锁的问题,但是也经不起推敲,canal 是监控 log,不是监控数据
shanghai1943
2021-09-10 17:37:00 +08:00
binlog 没开?
pkoukk
2021-09-10 17:38:26 +08:00
实际内容没变?
jiezhi
2021-09-10 17:40:12 +08:00
自己先在 mysql 里看下 binlog 情况呢,确定 mysql binlog 没问题再排查 canal 的问题
BadCat
2021-09-10 18:04:28 +08:00
@shanghai1943
@jiezhi
可能我前面没表达清楚,我仔细说一下。

正常情况下 canal 是可以订阅到 mysql 数据变化情况的。但闲置个 5 、6 分钟再做新增修改或删除会有订阅不到数据变化的情况。所以我一开始猜测会不会是 mysql 的空闲时间导致连接断掉,sql 没有执行成功,所以 canal 没有消息返回。但我去看了下配置,给的 wait_timeout 时间有 480 分钟,足够了。而且这个情况直碰到了几次,很难复现
BadCat
2021-09-10 18:06:21 +08:00
@pkoukk 内容变了,general_log 也看到了 sql,也返回了 1 row affected
BadCat
2021-09-10 18:11:44 +08:00
general_log
2021-09-10T09:11:36.830419Z 6 Query update hello set context='testtest' where id=1

meta.log
2021-09-10 17:11:37.699 - clientId:1001 cursor:[mysql-bin.000005,1613,1631265096000,1,] address[activate.navicat.com/127.0.0.1:3306]

log 中看不到问题,但 canal 中没有产生订阅消息。
再执行一次 sql,canal 就会监控到信息并输出
jiezhi
2021-09-10 18:30:58 +08:00
@BadCat #10 确保该条消息 mysql 有 binlog 出来的话,建议 canal log 调成 debug 模式看看
BadCat
2021-09-10 21:04:45 +08:00
@jiezhi 在家里 debug 一晚上,程序运行正常,问题复现不出来,现在猜测是还公司的 mysql 有问题。周一回去搞台新机器再看吧
BadCat
2021-09-15 16:07:00 +08:00
**这几天一直在测试,但始终无法复现上周五出现的情况**

虽然问题没复现出来,但这几天 dbug 下来猜测出几种情况,给后来的同学做个参考
- 动态 ip 。
- 使用 canal admin 停启服务。demo 本身运行两天没有问题,直到我加了 canal admin 管理服务,停启几次后出现了这个问题。但是最近的测试没有复现出来。所以 canal admin 出现的问题不太大。
- journal.name=mysql-bin.000001 。可能是因为我配置了指定的 binlog 文件,当 mysql 产生新的 binlog 文件 canal 没法监控到?
- wsl 的 MySQL 于 Windows 的 MySQL 冲突。很简单,修改 bind-address 就可以用 localhost/127.0.0.1 随便连 wsl 或 win 的数据库。这个我要重点说一下,我的代码是运行在 win 下,canal 服务和数据库是部署在 wsl 下,周五的具体情况记不清了,两个系统下的 mysql 服务一会 stop,一会 start,最后 canal 连的是哪个环境下的 MySQL 我都记不清了。我现在只用 win 下面的 mysql,包括 canal 也是用.bat 启动,没有出现周五的情况。有条件直接上独立 linux,没有条件一定要区分开端口,到目前我认为这个可能性最大。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/801093

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX