`
agapple
  • 浏览: 1598464 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论
阅读更多

背景

   先前开源了一个开源项目: 【阿里巴巴开源项目: 基于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

 

<!-- properties -->
	<bean class="com.alibaba.otter.canal.instance.spring.support.PropertyPlaceholderConfigurer" lazy-init="false">
		<property name="ignoreResourceNotFound" value="true" />
		<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/><!-- 允许system覆盖 -->
		<property name="locationNames">
			<list>
				<value>classpath:canal.properties</value>
				<value>classpath:${canal.instance.destination:}/instance.properties</value>
			</list>
		</property>
	</bean>

	<bean id="instance" class="com.alibaba.otter.canal.instance.spring.CanalInstanceWithSpring">
		<property name="destination" value="${canal.instance.destination}" />
		<property name="eventParser">
			<ref local="eventParser" />
		</property>
		<property name="eventSink">
			<ref local="eventSink" />
		</property>
		<property name="eventStore">
			<ref local="eventStore" />
		</property>
		<property name="metaManager">
			<ref local="metaManager" />
		</property>
		<property name="alarmHandler">
			<ref local="alarmHandler" />
		</property>
	</bean>
......

 

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配置中进行引入:

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

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

 

  • 大小: 28.1 KB
  • 大小: 29.6 KB
  • 大小: 39.6 KB
  • 大小: 41 KB
  • 大小: 10.8 KB
  • 大小: 25.9 KB
  • 大小: 16 KB
  • 大小: 21.5 KB
  • 大小: 25.1 KB
分享到:
评论
1 楼 zhatl 2015-11-09  
请问event store的基于文件或者mixed的方式实现了没?

相关推荐

    canal客户端-canal.deployer-1.1.7-SNAPSHOT.tar.gz

    《深入理解Canal客户端:canal.deployer-1.1.7-SNAPSHOT.tar.gz剖析》 Canal,由阿里开源的一款高效、稳定的数据库增量日志订阅与消费组件,广泛应用于数据同步、实时数据接入等场景。在本篇文章中,我们将深入探讨...

    Linux下Canal安装和使用.doc

    Linux 下 Canal 安装和使用 Canal 是一个基于 MySQL 数据库增量日志解析的工具,提供增量数据订阅和消费。 Canal 的主要用途包括数据库镜像、数据库实时备份、索引构建和实时维护、业务 Cache 刷新、带业务逻辑的...

    canal.1.1.5包

    【标题】"canal.1.1.5包"指的是Canal项目的1.1.5版本的组件集合。Canal是阿里巴巴开源的一款基于MySQL数据库的数据变更发布与订阅系统,它能够实时捕获并同步数据库中的数据变化,常用于构建数据一致性、实时数据...

    canal.deployer-1.1.6

    《Canal Deployer 1.1.6:MySQL数据同步利器详解》 Canal Deployer是阿里巴巴开源的数据同步工具Canal的重要组成部分,主要用于部署和管理Canal实例。在1.1.6版本中,它提供了稳定高效的数据变更捕获与传输服务,...

    canal-canal-1.1.5-alpha-2.zip ;canal-server、adapter、admin

    canal-server(canal-deploy):可以直接监听MySQL的binlog,把自己伪装成MySQL的从库,只负责接收数据,并不做处理。 canal-adapter:相当于canal的客户端,会从canal-server中获取数据,然后对数据进行同步,可以...

    阿里canal组件:canal.deployer-1.1.7-SNAPSHOT.tar.gz

    阿里Canal是一款由阿里巴巴开源的、轻量级的数据变更订阅与推送组件,主要用来实现数据库的增量数据同步。在IT行业中,特别是在互联网公司,数据一致性是至关重要的,而Canal就是为了满足这种需求而诞生的。它能有效...

    canal 1.1.4 常用工具包

    canal.deployer-1.1.4.tar.gz canal.admin-1.1.4.tar.gz canal.adapter-1.1.4.tar.gz canal.example-1.1.4.tar.gz canal-canal-1.1.4.zip canal 全量工具包集合 https://juejin.cn/post/6864585112994971662

    canal-1.1.6

    【标题】"Canal-1.1.6" 是一个重要的数据库同步工具,主要用于实现MySQL数据的实时增量复制。在IT行业中,数据同步是确保多系统间数据一致性和实时性的关键环节,尤其在分布式系统、大数据处理和云计算环境中。Canal...

    springboot整合canal

    SpringBoot整合Canal是将阿里巴巴开源的数据库实时变更数据订阅与推送组件Canal与SpringBoot框架结合,以实现高效的数据同步。Canal主要用于数据库的实时增量数据同步,它能够监听MySQL数据库的binlog事件,当数据库...

    canal.adapter-1.1.6.zip

    【标题】"canal.adapter-1.1.6.zip" 提供的是Canal适配器的1.1.6版本,这是一个与数据库变更日志相关的软件组件。 【描述】"canal.adapter-1.1.6.zip" 指出这个压缩包包含的是Canal适配器的特定版本1.1.6,它是一个...

    canal-1.1.6-SNAPSHOT.rar

    【标题】"canal-1.1.6-SNAPSHOT.rar" 提供的是一个名为 Canal 的数据同步工具的特定版本,即 1.1.6-SNAPSHOT 版本。这个压缩包是针对 Java 开发环境,特别是 JDK 17 的安装文件。这意味着在使用前,你需要确保你的...

    canal.deployer-1.1.6.tar.gz

    《Canal Deployer 1.1.6:MySQL 数据库实时同步工具详解》 Canal Deployer 是阿里巴巴开源的一款高效、稳定、轻量级的 MySQL 数据库增量日志解析组件,其主要功能是实现 MySQL 数据库到其他系统(如 Elasticsearch...

    canal实现mysql到ES数据实时同步

    Canal包含三个主要组件:Canal Server、Canal Client和Canal Adapter。Canal Server负责监听MySQL的Binlog事件,并将这些事件转化为结构化的数据。Canal Client可以订阅并消费这些数据,而Canal Adapter则扮演着数据...

    canal安装包免费下载.mysql同步ES工具

    【标题】"Canal安装包免费下载:MySQL同步ES工具" 【描述】"这款工具无需复杂的配置,只需在服务器上解压即可使用,对于Windows用户同样便捷,无需积分即可获取。" 【知识点详解】 1. **Canal**: Canal是阿里...

    canal-canal-1.0.22_源码

    【canal-canal-1.0.22_源码】是阿里巴巴开源的数据库实时增量数据订阅与同步工具,主要用于实现MySQL到其他数据库或者数据存储系统的实时数据迁移、同步,常用于构建数据仓库、日志收集等场景。Canal的核心功能是...

    canal-1.1.5 全套

    包含canal全套资源包含以下 canal.adapter-1.1.5.tar.gz canal.admin-1.1.5.tar.gz canal.deployer-1.1.5.tar.gz canal.example-1.1.5.tar.gz

    canal.adapter-1.1.4.tar.gz

    《Canal Deployer 1.1.4:MySQL数据库监听利器》 Canal Deployer 是阿里巴巴开源的一个数据库增量日志订阅与消费组件,主要用于数据库的实时数据同步。在这个场景下,`canal.deployer-1.1.4.tar.gz` 文件扮演了关键...

    支持mysql5.6.19的canal版本

    MySQL的Canal是一款开源的数据库实时同步工具,它主要用于数据复制和数据变更事件的捕获。在本场景中,我们关注的是Canal与特定MySQL版本——5.6.19的兼容性问题。通常,数据库版本升级或降级可能会导致与现有同步...

    canal-1.1.5.zip

    《阿里巴巴开源项目Canal详解与应用》 Canal,由阿里巴巴开源的一款高性能、轻量级的MySQL数据库实时增量数据订阅和消费组件,主要用于实现数据库的数据变更实时同步到其他系统,如大数据处理、缓存更新等场景。在...

    canal.adapter-1.1.4.zip

    【标题】"Canal Adapter 1.1.4版本" Canal是阿里巴巴开源的一个数据库增量日志订阅与消费组件,主要用于实现数据库的实时数据同步。Canal Adapter是其配套的适配器模块,用于将Canal捕获到的数据库变更事件转化为...

Global site tag (gtag.js) - Google Analytics