巧用阿里canal实现mysql异构数据同步

一 什么是异构数据

如下图:

![image](images/kMT0fdSgnZEuAbbPPE7SGsIONb-tkFYSG18agkL17yA.png)

我们通过Mysql存储的数据,其实在检索的时候性能在一定条件下其实很低下,我们就会利用到es这样的全文检索引擎,来保证我们检索的速度,但是既然是两个不同的数据存储引擎,必然就涉及到数据同步的问题,如上图我们的步骤:

  1. 应用创建,存储在mysql
  2. 调用团队b的接口,将数据同步到es
  3. 由需要查询的用户直接从es检索

但是基于以上的流程存在一下的问题:

  1. 团队A与团队B的协作产生代码强耦合
  2. 团队A必须了解团队B提供的接口才可以实现
  3. 但本身这并不属于团队A的工作范畴
  4. 扩展困难,假如现在我们需要用到mongodb的部分功能,是不是需要再新建一个接口将数据同步过去?

二 canal

Canal是阿里巴巴旗下的一款开源项目,纯Java开发。基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL(也支持mariaDB)。

其简单原理如下:

![image](images/TX2yzflYscdB3T2Opc5LR660qZhckP6opyuoiv5djLs.png)

上图的流程如下:

  1. 用户执行了新增用户/删除用户两个操作
  2. 主库在执行完毕后,会将该操作的日志记录(默认statement模式,即直接保存sql)到一个二进制文件中,即binlog
  3. 从库watch主库的binlog日志,由主库传输到从库,从库写入到自己的relaylog,从库根据日志做对应的操作,保持数据与主库一致

基于以上的流程,canal接入以后做了什么呢?如下图:

![image](images/JEl-E3OzSNloUsN0dnT2knVWh1lXn2mTzjAHdBckkvc.png)

以上的流程为:

  1. canal将自己作为一个mysql从库
  2. 将监听道德binlog写入relaylog
  3. 监听relaylog自动触发java代码将数据同步到es

基于以上的流程,我们发现又出现了新的问题,canal只解决了监听的问题,但是还是没有解决解耦的问题,于是我们应该设计如下的架构来解决canal不能直接解耦的问题:

![image](images/nlU9WK0TOvV56YHQ7l8geCuQQAnAND_Quhe9lpMpU-4.png)

我们新增一个环节,将数据变化的时候,我们将变更的消息推送到mq,由各数据同步目标自主消费处理对应的数据。

Last modification:July 5, 2022
If you think my article is useful to you, please feel free to appreciate