目录

 

1. Canal简介

2. Canal架构

2.1 应用架构

2.2 工作原理

2.3 内部构成

2.3.1 Instance构成 - EventParser

2.3.3 Instance构成 - EventStore

2.3.4 Instance构成 - MetaManger

2.4 Instance的实现方式


1. Canal简介

Canal是阿里开源的mysql数据库binlog增量订阅&消费组件

github地址:https://github.com/alibaba/canal

定位:基于数据库日志解析,提供增量数据订阅&消费,开源版本支持mysql。阿里内部已支持Oracle的解析。

个人理解:主要的使用场景是实时的异构数据同步。

其他binlog解析工具:Oracle Golden Gate,open-replicator,mysqlbinlog

 

2. Canal架构

2.1 应用架构

Canal = Canal Server + Canal Client

一个Canal Client对应一个Canal Instance,一个Canal Instance对应一个MySQL Instance

2.2 工作原理

原理总结:

1、canal server模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql slave发送dump协议。

2、mysql master收到dump请求,开始推送binary log给slave(也就是canal)

3、canal server解析binary log对象(原始为byte流)

2.3 内部构成

说明

  • Canal Server代表一个Canal运行实例,对应一个JVM。
  • instance对应于一个数据队列(1个server对应1...n个instance)

instance下的子模块

  • eventParser:数据源接入,模拟slave协议和master进行交互,协议解析
  • eventSlink:Parser和Store链接器,进行数据过滤,加工,分发的工作
  • eventStore:数据存储
  • metaManger:记录binlog解析位点和消费位点

2.3.1 Instance构成 - EventParser

EventParser解析日志并记录位点,判断当前链接哪个mysql数据库,适时进行failover

数据过滤:支持通配符合黑名单的过滤模式,确定要处理的数据库和表

数据路由:解决1:n

数据归并:解决n:1

数据加工:在进入store之前进行额外的处理,比如join

 

2.3.3 Instance构成 - EventStore

EventStore目前只实现了memory模式,是不做持久化的,而是在内存中维持一个RingBuffer的数据结构,支持按照内存大小或记录数进行存储大小的限制。

每个store都会有存储大小的设计,存储满了,put操作会阻塞等待get获取数据,所以不会无限占用存储。

RingBuffer中3个标志位含义

  • PUT是写数据
  • GET是客户端获取数据的位置
  • ACK是客户端确认消费无误的位置

 

2.3.4 Instance构成 - MetaManger

MetaManger现在有多种实现方式,将放到Instance的实现方式中来介绍。

 

2.4 Instance的实现方式

根据“binlog解析位点和消费位点的保存方式的不同,或者binlog数据本身保存方式的不同“,instance可以有不同的实现方式。Instance的实现可以自定义,通过spring.xml的方式进行动态配置

 

memory-instance.xml

简介:位点记录在内存中

特点:速度最快,依赖最少,重启后回到初始位点

适用场景:开发环境

 

file-instance.xml

简介:位点持久化在文件中

特点:支持单机持久化

适用场景:生产环境,无HA需求

 

default-instance.xml

简介:位点持久化在ZK中

特点:支持HA

适用场景:生产环境,集群化需求

 

group-instance.xml

简介: 需要进行多库合并时,可以将多个物理instance合并为一个逻辑instance合并为一个逻辑instance,提供客户端访问

适用场景:分表分库业务

 

相关文章: