Navigation

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups

    canal源码解析系列(1):canal源码分析简介

    技术文章分享
    canal 源码解析
    1
    1
    700
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • CloudCanal-万少
      CloudCanal-万少 last edited by CloudCanal-万少

      系列文章索引:

      1. canal源码分析简介
      2. deployer模块(上)
      3. deployer模块(下)
      4. server模块
      5. instance模块
      6. store模块(上)
      7. store模块(下)
      8. filter模块
      9. driver模块

      基本介绍

      canal是阿里巴巴开源的mysql数据库binlog的增量订阅&消费组件。项目github地址为:https://github.com/alibaba/canal。

      本教程是从源码的角度来分析canal,适用于对canal有一定基础的同学。本教程使用的版本是1.0.24,这也是笔者写这篇教程时的最新稳定版,关于canal的基础知识可以参考:https://github.com/alibaba/canal/wiki。

      下载源码

      下载

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

      切换到canal-1.0.24这个tag

      git checkout canal-1.0.24
      

      源码模块划分

      canal是基于maven构建的,总共分成了14个模块,如下所示:

      f09c1b01-7824-4ca6-9012-e7b7859cda09-image.png

      模块虽多,但是每个模块的代码都很少。各个模块的作用如下所示:

      common模块:主要是提供了一些公共的工具类和接口。

      client模块:canal的客户端。核心接口为CanalConnector

      example模块:提供client模块使用案例。

      protocol模块:client和server模块之间的通信协议

      deployer:部署模块。通过该模块提供的CanalLauncher来启动canal server

      server模块:canal服务器端。核心接口为CanalServer

      instance模块:一个server有多个instance。每个instance都会模拟成一个mysql实例的slave。instance模块有四个核心组成部分:parser模块、sink模块、store模块,meta模块。核心接口为CanalInstance

      parser模块:数据源接入,模拟slave协议和master进行交互,协议解析。parser模块依赖于dbsync、driver模块。

      driver模块和dbsync模块:从这两个模块的artifactId(canal.parse.driver、canal.parse.dbsync),就可以看出来,这两个模块实际上是parser模块的组件。事实上parser 是通过driver模块与mysql建立连接,从而获取到binlog。由于原始的binlog都是二进制流,需要解析成对应的binlog事件,这些binlog事件对象都定义在dbsync模块中,dbsync 模块来自于淘宝的tddl。

      sink模块:parser和store链接器,进行数据过滤,加工,分发的工作。核心接口为CanalEventSink

      store模块:数据存储。核心接口为CanalEventStore

      meta模块:增量订阅&消费信息管理器,核心接口为CanalMetaManager,主要用于记录canal消费到的mysql binlog的位置,

      下面再通过一张图来说明各个模块之间的依赖关系:
      64e8af2b-d9d5-45ec-9f79-f29ae1c1dcad-image.png
      通过deployer模块,启动一个canal-server,一个cannal-server内部包含多个instance,每个instance都会伪装成一个mysql实例的slave。client与server之间的通信协议由protocol模块定义。client在订阅binlog信息时,需要传递一个destination参数,server会根据这个destination确定由哪一个instance为其提供服务。

      在分析源码的时候,本人也是按照模块来划分的,基本上一个模块对应一篇文章。

      本文转载自田守枝的Java技术博客,感谢作者的分享

      1 Reply Last reply Reply Quote 0
      • 1 / 1
      • First post
        Last post
      Copyright © 2020 ClouGence, Inc.备案号:浙ICP备20007605号-2