canal DevGuide

背景

   先前开源了一个开源项目: 【阿里巴巴开源项目: 基于mysql数据库binlog的增量订阅&消费】 

   本文主要是介绍一下如何给canal贡献代码,介绍其设计思路和扩展方式

 

设计


 说明:

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

instance下的子模块:

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

整体类图设计 

 

说明:

  • CanalLifeCycle为所有canal模块的生命周期接口
  • CanalInstance组合parser,sink,store三个子模块,三个子模块的生命周期统一受CanalInstance管理
  • CanalServer聚合了多个CanalInstance

EventParser类图设计和扩展

 

每个EventParser都会关联两个内部组件: CanalLogPositionManager , CanalHAController  

  • CanalLogPositionManager :  记录binlog最后一次解析成功位置信息,主要是描述下一次canal启动的位点
  • CanalHAController:控制EventParser的链接主机管理,判断当前该链接哪个mysql数据库. 

说明:

1.  目前开源版本只有支持mysql的协议(LocalBinlog就是类似于relay log的那种模式,直接根据relay log进行数据消费)

2.  内部版本会有OracleEventParser,获取oracle增量变更信息,因为涉及一些政治,商业和产品关系,没有随canal开源。(oracle增量解析目前为c语言开发,提供socket方式供canal接入)

 

CanalLogPositionManager类图设计

 

 

说明: 

1.  如果CanalEventStore选择的是内存模式,可不保留解析位置,下一次canal启动时直接依赖CanalMetaManager记录的最后一次消费成功的位点即可. (最后一次ack提交的数据位点)
2.  如果CanalEventStore选择的是持久化模式,可通过zookeeper记录位点信息,canal instance发生failover切换到另一台机器,可通过读取zookeeper获取位点信息.  

 

可公通过实现自己的CanalLogPositionManager,比如记录位点信息到本地文件/nas文件,简单可用的无HA的模式. 

 

CanalHAController类图设计

 

说明: 

1. 常见的就是基于心跳语句,定时请求当前链接的数据库,超过一定次数检测失败时,尝试切换到备机.
2. 比如阿里内部会有一套数据库主备信息管理系统,DBA做了数据库主备切换或者机器下线,推送配置到各个应用节点,HAController收到后,控制EventParser进行链接切换. 

 

EventSink类图设计和扩展

 
         

说明: 

1.  常见的sink业务有分1:n和n:1的业务,目前GroupEventSink主要是解决n:1的归并业务

 

关于1:n/n:1的介绍,可参见我的canal介绍的文章。 

 

EventStore类图设计和扩展

 

 

说明: 

1.  抽象了CanalStoreScavenge , 解决数据的清理,比如定时清理,满了之后清理,每次ack清理等

2.  CanalEventStore接口,主要包含put/get/ack/rollback的相关接口.  put/get操作会组成一个生产者/消费者模式,每个store都会有存储大小设计,存储满了,put操作会阻塞等待get获取数据,所以不会无线占用存储,比如内存大小

     a.  目前EventStore主要实现了memory模式,支持按照内存大小和内存记录数进行存储大小限制.  

     b.  后续可开发基于本地文件的存储模式

     c.  基于文件存储和内存存储,开发mixed模式,做成两级队列,内存buffer有空位时,将文件的数据读入到内存buffer中。

 

重要:实现基于mixed模式后,canal才可以说是完成真正的消费/订阅的模型  (取1份binlog数据,提供多个客户端消费,消费有快有慢,各自保留消费位点)

 

MetaManager类图设计和扩展 

 

说明: 

1.  metaManager目前同样支持了多种模式,最顶层的就是memory和zookeeper的模式,还有就是mixed模式,先写内存,再写zookeeper. 

 

可公通过实现自己的CanalMetaManager,比如记录位点信息到本地文件/nas文件,简单可用的无HA的模式. 

 

应用扩展

上面介绍了相关模块的设计,这里介绍下如何将自己的扩展代码应用到canal中.  介绍之前首先需要了解instance的配置方式,可参见: AdminGuide 的spring配置这一章节

canal instance基于spring的管理方式,主要由两部分组成: 

  1. xxx.properties
  2. xxx-instance.xml 

xxx-instance.xml就是描述对应instance所使用的模块组件定义,比如默认的instance模块组件定义有: 

  1. memory-instance.xml  (选择了memory模式的组件,速度优先,简单)
  2. default-instance.xml (选择了mixed/preiodmixed模式的组件,可以提供HA的功能)
  3. group-instance.xml (提供了n:1的sink模式)

所以,如果要应用自己的组件,就只需要定义一份自己的instance.xml,比如custom-intance.xml

1.<!-- properties -->
2.    <bean class="com.alibaba.otter.canal.instance.spring.support.PropertyPlaceholderConfigurer" lazy-init="false">
3.        <property name="ignoreResourceNotFound" value="true" />
4.        <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/><!-- 允许system覆盖 -->
5.        <property name="locationNames">
6.            <list>
7.                <value>classpath:canal.properties</value>
8.                <value>classpath:${canal.instance.destination:}/instance.properties</value>
9.            </list>
10.        </property>
11.    </bean>
12.
13.    <bean id="instance" class="com.alibaba.otter.canal.instance.spring.CanalInstanceWithSpring">
14.        <property name="destination" value="${canal.instance.destination}" />
15.        <property name="eventParser">
16.            <ref local="eventParser" />
17.        </property>
18.        <property name="eventSink">
19.            <ref local="eventSink" />
20.        </property>
21.        <property name="eventStore">
22.            <ref local="eventStore" />
23.        </property>
24.        <property name="metaManager">
25.            <ref local="metaManager" />
26.        </property>
27.        <property name="alarmHandler">
28.            <ref local="alarmHandler" />
29.        </property>
30.    </bean>
31.......

instance.xml要满足一个基本元素:

1.  一份instance.xml中有一份或者多份instance定义,优先以destination名字查找对应的instance bean定义,如果没有,则按默认的名字“instance”查找instance对象

2. 一份instance bean定义,需要包含eventParser , evnetSink , evnetStore , metaManager,alarmHandler的5个模块定义,(alarmHandler主要是一些报警机制处理,因为简单没展开,可扩展)

 

完成custom-instance.xml定义后,可通过canal.properties配置中进行引入:

1.canal.instance.{通道名字}.spring.xml = classpath:spring/custom-instance.xml  

canal.instance.{通道名字}.spring.xml = classpath:spring/custom-instance.xml

到这里,就完成了扩展组件的应用,启动canal instance后,就会使用自定义的的组件 ,  just have fun . 

时间: 2024-10-27 01:49:05

canal DevGuide的相关文章

Canal Client API

1.  首先需要先启动canal server,可参见:Canal Server的QuickStart 2.  运行canal client,可参见:canal client的ClientExample   如何下载 1.  如果是maven用户,可配置mvn dependency 1.<dependency> 2. <groupId>com.alibaba.otter</groupId> 3. <artifactId>canal.client</ar

Alibaba Canal Manager Model 配置管理实现

Alibaba Canal Manager Model 配置管理实现 Alibaba Canal 用于增量订阅消费 mysql 数据库 binlog 日志,详细介绍请见 alibaba/canal. 其中 Server 端配置有两种管理方式: Spring 和 Manager.其中 Spring 方式是基于spring xml + properties 进行定义构建 spring 配置, Manager 方式则可以对接 Web console/manager 系统.本文主要记录一下 Manage

Canal AdminGuide

背景    先前开源了一个开源项目: [阿里巴巴开源项目: 基于mysql数据库binlog的增量订阅&消费]     本文主要是介绍一下如何部署&使用   环境要求 1. 操作系统     a.  纯java开发,windows/linux均可支持     b.  jdk建议使用1.6.25以上的版本,稳定可靠,目前阿里巴巴使用基本为此版本.    2. mysql要求    a. 目前canal支持mysql 5.5版本以下,对mysql5.6暂不支持,(mysql4.x版本没有经过严

Canal BinlogChange(mysql5.6)

背景 先前开源了一个开源项目: [阿里巴巴开源项目: 基于mysql数据库binlog的增量订阅&消费]    本文主要是介绍一下canal1.0.3支持mysql5.6协议上的变化.    协议变化 1.   binlog checksum     mysql5.6之后,支持在binlog对象中增加checksum信息,比如CRC32协议.   其原理主要是在原先binlog的末尾新增了4个byte,写入一个crc32的校验值.      对应参数说明: http://dev.mysql.co

谈谈对Canal(增量数据订阅与消费)的理解

概述 canal是阿里巴巴旗下的一款开源项目,纯Java开发.基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了mysql(也支持mariaDB). 起源:早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求.不过早期的数据库同步业务,主要是基于trigger的方式获取增量变更,不过从2010年开始,阿里系公司开始逐步的尝试基于数据库的日志解析,获取增量变更进行同步,由此衍生出了增量订阅&消费的业务,从此开启了一段新纪元. 基于日志增量订阅&消

Canal BinlogChange(mariadb5/10)

背景 先前开源了一个开源项目: [阿里巴巴开源项目: 基于mysql数据库binlog的增量订阅&消费]  本文主要是介绍一下canal支持mariadb协议上的变化.    协议变化 mariadb5.5 mariadb5.5主要是基于mysql5.5的原型,类型定义基本没啥变化,大体上都保持兼容 主要的变化: 1. QueryLogEvent增加了status变量.     Q_HRNOW  用于记录毫秒的精度,枚举值下标为128 协议解析的时候,需要处理Q_HRNOW,需要跳过3字节的数据

Canal ClientExample

Canal介绍       基于mysql数据库binlog的增量订阅&消费   ClientExample 依赖配置:(目前暂未正式发布到mvn仓库,所以需要各位下载canal源码后手工执行下mvn clean install -Dmaven.test.skip) 1.<dependency> 2. <groupId>com.alibaba.otter</groupId> 3. <artifactId>canal.client</artifa

【源码】canal和otter的高可靠性分析

一般来说,我们对于数据库最主要的要求就是:数据不丢.不管是主从复制,还是使用类似otter+canal这样的数据库同步方案,我们最基本的需求是,在数据不丢失的前提下,尽可能的保证系统的高可用,也就是在某个节点挂掉,或者数据库发生主从切换等情况下,我们的数据同步系统依然能够发挥它的作用--数据同步.本文讨论的场景是数据库发生主从切换,本文将从源码的角度,来看看otter和canal是如何保证高可用和高可靠的. 一.EventParser 通过阅读文档和源码,我们可以知道,对于一个canal ser

Canal QuickStart

Canal介绍       基于mysql数据库binlog的增量订阅&消费   QuickStart 几点说明:(mysql初始化) a.  canal的原理是基于mysql binlog技术,所以这里一定需要开启mysql的binlog写入功能,并且配置binlog模式为row.  1.[mysqld] 2.log-bin=mysql-bin #添加这一行就ok 3.binlog-format=ROW #选择row模式 4.server_id=1 #配置mysql replaction需要定