开发者社区 问答 正文

canal postion重置问题

上一次成功的ack日志: [ batchId: 906915, position: PositionRange[ start=LogPosition[ identity=LogIdentity[ sourceAddress=192.168.10.180/192.168.10.180: 3306, slaveId=-1 ], postion=EntryPosition[ included=false, journalName=mysql-bin.000940, position=150869837, serverId=180, timestamp=1505671087000 ] ], ack=, end=LogPosition[ identity=LogIdentity[ sourceAddress=192.168.10.180/192.168.10.180: 3306, slaveId=-1 ], postion=EntryPosition[ included=false, journalName=mysql-bin.000940, position=151977852, serverId=180, timestamp=1505671093000 ] ] ] ]

rollback失败的ack日志: e[ start=LogPosition[ identity=LogIdentity[ sourceAddress=192.168.10.180/192.168.10.180: 3306, slaveId=-1 ], postion=EntryPosition[ included=false, journalName=mysql-bin.000940, position=151979096, serverId=180, timestamp=1505671093000 ] ], ack=LogPosition[ identity=LogIdentity[ sourceAddress=192.168.10.180/192.168.10.180: 3306, slaveId=-1 ], postion=EntryPosition[ included=false, journalName=mysql-bin.000940, position=138659218, serverId=180, timestamp=1505670995000 ] ], end=LogPosition[ identity=LogIdentity[ sourceAddress=192.168.10.180/192.168.10.180: 3306, slaveId=-1 ], postion=EntryPosition[ included=false, journalName=mysql-bin.000940, position=138740531, serverId=180, timestamp=1505670996000 ] ] ]

我们对比两次的日志,发现ack节点的内容发生了变化,正常情况下,ack的值是null。但是异常情况下,附带了信息,且position的位置比start 和 end节点的都要靠前,不知道为什么出现这种情况。线上环境已经遇到很多次了。因为position变更,数据就会重复,主键冲突无法insert操作,都是手动修改的。 目前我们的解决办法是:

1、比对zk的position是否是最新的,如果是的话就重启server,之后可以正常读取

2、如果zk的position也是之前的位点,只能手动修改zk的postion为最新的位点来解决。

到目前为止都没有找到具体的原因,也不知道什么什么引起的。 我们是多个instance的方式部署。jdk 1.7

原提问者GitHub用户ghost

展开
收起
绿子直子 2023-05-09 12:02:21 129 分享 版权
1 条回答
写回答
取消 提交回答
  • canal parser在主备切换或者链接断开时就会有重复消费,导致位点回溯,重复是难免的

    原回答者GitHub用户agapple

    2023-05-10 10:28:00
    赞同 展开评论