带你全面认识Canal中间件,超详细

1,627 阅读4分钟

Canal中间件的详细使用

什么是Canal

首先,Canal是阿里旗下的一款开源项目,纯Java开发,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。我们先来看一下官网的介绍:

image.png Canal的工作原理就是把自己伪装成MySQL slave,模拟MySQL slave的交互协议向MySQL Mater发送dump协议,MySQL mater收到canal发送过来的dump请求,开始推送binary log给canal,然后canal解析binary log,再发送到存储目的地,比如MySQL,Redis,Kafka,Elastic Search等等。

工作原理

MySQL主备复制原理

image.png

  • MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过 show binlog events 进行查看)
  • MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)
  • MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据

Canal工作原理

image.png

  • canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
  • MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
  • canal 解析 binary log 对象(原始为 byte 流)

Canal能做什么

与其问Canal能做什么,不如说数据同步有什么作用。 但是Canal的数据同步不是全量的,而是增量。基于binary log增量订阅和消费,canal可以做:

  • 数据库镜像
  • 数据库实时备份
  • 索引构建和实时维护(拆分异构索引、倒排索引等)
  • 业务 cache 刷新
  • 带业务逻辑的增量数据处理 当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x

如何搭建Canal

这里以Windows为例

MySQL的安装这里就不演示了,比较简单,网上也有很多教程。

1. 默认安装的MySQL并没有启用binlog机制,所以我们要手动修改MySQL的配置文件来启用binlog机制。

image.png

2. 检查binlog是否开启,登录MySQL客户端,查看log_bin变量

image.png

3. 在MySQL里面添加以下的相关用户和权限

image.png

4. 下载Canal服务,然后解压文件放到对于目录,整体结构如下:

image.png

5. 修改配置文件conf/example/instance.properties

image.png

6. 启动Canal服务,在bin目录下运行startup.bat

image.png

如果看到这个界面,恭喜你,Canal服务已经启动成功。接下来就根据自己的业务场景去对增量数据进行处理。

具体使用场景

在日常的开发中,我们经常会用到Redis,ES等来减少数据库的开销,提高程序的整体性能,在此过程中就会遇到一个问题,如何保证相互之间的数据实时性,一致性,准确性?

一般情况下,我们使用Canal中间件,就是为了将MySQL的数据实时同步到其他地方并保证一致性和准确性。Canal在获取到变更数据后,就可以直接把对于的数据推送到目的地。

image.png

如果有多个业务场景,多个Slave会给Master带来一些额外管理上的开销,网卡流量也将翻倍的增长,所以在有多个业务场景的模式下,可以采用将数据推送到RabbitMQ中间件。

image.png

1. 直接推送

在程序中引入核心开发包,这里以C#为例,不同的语言对应的包不同,具体参考官网

image.png

在主程序实现获取到数据库中发生改变的数据并解析。 image.png

image.png

运行程序,看到如下界面,表示数据抓取成功,接下来就可以任意处理抓取到的数据了。 image.png

2. 使用MQ中间件推送

Canal本身集成了kafka,rocket,rabbit三种MQ中间件,在plugin文件夹下面。所以将数据推送到MQ非常方便。

1. 修改canal.properties文件

image.png

2. 修改instance.properties文件

image.png

然后配置你的MQ:

新建Exchanges

image.png

然后新建队列

image.png

绑定队列

image.png

注意这里的Routing key一定要和之前Canal配置文件里面的配置的一致

到这里不出意外的话,你的MySQL数据变更之后,MQ队列里面就会有对应的消息了。