概要
canal在基于Mysql做binlog日志的消费时,经常会遇到的问题是canal正在消费的节点和Mysql节点不一致。有时候还出现因为数据库操作原因导致的数据重复消费或者数据批量修改导致的canal数据消费延迟等情况。这时候就需要根据具体的业务需求去调整canal的消费节点。本文将给出修改消费节点的操作方法。
技术名词解释
canal:canal [kə’næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。
早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。
基于日志增量订阅和消费的业务包括:
- 数据库镜像
- 数据库实时备份
- 索引构建和实时维护(拆分异构索引、倒排索引等)
- 业务 cache 刷新
- 带业务逻辑的增量数据处理
canal详细介绍及源码请查看官方文档:https://github.com/alibaba/canal
技术细节
- 首先通过mysql节点查询当前binlog日志位置:
show master status;
查询结果:
File:正在写入日志的binlog日志文件名称
Position:当前写入到日志文件的字节位置
- 在canal服务中查询消息队列正在消费的日志节点信息
不管是什么环境部署的canal服务,先找到服务canal-server文件夹位置,进入/conf目录下;
再根据消息队列配置目录进入需要修改的消息队列目录内就可以看到一下几个文件:
h2.mv.db 这个文件用于缓存数据库结构
meta.dat 这个文件是用于存储canal读取mysql中binlog的偏移量,存储的是json格式
instance.properties 主要配置binlog日志文件名称和点位positon
双击打开meta.dat 就可以查看当前正在消费的日志文件名称和偏移量信息,即下图中的journalName和position两个值。
- 如何修改canal消费的日志节点位置呢?
- 确定我们需要canal读取的日直接点位置,通过mysql中执行show master status;或者查看mysql服务data目录下的日志文件生成时间,根据具体需求确认节点位置,即日志文件名称一般默认是 mysql-bin.XXXX 和偏移量位置等两个信息。
- 停止canal服务
- 进入canal服务配置文件目录找到h2.mv.db 和 meta.dat 直接删除,基于安全考虑复制一份做个备份。
- 打开instance.properties配置文件,找到canal.instance.master.journal.name和canal.instance.master.position,分别把MySQL数据库获取的日志文件名称和偏移量写进去保存,重启canal服务。
- 重启后canal服务会在conf目录下生成新的meta.dat和h2.mv.db,打开meta.dat可以看到当前正在读取的MySQL节点位置,可以确认日志节点是否修改成功。
小结
canal是基于MySQL做增量数据同步的好工具,以上操作可能会导致丢失或重复消费MySQL产生的数据从而给下游业务造成影响,请确认好风险并做好应急准备后再操作生产服务。