Canal中间件的详细使用
什么是Canal
首先,Canal是阿里旗下的一款开源项目,纯Java开发,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。我们先来看一下官网的介绍:
Canal的工作原理就是把自己伪装成MySQL slave,模拟MySQL slave的交互协议向MySQL Mater发送dump协议,MySQL mater收到canal发送过来的dump请求,开始推送binary log给canal,然后canal解析binary log,再发送到存储目的地,比如MySQL,Redis,Kafka,Elastic Search等等。
工作原理
MySQL主备复制原理
- MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过 show binlog events 进行查看)
- MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)
- MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据
Canal工作原理
- 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机制。
2. 检查binlog是否开启,登录MySQL客户端,查看log_bin变量
3. 在MySQL里面添加以下的相关用户和权限
4. 下载Canal服务,然后解压文件放到对于目录,整体结构如下:
5. 修改配置文件conf/example/instance.properties
6. 启动Canal服务,在bin目录下运行startup.bat
如果看到这个界面,恭喜你,Canal服务已经启动成功。接下来就根据自己的业务场景去对增量数据进行处理。
具体使用场景
在日常的开发中,我们经常会用到Redis,ES等来减少数据库的开销,提高程序的整体性能,在此过程中就会遇到一个问题,如何保证相互之间的数据实时性,一致性,准确性?
一般情况下,我们使用Canal中间件,就是为了将MySQL的数据实时同步到其他地方并保证一致性和准确性。Canal在获取到变更数据后,就可以直接把对于的数据推送到目的地。
如果有多个业务场景,多个Slave会给Master带来一些额外管理上的开销,网卡流量也将翻倍的增长,所以在有多个业务场景的模式下,可以采用将数据推送到RabbitMQ中间件。
1. 直接推送
在程序中引入核心开发包,这里以C#为例,不同的语言对应的包不同,具体参考官网
在主程序实现获取到数据库中发生改变的数据并解析。
运行程序,看到如下界面,表示数据抓取成功,接下来就可以任意处理抓取到的数据了。
2. 使用MQ中间件推送
Canal本身集成了kafka,rocket,rabbit三种MQ中间件,在plugin文件夹下面。所以将数据推送到MQ非常方便。
1. 修改canal.properties文件
2. 修改instance.properties文件
然后配置你的MQ:
新建Exchanges
然后新建队列
绑定队列
注意这里的Routing key一定要和之前Canal配置文件里面的配置的一致
到这里不出意外的话,你的MySQL数据变更之后,MQ队列里面就会有对应的消息了。