zoukankan      html  css  js  c++  java
  • 「从零单排canal 03」 canal源码分析大纲

    在前面两篇中,我们从基本概念理解了canal是一个什么项目,能应用于什么场景,然后通过一个demo体验,有了基本的体感和认识。

    从这一篇开始,我们将从源码入手,深入学习canal的实现方式。了解canal相关功能的实现方式,其中有很多机制是非常值得深入了解的,从代码实现角度去学习实时数据订阅与同步的实现与核心技术点。当然,如果要在生产中使用这个开源项目,了解源码更是必不可少,是解决问题和新特性定制的前提条件。

    本文使用的版本是1.1.4,这也是笔者写这篇博客时的最新稳定版。

    1.准备工作

    下载源码

    git clone https://github.com/alibaba/canal.git
    

    切换到1.1.4这个tag

    git checkout canal-1.1.4
    或者可以关注我的源码注释版本(正在不断更新中)
    https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_reading/canal

    2.canal项目模块介绍

    canal项目是基于maven构建的,将不同的功能模块划分了不同的子模块。

    我们可以简单执行可执行模块deployer,也可以将模块通过maven依赖的方式,将你需要的子模块引入到你自己的项目中进行使用开发。

    「从零单排canal 03」 canal源码分析大纲

     

    简单介绍下核心模块的功能:

    • deployer模块:独立部署模块,用于canal-server的独立启动,包括本地配置解析、拉取远程配置、启动canal-server。
    • server模块:canal-server的实现逻辑,一个canal-server一般是一个jvm进程。重点关注两种canal-server的实现方式,内嵌型的canalServerEmbed和独立使用的canalServerWithNetty。新版本中新增了直接对接mq的canal-server实现。
    • instance模块:具体实时订阅任务是由一个个instance组成的,每个canal-server中可以同时运行多个instance。instance由parser、sink、store三个重点模块组成。
    • parser模块:数据源接入,模拟slave协议和master进行交互,协议解析。parser模块依赖于dbsync、driver模块。
    • sink模块:将parser抓取到的数据,进行过滤,加工,然后发送到store模块进行存储。核心接口为CanalEventSink。
    • store模块:数据存储模块,类似内存模式到消息队列,本质上是一个RingBuffer。核心接口为CanalEventStore。
    • meta模块:增量订阅&消费信息管理器,核心接口为CanalMetaManager,主要用于记录canal消费到的mysql binlog的位置
    • client模块:项目最早的消费客户端,通过将client模块引入自己的项目中,然后直接消费canal-server获取的数据。
    • client-adapter模块:1.1.x后新出的模块,可以独立部署为canal-server的消费服务端,是一个springboot项目。通过SPI机制,能够加载不同plugins,将消费信息投递到EShbase db等下游。
    • admin模块:1.1.x新出的模块,可以独立部署为canal-server的控制台,配置canal-server、instance相关配置,非常好用。

    3.模块关联

    那这些模块之间是如何组织、如何关联的呢?

    我们从整体到局部来看一下。

    整体架构关联,包括admin模块、server模块、client-adapter模块

    「从零单排canal 03」 canal源码分析大纲

     

    1)server模块是服务端核心模块,用来拉取binlog的实时变更,然后投递到客户端。

    2)server可以通过配置,选择投递到MQ,或者是启动一个netty,让客户端来拉取。

    3)client-adapter就是一个独立部署到服务,可以直接拉取canal-server的消息(或者拉取mq的消息),转发到对应RDS/Redis/HBase,当然,你也可以自己实现一个转发到redis的adapter

    4)admin模块是管理控制台,可以调度canal-server组成一个个集群实现instance的高可用、可以更改server、instance的配置信息。

    Canal-server模块局部关系,包括deployer模块、server模块、instance模块、parser模块、sink模块、store模块、meta模块、client模块。

    「从零单排canal 03」 canal源码分析大纲

     

    1)deployer模块是一个启动模块,可以启动canal-server。

    2)一个server是一个独立应用,是一个jvm进程,里面可以有多个instance对象。

    3)instance内包括了parser、sink、store、meta

    4)parser负责获取binlog变更,然后sink将parser获取的binlog变更转换为event,存入store。

    5)meta是元信息管理器

    6)client模块可以内嵌入你的应用,用来消费canal-server的消息事件。

    基本上核心模块的关系就是这样了,后续会按照模块的维度进行源码分析,敬请期待。

    都看到最后了,原创不易,点个关注,点个赞吧~
    文章持续更新,可以微信搜索「阿丸笔记 」第一时间阅读,回复关键字【学习】有我准备的一线大厂面试资料。
    知识碎片重新梳理,构建Java知识图谱:github.com/saigu/JavaK…(历史文章查阅非常方便)
  • 相关阅读:
    SharePoint Timer Job
    内容查询部件 之 简单美化
    SharePoint list Search
    Sharepoint 2010 Content Search Webpart
    如何添加Features,处理自己的程序
    SharePoint 读取 UserMulti 类型的字段
    SharePoint 账号
    配制备用访问映射
    项目管理汇总
    Altium Desgner软件,PCB设计中铺铜的作用
  • 原文地址:https://www.cnblogs.com/awan-note/p/13180281.html
Copyright © 2011-2022 走看看