1、Canal整体解析
canal server是canal的基本部署实例,在实现上一个canal server 部署实例由多个binlog数据通道实例组成的。
通过deployer模块,启动一个canal-server,一个cannal-server内部包含多个instance,每个instance都会伪装成一个mysql实例的slave。client与server之间的通信协议由protocol模块定义。client在订阅binlog信息时,需要传递一个destination参数,server会根据这个destination确定由哪一个instance为其提供服务。
说明:
- 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数据通道的关系为:
2、Canal部署模式
1.HA模式
2.单连
3.两个client+两个instance+1个mysql
当mysql变动时,两个client都能获取到变动
4.一个server+两个instance+两个mysql+两个client
- instance**的standby配置
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