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

「从零单排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,将消费信息投递到ES\hbase\rdb等下游。
  • 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…(历史文章查阅非常方便)

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2614.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • HONOR荣耀50/荣耀50Pro怎么解锁huawei 荣耀50pro屏幕锁开机锁激活设备锁了应该如何强制解除鸿蒙系统刷机解锁方法流程步骤不开机跳过锁屏移除锁定进系统方法经验

    HONOR荣耀50/荣耀50Pro怎么解锁huawei 荣耀50pro屏幕锁开机锁激活设备锁了应该如何强制解除鸿蒙系统刷机解锁方法流程步骤不开机跳过锁屏移除锁定进系统方法经验今天带来一台用户华为荣耀50手机强制清除华为账号锁案例分享,这个台手机是用户公司手机,由于前使用者离职后未能退出手机的华为账号和锁屏密码,导致手机无法使用。自己通过简单的恢复出厂设置后,发现手机有华为账号锁无法激活手机,这才联系到刷机爱好者技术人员,给予远程强制刷机移除华为荣耀60的账号锁。在此提醒广大用户,登录的华为账号建议绑定经常使用的手机号码,防止无法找回密码从而到时手机无法使用。在刷机解锁过程中需要准备以下工具:链接:百度网盘请输入提取码提取码:8888备用下载连接:yun.p

    2022年6月19日
    481
  • linux 重启nginx 服务[通俗易懂]

    linux 重启nginx 服务[通俗易懂]第一步:进入nginx安装目录默认安装目录为/usr/local/nginx/sbin/nginx这里我的安装路径为/app/nwom/Inspur/apps/tools-nginx第二步:查看进程ps-ef|grepnginx第三步:杀掉原进程从主进程开始(上图圈红的为主进程)kill-92386kill-9238723882389239023912392239323942395239623972398第四步:启动进程启动方式1:./ngin

    2022年8月13日
    6
  • linux 查看java的pid,linux 查看java进程pid「建议收藏」

    linux 查看java的pid,linux 查看java进程pid「建议收藏」linux查看java进程pid[2021-01-3021:05:24]简介:建站服务器这篇文章主要介绍了linux中如何查看系统进程,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下linux查看端口被哪个进程占用的方法:1、使用“lsof-i:端口号”来查看;2、使用“netstat-tunlp|grep端口号”来查看。linux查看端口被哪个进程占…

    2022年8月24日
    9
  • 数据归一化及三种方法(python)

    数据归一化及三种方法(python)数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。以下是三种常用的归一化方法:min-max标准化(Min-MaxNormalization)也称为离差标准化,…

    2022年6月23日
    45
  • java九九乘法表代码_java 输出九九乘法表口诀的代码「建议收藏」

    java九九乘法表代码_java 输出九九乘法表口诀的代码「建议收藏」题目:输出9*9口诀。程序分析:分行与列考虑,共9行9列,i控制行,j控制列。程序设计:publicclassjiujiu{publicstaticvoidmain(String[]args){inti=0;intj=0;for(i=1;i<=9;i++){for(j=1;j<=9;j++)System.out.print(i+”*”+j+”=”+i*j+”\t”)…

    2022年7月15日
    17
  • XSHELL安装指南

    XSHELL安装指南开发环境部署目的:利用ssh远程登陆服务器(在windows系统下远程连接linux)下载XSHELL7XSHELL7下载网址:https://www.netsarang.com/zh/xshell/点击“下载”点击“免费授权界面”以上是XSHELL7的下载过程然后找到右键“以管理员身份运行”一上来会出现这种错误,先点击“是(Y)”过程中一直点击“下一步”,以及“我同意”类似的,然后选择个安装路径就可以没啥特殊的。到最后一切顺利的话会显示下面这样的界面一般通向成功的道

    2025年6月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号