如何进行Canal binlog日志的Dump流程分析

发布时间:2021-11-17 15:33:41 作者:柒染
来源:亿速云 阅读:104

这篇文章将为大家详细讲解有关如何进行Canal binlog日志的Dump流程分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

Canal 的 dump 支持串行和并行模式两种模式,本篇重点梳理 dump 的核心流程,以便对 dump 过程有一个充分的了解,更好的理解 Canal 的实现原理与细节,下一篇中将重点关注Canal是如何引入并行模式来提高dump的性能,即并行编程相关的技巧。

从前面的文章我们得知 Canal binlog 日志解析的基本流程如下图所示:

如何进行Canal binlog日志的Dump流程分析  
在这里插入图片描述

解析来重点梳理一下 dump 命令的发送逻辑,特别是日志的处理流程,一些基本的日志格式。    

1、 dump 流程分析


在 Canal 中 dump 方法声明如下:

如何进行Canal binlog日志的Dump流程分析  
带有参数 MultiStageCoprocessor 为并行处理模式,底层使用了disruptor 高性能并发框架,下文将重点关注学习。 我们今天重点来看一下串行dump的实现,其方法声明如下:
 
如何进行Canal binlog日志的Dump流程分析  
在这里插入图片描述
其方法参数说明如下:

接下来我们直奔主题,一起来看一下 MysqlConnection 关于 dump 的实现流程。

如何进行Canal binlog日志的Dump流程分析  
MysqlConnection#dump

Step1:在发送dump之前先设置相关的参数。

上面粗略的介绍了 dump 命令的几个核心关键步骤,要想详细掌握其实现细节,我们必须继续深入探讨如下几个问题:

 

2、DirectLogFetcher 内部工作机制


 
2.1 DirectLogFetcher 类图
如何进行Canal binlog日志的Dump流程分析  
DirectLogFetcher的类继承体系如上图所示,我们来看一下其关键点:  
 
2.2 fetch流程详解

接下来我们重点剖析 DirectLogFetcher 的 fetch 方法,来探究其实现原理。
在研究DirectLogFetcher的fetch方法之前,我们先重点跟踪一下其内部网络读写方法fetch0方法,该方法是具体与网络读写相关的实现。

如何进行Canal binlog日志的Dump流程分析  
DirectLogFetcher#fetch0

在详细介绍该方法之前先来介绍一下其参数的含义:

该方法的实现关键点如下:

接下来我们来重点看一下DirectLogFetcher的fetch的实现流程。

如何进行Canal binlog日志的Dump流程分析  
DirectLogFetcher#fetch

Step1:尝试从网络通道中读取4个字节(即读取协议的头部),如果通道中还没有可读取内容,返回false,造成的效果是一次 dump 请求结束。  
 
如何进行Canal binlog日志的Dump流程分析  
DirectLogFetcher#fetch

Step2:从上文读到的4个字节分别读出该网络包的总长度以及当前包的序号,从这里可以看成MySQL协议头为4字节,前3个字节为网络包的总长度,第4个字节为包的序列号。再取出数据包的长度后,继续向通道中读取netlen个字节,即读取一个完整的数据包到buffer中。  
 
如何进行Canal binlog日志的Dump流程分析  
DirectLogFetcher#fetch

Step3:继续从数据包中读取一个字节,判断该包的状态码,是否是一个成功的响应,如果是错误的响应,会向外抛出一次,Canal 会记录dump命令执行错误的次数。  
 
如何进行Canal binlog日志的Dump流程分析  
DirectLogFetcher#fetch

Step4:如果一个包的长度为允许的最大包长度,则继续读取,这个主要是根据MySQL协议做的处理,即读取到一个数据包,然后返回true,表示拉取到一条日志,然后通过LogDecoder解码,然后传入到sink方法中,进行日志的后续处理。  
 
如何进行Canal binlog日志的Dump流程分析  
DirectLogFetcher#fetch

Step5:这一步的目的,就是将buffer中的当前指针指向数据的开始位置。这样一次 fetch就结束了。

从上面的流程来看,DirectLogFetcher#fetch 方法结束后,就将进入到LogDecoder中。经过一次DirectLogFetcher#fetch方法后,即取回一条binlog日志,即二进制流,接下来就根据binlog协议对其解析。本文暂不深入该方法,如果大家想深入数据库中间件方面,可以作为一个很好的示例,面向MySQL通信协议进行编程。

 

3、SinkFunction


通过 LogDecoder从中解析一个事件后,会调用SinkFunction的sink方法,如果该方法返回 false,一次dump请求将介绍,接下来我们看一下其sink方法。

如何进行Canal binlog日志的Dump流程分析  
AbstractEventParser#start

该方法的实现比较简单,这里不打算继续深入,我们重点来看一下 Canal.Entry 的结构:  
 
如何进行Canal binlog日志的Dump流程分析  
在这里插入图片描述

这个结构是基于Canal做架构设计,解决顺序消费、数据不丢失一个重要参考依据,没解析一条事务,最终放入到环形缓存区,环形缓存区尽量以一个事务提交到Sink组件,其代码如下:  
 
如何进行Canal binlog日志的Dump流程分析  
在这里插入图片描述

这里主要有如下几个关键点:

关于如何进行Canal binlog日志的Dump流程分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

推荐阅读:
  1. MySQL的binlog日志工具分析Canal的使用方法
  2. canal如何实现mysql的数据同步

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

dump canal binlog

上一篇:web前端图片延迟加载举例分析

下一篇:jquery如何获取tr里面有几个td

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》