经验分享-数据同步工具Canal

719 阅读3分钟

背景

业务需要,需要将多张Mysql表通过字段关联合并为一张。要求低时延,可以选择需要同步的字段,并且自定义原表到目标表的映射关系。调研后选择了阿里巴巴开源的数据同步工具canal。

基本原理

canal-model.png

  • 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操作界面,方便更多用户快速和安全的操作。

image.png

Canal Adapter

官方提供的消费者框架,支持同步到es、mysql等数据源。特别重要的是,adapter提供了全量同步的能力!!当开始全量同步时,对应的增量同步消费暂停,全量同步完成时,增量的消费重新开启。

监控

image.png 支持将监控指标存入prometheus,在grafana上展示。

阅读源码后

在不断折腾并踩坑后,我才对各模块的功能有了清晰的认识。

优点:

  • 各模块划分比较清晰,理解源码的难度并不是很大
  • 国内开源项目,很多问题可以在issue中找到答案

缺点:

  • 文档缺失,很难快速对整个生态有所了解
  • 配置比较复杂,server端各种配置,adapter仍需很多配置,再加上文档不完善,增大了上手难度
  • admin管理功能不完善,我更想要的是通过界面完成复杂的同步配置,然而admin现在不支持直接对adapter进行配置

个人建议:不要幻想着开箱即用,熟悉原理与源码后才能上生产环境

在阅读源码后,我发现canal adapter可以实现多张Mysql表到一张Mysql表的增量同步,但是并没有对应的全量同步功能!按照当前逻辑,只能实现单表到单表的全量同步逻辑。

同时,canal adapter是支持多张关联表全量、增量同步到es的。代码比较清晰,简单改造后,将这个能力增加到了Mysql→Mysql中。

一些建议

总结

Canal是个不错的开源数据同步工具,但离开箱即用的期待仍有距离。本文介绍了下我使用的经验,希望对有类似需求的朋友有所帮助。后续我将分享canal相关源码以及二次开发的方法步骤。