1、Canal整体解析

canal server是canal的基本部署实例,在实现上一个canal server 部署实例由多个binlog数据通道实例组成的。
image.png

通过deployer模块,启动一个canal-server,一个cannal-server内部包含多个instance,每个instance都会伪装成一个mysql实例的slave。client与server之间的通信协议由protocol模块定义。client在订阅binlog信息时,需要传递一个destination参数,server会根据这个destination确定由哪一个instance为其提供服务。

image.png
说明:

  • canal server就是一个jvm运行实例,
  • server代表一个Canal运行实例,对应于一个jvm instance对应于一个数据队列(1个server对应1..n个instance)

instance模块:

  • eventParser(数据源接入,模拟slave协议和master进行交互,协议解析)
  • eventSink(Parser和Store链接器,进行数据过滤,加工,分发的工作)
  • eventStore(数据存储,目前只存在内存里)
  • metaManager(增量订阅&消费信息管理器)

binlog数据通道实例由Parser、Sink和store模块组成,完成binlog的解析、过滤和存储一整条链路功能。跟binlog数据通道的关系为:
image.png

2、Canal部署模式

1.HA模式
image.png

2.单连
image.png

3.两个client+两个instance+1个mysql

当mysql变动时,两个client都能获取到变动
image.png

4.一个server+两个instance+两个mysql+两个client
image.png

  1. instance**的standby配置

image.png

3、Canal和Maxwell对比

canal和maxwell都是基于mysql的binlog的读取实现数据同步的方式来实现mysql的数据同步,但是canal更轻量级,社区和学习成本更低,且canal是纯java写的,而maxwell是基于lisp描述语言来编写的,从技术生态的支持和扩展性方面,canal更适合。

4、Canal 写入ES

接收消息推送es有两种实现方式:

  • canal-adaptor组件部署实现
  • 自定义kafka-consumer方式写入

es-client写入索引文档实现
此处由于是数据同步的单独服务,尽量少的产生服务依赖,因此,写入es考虑集成es-client处理

5、Canal框架组成
canal-server
https://github.com/alibaba/canal
canal-admin
https://github.com/alibaba/canal/wiki/ClientAdapter

canal-client
https://github.com/alibaba/canal/wiki/ClientAPI