binlog以及Canal的知识有哪些

发布时间:2022-01-04 17:42:36 作者:柒染
来源:亿速云 阅读:215

本篇文章给大家分享的是有关binlog以及Canal的知识有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

背景

不知道是否你还在为下面的问题而困扰:

这些问题相信在很多同学的业务当中应该都遇到过,也可能因为这些问题常常增加了很多的工作量或者导致一些数据不一致的故障。那么我们怎么才能比较简单的解决这些问题呢?

我们想一想这个问题的本质是什么呢?就是需要保证我们的数据不论在redis还是在es都要和我们的mysql一致,本质上是数据的复制。一想到数据的复制,熟悉Mysql的朋友就会说到:Mysql的主备不也是数据复制吗?如果我们模仿Mysql的主备复制,那我们数据同步那么就会很容易了。

Mysql主从

既然我们可以模仿Mysql的主从复制来完成我们的需求,那么我们需要先了解一下mysql主从的原理,如下图所示: binlog以及Canal的知识有哪些

在主从复制中过程中,其中最为重要的就是binlog,从库会根据binlog的信息从而来复制出一份主库的数据。

如果我们能在业务代码中拿到binlog,通过binlog的数据,复制到redis或者es中,那我们就完全不用担心数据的一致性的问题了。

binlog

binlog(Binary Log)顾名思义就是Mysql中二进制的日志,记录了Mysql对数据库执行更改的所有操作。binlog也是server层产生的日志和我们的存储引擎没有关系,不论你使用哪种存储引擎,都可以使用我们的binlog。

binlog格式

在binlog中有三种格式,分别是:StatementRow, Mixed三种,可以通过show variables like 'binlog_format'进行查看当前数据库的binlog格式,如下图所示就是一个Row格式的binlog: binlog以及Canal的知识有哪些

Statement

Statement也就是语句类型,他会记录每一条修改数据的Sql到binlog中。

binlog以及Canal的知识有哪些

然后再使用命令show binlog events in 'mysql-bin.000003', 查看这个日志中的内容是什么: binlog以及Canal的知识有哪些 我们可以发现我们所有的操作都会在一个完整的事务中进行,如果事务没有提交是不会出现在我们的binlog当中的,这个大家可以下来进行实验一下,我们在数据库中的更新原始sql都会被完全的记录下来。

Row

Row模式和Statement不同,他会记录每一行被修改后的所有的数据:

同样的我们也查看一下其中的内容: binlog以及Canal的知识有哪些

show binlog events in 'mysql-bin.000004'命令中,我们发现在事务中是查看不了我们具体的数据的,这个时候就需要我们工具帮忙了mysqlbinlog,他也在mysql的bin目录下我们直接调用就好了,输入命令/usr/local/mysql/bin/mysqlbinlog --base64-output=decode-rows -v mysql-bin.000004,我们可以看见: binlog以及Canal的知识有哪些

这里展示的是一个update语句,他不仅显示了原始值,也展示了修改后的值。

这里要注意的是binlog_row_image用于决定row是否会记录原始值,默认是FULL代表会记录,也就是我们上面的这种情况,还有个参数是minimal,代表只记录更新后的值。

Mixed

在mixed模式下,MySQL默认仍然采用statement格式进行记录,但是一旦它判断可能会有数据不一致的情况(UUID函数)发生,则会采用row格式来记录。

我们目前默认使用的是Row模式,在Row模式下可以比较方便的将数据异构,其实Row模式对I/O影响在业务当中来说感知并不是特别明显。

Canal

当我们知道binlog是什么之后,我们就需要怎么去使用这个binlog。binlog的同步工具常见的有:databus,canal,maxwell,阿里云dts等等,在这里我们就不比较他们各自的优劣点了,重点去介绍canal。

canal(github地址:https://github.com/alibaba/canal),译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费

早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。后面在阿里云中逐渐演化称DTS项目。

binlog以及Canal的知识有哪些

canal大体原理也是模仿mysql的slave,从master上不断的去拉取binlog,然后将binlog可以投放到不同的地方,比如我们常见的消息队列:kafka,rocketmq等等。当然在阿里云的付费dts上面也是可以直接同步到redis,es或者其他的一些存储介质当中。

canal的简单使用可以查看quickStart:https://github.com/alibaba/canal/wiki/QuickStart ,这里不做过多的介绍。接下来主要是更多的介绍canal的整体架构,以及实现的原理等等。

Canal整体架构

binlog以及Canal的知识有哪些

CanalServer:一个Jvm就可以理解成一个CanalServer,如果是集群模式的Canal的话 那么就会有多个CanalServer。

CanalInstance: 可以理解为一个作业为一个Instance,比如有一个把A库的binlog同步到A消息队列,B库的binlog同步到B的消息队列,那么这就是两个不同的Instance,至于哪个Instance在哪个CanalServer上跑,需要看谁先在ZK抢占到临时节点,如果分配得足够均匀得话,可以在集群模式下缓解很多压力。

CanalParser: 用于拉取mysql-binlog,并进行解析。

EventSink: 将解析的数据进行处理加工(过滤,合并等)。

CanalEventStore: 这个有点类似slave中的relay log,用于将日志进行中继存储,但是在canal中目前只支持了在内存中存储,目前不支持落盘存储。

CanalParser,EventSink,CanalEventStore这三个都是属于Canal中非常重要的组件,他们之间的关系如下: binlog以及Canal的知识有哪些

CanalParser产生数据让EventSink进行加工,加工后的数据会存储在CanalEventStore中,然后MQ从CanalEventStore中不断的拉取最新数据,然后投递到MQ。

CanalParser

我们来讲讲在CanalParser中Canal是如何伪装成slave去拉数据的,在AbstractEventParser.java这个类中有如下步骤:

binlog以及Canal的知识有哪些

binlog以及Canal的知识有哪些

EventSink

EventSink会将上面获取到的logEntry来进行加工:

EventStore

我们先看看EventStore中提供的接口: binlog以及Canal的知识有哪些 可以看见EventStore其实就是一个简单的存储,在canal中提供了MemoryEventStoreWithBuffer,在内存中进行中转的数据,其中的原理是通过RingBuffer(无锁,高性能队列)实现的,有关于RingBuffer的信息可以参考我之前的文章你应该知道的Disruptor,在3.1中有对RingBuffer进行详细讲解。

然后CanalMq通过EventStore不断的获取数据,来进行数据发送。

binlog以及Canal的知识有哪些

以上就是binlog以及Canal的知识有哪些,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

推荐阅读:
  1. mysql binlog相关知识点有哪些
  2. MySQL中binlog有什么用

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

binlog canal

上一篇:启动glusterd服务失败怎么解决

下一篇:JS的script标签属性有哪些

相关阅读

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

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