巧用阿里canal实现mysql异构数据同步
一 什么是异构数据
如下图:
我们通过Mysql存储的数据,其实在检索的时候性能在一定条件下其实很低下,我们就会利用到es这样的全文检索引擎,来保证我们检索的速度,但是既然是两个不同的数据存储引擎,必然就涉及到数据同步的问题,如上图我们的步骤:
- 应用创建,存储在mysql
- 调用团队b的接口,将数据同步到es
- 由需要查询的用户直接从es检索
但是基于以上的流程存在一下的问题:
- 团队A与团队B的协作产生代码强耦合
- 团队A必须了解团队B提供的接口才可以实现
- 但本身这并不属于团队A的工作范畴
- 扩展困难,假如现在我们需要用到mongodb的部分功能,是不是需要再新建一个接口将数据同步过去?
二 canal
Canal是阿里巴巴旗下的一款开源项目,纯Java开发。基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL(也支持mariaDB)。
其简单原理如下:
上图的流程如下:
- 用户执行了新增用户/删除用户两个操作
- 主库在执行完毕后,会将该操作的日志记录(默认statement模式,即直接保存sql)到一个二进制文件中,即binlog
- 从库watch主库的binlog日志,由主库传输到从库,从库写入到自己的relaylog,从库根据日志做对应的操作,保持数据与主库一致
基于以上的流程,canal接入以后做了什么呢?如下图:
以上的流程为:
- canal将自己作为一个mysql从库
- 将监听道德binlog写入relaylog
- 监听relaylog自动触发java代码将数据同步到es
基于以上的流程,我们发现又出现了新的问题,canal只解决了监听的问题,但是还是没有解决解耦的问题,于是我们应该设计如下的架构来解决canal不能直接解耦的问题:
我们新增一个环节,将数据变化的时候,我们将变更的消息推送到mq,由各数据同步目标自主消费处理对应的数据。