canal是阿里巴巴开源的mysql数据库binlog的增量订阅&消费组件。当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x
基于日志增量订阅和消费的业务包括
1、数据库镜像
2、数据库实时备份
3、索引构建和实时维护(拆分异构索引、倒排索引等)
4、业务 cache 刷新
5、带业务逻辑的增量数据处理
项目github地址为:https://github.com/alibaba/canal
官方wiki:https://github.com/alibaba/canal/wiki
本文使用的版本是tag1.0.24
cancal模块划分
common模块:主要是提供了一些公共的工具类和接口。
client模块:canal的客户端。核心接口为CanalConnector
example模块:提供client模块使用案例。
protocol模块:client和server模块之间的通信协议
deployer:部署模块。通过该模块提供的CanalLauncher来启动canal server
server模块:canal服务器端。核心接口为CanalServer
instance模块:一个server有多个instance。每个instance都会模拟成一个mysql实例的slave。instance模块有四个核心组成部分:parser模块、sink模块、store模块,meta模块。核心接口为CanalInstance
parser模块:数据源接入,模拟slave协议和master进行交互,协议解析。parser模块依赖于dbsync、driver模块。
driver模块和dbsync模块:从这两个模块的artifactId(canal.parse.driver、canal.parse.dbsync),就可以看出来,这两个模块实际上是parser模块的组件。事实上parser 是通过driver模块与mysql建立连接,从而获取到binlog。由于原始的binlog都是二进制流,需要解析成对应的binlog事件,这些binlog事件对象都定义在dbsync模块中,dbsync 模块来自于淘宝的tddl(分布式数据库中间件)。
sink模块:parser和store链接器,进行数据过滤,加工,分发的工作。核心接口为CanalEventSink
store模块:数据存储。核心接口为CanalEventStore
meta模块:增量订阅&消费信息管理器,核心接口为CanalMetaManager,主要用于记录canal消费到的mysql binlog的位置
工作原理
MySQL主备复制原理
1、MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过 show binlog events 进行查看)
2、MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)
3、MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据
canal 工作原理
1、canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
2、MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
3、canal 解析 binary log 对象(原始为 byte 流)
canal各个模块依赖
通过deployer模块,启动一个canal-server,一个cannal-server内部包含多个instance,每个instance都会伪装成一个mysql实例的slave。client与server之间的通信协议由protocol模块定义。client在订阅binlog信息时,需要传递一个destination参数,server会根据这个destination确定由哪一个instance为其提供服务。
参考: