背景
业务需要,需要将多张Mysql表通过字段关联合并为一张。要求低时延,可以选择需要同步的字段,并且自定义原表到目标表的映射关系。调研后选择了阿里巴巴开源的数据同步工具canal。
基本原理
- deployer:部署模块。通过该模块提供的CanalLauncher来启动canal server
- instance:一个server有多个instance。每个instance都会模拟成一个mysql实例的slave。instance模块有四个核心组成部分:parser模块、sink模块、store模块,meta模块
- parser模块:数据源接入,模拟slave协议和master进行交互,协议解析。parser模块依赖于dbsync、driver模块。
- sink模块:parser和store链接器,进行数据过滤,加工,分发的工作。
- store模块:数据存储。
- meta模块:增量订阅&消费信息管理器,核心接口为CanalMetaManager,主要用于记录canal消费到的mysql binlog的位置。
- client模块:canal的客户端
各模块功能
Canal Server
服务端,用于拉取binlog,维护位点信息,是canal的核心模块。需要注意的是,server端配置binlog位点信息后,开始接受binlog,即只能实现增量的数据同步。
Canal Admin
canal的配置十分复杂,特别需要一个管理系统。canal-admin设计上是为canal提供整体配置管理、节点运维等面向运维的功能,提供相对友好的WebUI操作界面,方便更多用户快速和安全的操作。
Canal Adapter
官方提供的消费者框架,支持同步到es、mysql等数据源。特别重要的是,adapter提供了全量同步的能力!!当开始全量同步时,对应的增量同步消费暂停,全量同步完成时,增量的消费重新开启。
监控
支持将监控指标存入prometheus,在grafana上展示。
阅读源码后
在不断折腾并踩坑后,我才对各模块的功能有了清晰的认识。
优点:
- 各模块划分比较清晰,理解源码的难度并不是很大
- 国内开源项目,很多问题可以在issue中找到答案
缺点:
- 文档缺失,很难快速对整个生态有所了解
- 配置比较复杂,server端各种配置,adapter仍需很多配置,再加上文档不完善,增大了上手难度
- admin管理功能不完善,我更想要的是通过界面完成复杂的同步配置,然而admin现在不支持直接对adapter进行配置
个人建议:不要幻想着开箱即用,熟悉原理与源码后才能上生产环境。
在阅读源码后,我发现canal adapter可以实现多张Mysql表到一张Mysql表的增量同步,但是并没有对应的全量同步功能!按照当前逻辑,只能实现单表到单表的全量同步逻辑。
同时,canal adapter是支持多张关联表全量、增量同步到es的。代码比较清晰,简单改造后,将这个能力增加到了Mysql→Mysql中。
一些建议
-
注意对顺序消费的保障
- 使用tcp模式可以保证顺序消费,使用mq模式的话则需要将同一主键的消息放到同一partition
-
监控是必须的!同时建议阅读监控相关的源码,搞懂每个指标的含义
-
多多阅读issue,带着问题阅读源码。当对大多数issue心中都有答案了,说明研究到位了。
总结
Canal是个不错的开源数据同步工具,但离开箱即用的期待仍有距离。本文介绍了下我使用的经验,希望对有类似需求的朋友有所帮助。后续我将分享canal相关源码以及二次开发的方法步骤。