README

简介

canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费
早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。
基于日志增量订阅和消费的业务包括
- 数据库镜像
- 数据库实时备份
- 索引构建和实时维护(拆分异构索引、倒排索引等)
- 业务 cache 刷新
- 带业务逻辑的增量数据处理
当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x
工作原理
MySQL主备复制原理

- MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过 show binlog events 进行查看)
- MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)
- MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据
canal 工作原理
- canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
- MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
- canal 解析 binary log 对象(原始为 byte 流)
重要版本更新说明
-
canal 1.1.x 版本(release_note),性能与功能层面有较大的突破,重要提升包括:
-
整体性能测试&优化,提升了150%. #726 参考: Performance
- 原生支持prometheus监控 #765 Prometheus QuickStart
- 原生支持kafka消息投递 #695 Canal Kafka/RocketMQ QuickStart
- 原生支持aliyun rds的binlog订阅 (解决自动主备切换/oss binlog离线解析) 参考: Aliyun RDS QuickStart
-
原生支持docker镜像 #801 参考: Docker QuickStart
-
canal 1.1.4版本,迎来最重要的WebUI能力,引入canal-admin工程,支持面向WebUI的canal动态管理能力,支持配置、任务、日志等在线白屏运维能力,具体文档:Canal Admin Guide
文档
多语言
canal 特别设计了 client-server 模式,交互协议使用 protobuf 3.0 , client 端可采用不同语言实现不同的消费逻辑,欢迎大家提交 pull request
canal 作为 MySQL binlog 增量获取和解析工具,可将变更记录投递到 MQ 系统中,比如 Kafka/RocketMQ,可以借助于 MQ 的多语言能力
基于canal开发的工具
- canal2sql(基于binlog生成SQL) : [https://github.com/zhuchao941/canal2sql]
相关开源&产品
问题反馈
本项目的Issues会被同步沉淀至阿里云开发者社区
Extension points exported contracts — how you extend this code
CanalMQConnector (Interface)
canal MQ数据操作客户端 1. canal server写入MQ消息,考虑性能会合并多条数据写入为一个MQ消息,一个Message对应一个MQ消息 2. canal client消费MQ消息,因为client性能会弱于s [8 implementers]
client/src/main/java/com/alibaba/otter/canal/client/CanalMQConnector.java
InstanceRegistry (Interface)
@author Chuanyi Li [16 implementers]
prometheus/src/main/java/com/alibaba/otter/canal/prometheus/InstanceRegistry.java
CanalMsgConsumer (Interface)
Canal/MQ consumer SPI 接口 @author rewerma @ 2020-02-01 @version 1.0.0 [12 implementers]
connector/core/src/main/java/com/alibaba/otter/canal/connector/core/spi/CanalMsgConsumer.java
CanalHAController (Interface)
HA 控制器实现 @author jianghang 2012-6-26 下午05:21:07 @version 1.0.0 [49 implementers]
parse/src/main/java/com/alibaba/otter/canal/parse/ha/CanalHAController.java
IPacket (Interface)
Top Abstraction for network packet. it exposes 2 behaviors for sub-class implementation which will be used to marsha [25 …
driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/packets/IPacket.java
CanalServerStarter (Interface)
外部服务如Kafka, RocketMQ启动接口 @author machengyuan 2018-8-23 下午05:20:29 @version 1.0.0 [66 implementers]
server/src/main/java/com/alibaba/otter/canal/server/CanalServerStarter.java
CanalLifeCycle (Interface)
@author jianghang 2012-7-12 上午09:39:33 @version 1.0.0 [10 implementers]
common/src/main/java/com/alibaba/otter/canal/common/CanalLifeCycle.java
CanalMetaManager (Interface)
meta信息管理器 @author jianghang 2012-6-14 下午09:28:48 @author zebin.xuzb @version 1.0.0 [7 implementers]
meta/src/main/java/com/alibaba/otter/canal/meta/CanalMetaManager.java
Core symbols most depended-on inside this repo
n
called by 1520
admin/admin-web/src/main/resources/public/static/js/chunk-libs.c04beefc.js
i
called by 889
admin/admin-web/src/main/resources/public/static/js/chunk-elementUI.667f4c87.js
put
called by 548
store/src/main/java/com/alibaba/otter/canal/store/CanalEventStore.java
isEmpty
called by 547
common/src/main/java/com/google/common/collect/MigrateMap.java
add
called by 512
client-adapter/escore/src/main/java/com/alibaba/otter/canal/client/adapter/es/core/support/ESBulkRequest.java
get
called by 497
client/src/main/java/com/alibaba/otter/canal/client/CanalConnector.java
get
called by 425
server/src/main/java/com/alibaba/otter/canal/server/CanalService.java
e
called by 408
admin/admin-web/src/main/resources/public/static/js/chunk-0dca2f22.a2bc28b8.js
Shape
Method
7,566
Function
844
Class
799
Interface
97
Enum
50
Languages
Java91%
TypeScript9%
Modules by API surface
protocol/src/main/java/com/alibaba/otter/canal/protocol/CanalPacket.java928 symbols
protocol/src/main/java/com/alibaba/otter/canal/protocol/CanalEntry.java879 symbols
protocol/src/main/java/com/alibaba/otter/canal/protocol/AdminPacket.java527 symbols
admin/admin-web/src/main/resources/public/static/js/chunk-libs.c04beefc.js305 symbols
admin/admin-web/src/main/resources/public/static/js/chunk-elementUI.667f4c87.js221 symbols
instance/manager/src/main/java/com/alibaba/otter/canal/instance/manager/model/CanalParameter.java212 symbols
client-adapter/hbase/src/main/java/com/alibaba/otter/canal/client/adapter/hbase/config/MappingConfig.java68 symbols
client-adapter/escore/src/main/java/com/alibaba/otter/canal/client/adapter/es/core/config/SchemaItem.java65 symbols
parse/src/main/java/com/alibaba/otter/canal/parse/inbound/AbstractEventParser.java62 symbols
dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/LogBuffer.java60 symbols
client-adapter/es7x/src/main/java/com/alibaba/otter/canal/client/adapter/es7x/support/ESConnection.java58 symbols
client-adapter/es6x/src/main/java/com/alibaba/otter/canal/client/adapter/es6x/support/ESConnection.java58 symbols
Dependencies from manifests, versioned
ch.qos.logback:logback-classic1.2.9 · 1×
ch.qos.logback:logback-core1.2.9 · 1×
co.elastic.clients:elasticsearch-java8.6.2 · 1×
com.101tec:zkclient0.10 · 1×
com.alibaba.fastjson2:fastjson22.0.31 · 1×
com.alibaba.mq-amqp:mq-amqp-client1×
com.alibaba.otter:canal.client1×
com.alibaba.otter:canal.common1×
com.alibaba.otter:canal.filter1×
com.alibaba.otter:canal.instance.core1×
com.alibaba.otter:canal.instance.manager1×
com.alibaba.otter:canal.instance.spring1×
Datastores touched
(mysql)Database · 1 repos
mytestDatabase · 1 repos
canal_tsdbDatabase · 1 repos
canal_managerDatabase · 1 repos
canal_adapterDatabase · 1 repos
mytest2Database · 1 repos
postgresDatabase · 1 repos