修改Canal的消费位点指南

 日常的使用中,当使用 ZooKeeper 作为高可用方案时,因某些原因需要重新采集数据,只要目标库中的 binlog 文件依旧存在,那么就能够将 Canal 的解析位置重新定位,从指定的位置开始解析。
 Canal 默认在 ZooKeeper 中存储的节点为:

/otter/canal

一、停止 Canal 服务

 在有数据被消费时,客户端的每次 Ack 都会使得服务端用本地缓存的位点信息去覆盖 ZooKeeper 上的位点,所以在修改 ZooKeeper 的位点之前,应先避免其不再被覆盖,即停止 Canal 服务。

亦可停止该 instance 对应的消费端程序,则不会再触发服务端使用缓存中的位点信息去覆盖 ZooKeeper 中的信息。

二、获取位点信息

 停止服务后,可通过 zkCli.shZooInspectorzkui 等工具连接到相应的 ZooKeeper 服务器上,并获取到当前的位点信息。
 默认情况下,位点信息存储在下述节点中:

/otter/canal/destinations/${destination}/1001/cursor

注意:请将 ${destination} 替换成预期的 instance 名称。

若 ZooKeeper 中并无 …/1001/cursor 节点,则表明该 instance 从未被消费过,可通过启动一次对应的消费者,以生成该位点信息,但记得生成位点信息后要将其停止。

 本文仅以 zkCli.sh 方式示例如何获取名为 “example” 的 instance 的位点信息:

get /otter/canal/destinations/example/1001/cursor

 获取到的位点信息结果为:

{"@type":"com.alibaba.otter.canal.protocol.position.LogPosition","identity":{"slaveId":-1,"sourceAddress":{"address":"localhost","port":3306}},"postion":{"gtid":"","included":false,"journalName":"mysql-bin.000010","position":210013,"serverId":1,"timestamp":1590112037000}}

 从上述的结果可看出,位点信息是用 json 格式的字符串进行存储的,里面存放了许多信息,我们仅需要变更journalName”和“position”两个属性值,分别对应当前的 binlog 文件名以及该文件内的具体位置。

三、查询数据库位点

 我们既然已经确定了变更位点需要哪些信息,那么又如何获得预期的位点信息呢?这就需要视需求而定了,其实,一般来变更位点都是往当前位置的前面调整,再次采集已同步过的数据。本文仅给出如何在 MySQL 中通过 SQL 语句查询 binlog 的位点信息示例:

  1. 查询 binlog 文件

    show binary logs
    

     上述命令用于列出该 MySQL 服务当前有效的二进制日志文件信息,具体输出内容如下:

    Log_nameFile_size
    mysql-bin.00000152302
    mysql-bin.00000216902
    mysql-bin.00000349094
    mysql-bin.000004130772
    mysql-bin.0000053492

     此处的输出结果仅为 binlog 文件名称和大小,该如何确定具体的该使用哪个文件的哪个位置呢?请稍安勿躁,此步骤仅是为了下一步作铺垫。

  2. 查询 binlog 事件
     binary log,顾名思义就是二进制日志文件,里面存放的信息无法直接被展示出来,但我们可以通过 MySQL 的 SQL 语句将其解析成对应的事件,通过判断事件来找出对应的位点信息。
     用于查询 binlog 事件的 SQL 语法如下:

    show binlog events [in 'binlog_name'] [from pos] [limit [offset,] row_count]
    

    在查询 binlog 事件时,强烈建议尽可能多地增加限制结果集大小的条件,以降低对 MySQL 的性能损耗,这就是有1. 查询 binlog 文件步骤的原因,为此步骤提供信息。

     下述示例表示列出名为“mysql-bin.000008”的文件内从第 4 个位点开始往后的 5 条记录。

    show binlog events in 'mysql-bin.000008' from 4 limit 5
    

     输出的结果为:

    Log_namePosEvent_TypeServer_idEnd_log_posInfo
    mysql-bin.0000084Format_desc1123Server ver: 5.7.27-log, Binlog ver: 4
    mysql-bin.000008123Previous_gtids1154
    mysql-bin.000008154Anonymous_Gtid1219SET @@SESSION.GTID_NEXT= ‘ANONYMOUS’
    mysql-bin.000008219Query1292BEGIN
    mysql-bin.000008292Table_map1351table_id: 109 (test2.user_info)

    当前仅能通过判断具体的事件,来确定对应的位点值(Pos)。

四、变更位点信息

 假设我们需要的目标位点信息是:名为 mysql-bin.000008 的日志文件内位点值为 4。那么通过 zkCli.sh 的 set 方法进行变更,示例如下:

set /otter/canal/destinations/example/1001/cursor {"@type":"com.alibaba.otter.canal.protocol.position.LogPosition","identity":{"slaveId":-1,"sourceAddress":{"address":"localhost","port":3306}},"postion":{"gtid":"","included":false,"journalName":"mysql-bin.000008","position":4,"serverId":1,"timestamp":1590112037000}}

注意:节点名与节点值之间使用一个半角空格进行分隔。

五、启动 Canal 服务

 启动 Canal 服务端,以使新的位点生效。

如果之前通过停止消费端的方式来消除位点被覆盖,那么此时就需要通过重启 Canal 服务端将 ZooKeeper 上新的位点信息去覆盖 Canal 服务端缓存中的信息。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值