V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
BadCat
V2EX  ›  程序员

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

  •  
  •   BadCat · 2021-09-10 16:49:02 +08:00 · 2242 次点击
    这是一个创建于 1198 天前的主题,其中的信息可能已经有所发展或是发生改变。

    不知道有多少人用过 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 来同步。郁闷死了

    第 1 条附言  ·  2021-09-15 16:08:10 +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,没有条件一定要区分开端口,到目前我认为这个可能性最大。
    15 条回复    2021-09-15 16:07:00 +08:00
    ChrisFreeMan
        1
    ChrisFreeMan  
       2021-09-10 17:12:58 +08:00
    求头像出处
    joApioVVx4M4X6Rf
        2
    joApioVVx4M4X6Rf  
       2021-09-10 17:16:11 +08:00
    求头像出处
    PeterYang1996
        3
    PeterYang1996  
       2021-09-10 17:17:09 +08:00
    头像不错
    joApioVVx4M4X6Rf
        4
    joApioVVx4M4X6Rf  
       2021-09-10 17:17:34 +08:00
    你这个不是 autocommit 吧?得 commit 一下才会有 log ?
    BadCat
        5
    BadCat  
    OP
       2021-09-10 17:21:09 +08:00
    @v2exblog 不会,默认提交是开启的
    BadCat
        6
    BadCat  
    OP
       2021-09-10 17:34:55 +08:00
    在想会不会是 mysql 锁的问题,但是也经不起推敲,canal 是监控 log,不是监控数据
    shanghai1943
        7
    shanghai1943  
       2021-09-10 17:37:00 +08:00
    binlog 没开?
    pkoukk
        8
    pkoukk  
       2021-09-10 17:38:26 +08:00
    实际内容没变?
    jiezhi
        9
    jiezhi  
       2021-09-10 17:40:12 +08:00
    自己先在 mysql 里看下 binlog 情况呢,确定 mysql binlog 没问题再排查 canal 的问题
    BadCat
        10
    BadCat  
    OP
       2021-09-10 18:04:28 +08:00
    @shanghai1943
    @jiezhi
    可能我前面没表达清楚,我仔细说一下。

    正常情况下 canal 是可以订阅到 mysql 数据变化情况的。但闲置个 5 、6 分钟再做新增修改或删除会有订阅不到数据变化的情况。所以我一开始猜测会不会是 mysql 的空闲时间导致连接断掉,sql 没有执行成功,所以 canal 没有消息返回。但我去看了下配置,给的 wait_timeout 时间有 480 分钟,足够了。而且这个情况直碰到了几次,很难复现
    BadCat
        11
    BadCat  
    OP
       2021-09-10 18:06:21 +08:00
    @pkoukk 内容变了,general_log 也看到了 sql,也返回了 1 row affected
    BadCat
        12
    BadCat  
    OP
       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
        13
    jiezhi  
       2021-09-10 18:30:58 +08:00
    @BadCat #10 确保该条消息 mysql 有 binlog 出来的话,建议 canal log 调成 debug 模式看看
    BadCat
        14
    BadCat  
    OP
       2021-09-10 21:04:45 +08:00
    @jiezhi 在家里 debug 一晚上,程序运行正常,问题复现不出来,现在猜测是还公司的 mysql 有问题。周一回去搞台新机器再看吧
    BadCat
        15
    BadCat  
    OP
       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,没有条件一定要区分开端口,到目前我认为这个可能性最大。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1107 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:52 · PVG 02:52 · LAX 10:52 · JFK 13:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.