1.简介

canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据 订阅 和 消费。应该是阿里云DTS(Data Transfer Service)的开源版本。

2.提供的能力

Canal与DTS提供的功能基本相似:

1)基于Mysql的Slave协议实时dump binlog流,解析为事件发送给订阅方。

2)单Canal instance,单DTS数据订阅通道均只支持订阅一个RDS,提供给一个消费者。

3)可以使用canal-client客户端进行消息消费。

4)也可以通过简单配置,也可以不需要自行使用canal-client消费,可以选择直接投递到kafka或者RocketMQ集群,用户只需要使用消息队列的consumer消费即可。

5)成功消费消息后需要进行Ack,以确保一致性,服务端则会维护客户端目前的消费位点。

3.工作原理

MySQL的主从复制分成三步:

  • master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events,可以通过show binlog events进行查看);
  • slave将master的binary log events拷贝到它的中继日志(relay log);
  • slave重做中继日志中的事件,将改变反映它自己的数据。

canal 就是模拟了这个过程。

  • canal模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送 dump 协议;
  • MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal );
  • canal 解析 binary log 对象(原始为 byte 流);

4. canal 架构

4.1 admin版本整体架构

canal 1.1.4开始支持admin管理,通过canal-admin为canal提供整体配置管理、节点运维等面向运维的功能,提供相对友好的WebUI操作界面,方便更多用户快速和安全的操作,替代了过去繁琐的配置文件管理。

整体部署架构如下。

  • 多个canal-server可以组成集群模式,每个instance任务通过zookeeper在集群中实现高可用
  • 通过多个集群,可以实现同步资源的物理隔离
  • 可以直接抓取消费投递MQ,可以实现生产/消费解耦、消息堆积、消息回溯
  • 可以抓取消费投递给canal-client,在用户的服务中进行消息处理,减少中间过程

4.2 canal-server架构

说明:

  • server代表一个canal-server运行实例,对应于一个jvm
  • instance对应于一个数据队列,是真正的变更抓取的实体 (1个server可以对应多个instance)

Instance模块

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

1)EventParser子模块

EventParser模块的类图设计如下

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

  • CanalLogPositionManager:记录binlog最后一次解析成功位置信息,主要是描述下一次canal启动的位点
  • CanalHAController:支持Mysql主备,判断当前该连哪个mysql(基于Heartbeat实现,主库失去心跳则连备库)

EventParser根据HAController获知连到哪里,通过LogPositionManager获知从哪个位点开始解析,之后便通过Mysql Slave协议拉取binlog进行解析,推入EventSink

2)EventSink子模块

目前只提供了一个带有实际作用的实现:GroupEventSink

GroupEventSink用于将多个instance上的数据进行归并,常用于分库后的多数据源归并。

3)EventStore子模块

EventStore的类图如下

官方提供的实现类是
MemoryEventStoreWIthBuffer,内部采用的是一个RingBuffer:

  • Put : Sink模块进行数据存储的最后一次写入位置
  • Get : 数据订阅获取的最后一次提取位置
  • Ack : 数据消费成功的最后一次消费位置

这些位点信息通过MetaManager进行管理。这也解释了为什么一个canal instance只能支撑一个消费者:EventStore的RingBuffer只为一个消费者维护信息。

4.3 客户端使用

数据格式已经在前文给出,Canal和DTS客户端均采取:

拉取事件 -> 消费 -> 消费成功后ACK

这样的消费模式,并支持消费不成功时进行rollback,重新消费该数据。

下面是一段简单的客户端调用实例(略去异常处理):

// 创建CanalConnector, 连接到localhost:11111

CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress(AddressUtils.getHostIp(),11111), destination, "", "");

connector.connect();    // 连接

connector.subscribe();  // 开始订阅binlog

// 开始循环拉取

while (running) {

    Message message = connector.getWithoutAck(1024); // 获取指定数量的数据

    long batchId = message.getId();

    for (Entry entry : message.getEntries()){

        // 对每条消息进行处理

    }

    connector.ack(batchId); // ack

}

5.总结分析

5.1 优点

1)性能优异、功能全面

  • canal 1.1.x 版本(release_note),性能与功能层面有较大的突破,重要提升包括:
  • 整体性能测试&优化,提升了150%. #726
  • 原生支持prometheus监控 #765
  • 原生支持kafka消息投递 #695
  • 原生支持aliyun rds的binlog订阅 (解决自动主备切换/oss binlog离线解析) (无法拒绝它的理由!)
  • 原生支持docker镜像 #801

2)运维方便

  • canal 1.1.4版本,迎来最重要的WebUI能力,引入canal-admin工程,支持面向WebUI的canal动态管理能力,支持配置、任务、日志等在线白屏运维能力
  • Standalone的一体化解决方案,无外部服务依赖,运维更简单,在某种程度上也意味着更稳定。
  • 开箱即用,节约开发与定制成本。
  • 有良好的管理控制平台与监控系统(如果你已经有promethus监控,可以秒接canal监控)

3)多语言支持

  • canal 特别设计了 client-server 模式,交互协议使用 protobuf 3.0 , client 端可采用不同语言实现不同的消费逻辑
  • canal 作为 MySQL binlog 增量获取和解析工具,可将变更记录投递到 MQ 系统中,比如 Kafka/RocketMQ,可以借助于 MQ 的多语言能力

5.2 缺点

  • 单instance/订阅通道只支持订阅单个数据库,并只能支持单客户端消费。每当我们需要新增一个消费端->MySQL的订阅:对于Canal而言,就要给MySQL接一个“Slave”,可能会对主库有一定影响。
  • 消息的Schema很弱,所有消息的Schema均相同,客户端需要提前知道各个表消息的Schema与各字段的上下文才能正确消费。

好了,花了10分钟应该对canal有大致了解了,下一期,阿丸计划手把手教你搭建canal集群和admin管理平台,记得关注哦。

都看到最后了,原创不易,点个关注,点个赞吧~

知识碎片重新梳理,构建Java知识图谱:github.com/saigu/JavaK…(历史文章查阅非常方便)

「从零单排canal 01」 canal 10分钟入门(基于1.1.4版本)的更多相关文章

  1. 「从零单排HBase 12」HBase二级索引Phoenix使用与最佳实践

    Phoenix是构建在HBase上的一个SQL层,能让我们用标准的JDBC APIs对HBase数据进行增删改查,构建二级索引.当然,开源产品嘛,自然需要注意“避坑”啦,阿丸会把使用方式和最佳实践都告 ...

  2. 「从零单排HBase 09」Hbase的那些数据结构和算法

    在之前学习MySQL的时候,我们知道存储引擎常用的索引结构有B+树索引和哈希索引. 而对HBase的学习,也离不开索引结构的学习,它使用了一种LSM树((Log-Structured Merge-Tr ...

  3. 「从零单排HBase 04」HBase高性能查询揭秘

    先给结论吧:HBase利用compaction机制,通过大量的读延迟毛刺和一定的写阻塞,来换取整体上的读取延迟的平稳. 1.为什么要compaction 在上一篇 HBase读写 中我们提到了,HBa ...

  4. 「从零单排HBase 05」核心特性region split

    HBase拥有出色的扩展性,其中最依赖的就是region的自动split机制. 1.split触发时机与策略 前面我们已经知道了,数据写入过程中,需要先写memstore,然后memstore满了以后 ...

  5. 「从零单排HBase 06」你必须知道的HBase最佳实践

    前面,我们已经打下了很多关于HBase的理论基础,今天,我们主要聊聊在实际开发使用HBase中,需要关注的一些最佳实践经验. 1.Schema设计七大原则 1)每个region的大小应该控制在10G到 ...

  6. 「从零单排canal 04」 启动模块deployer源码解析

    基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...

  7. 「从零单排canal 05」 server模块源码解析

    基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...

  8. 「从零单排canal 06」 instance模块源码解析

    基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...

  9. 「从零单排canal 07」 parser模块源码解析

    基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...

随机推荐

  1. Web_php_unserialize

    0x01 <?php class Demo { private $file = 'index.php'; public function __construct($file) { $this-& ...

  2. iOS中的系统目录(Documents、tmp、Library)、RunLoop的一些知识点

    学习内容 欢迎关注我的iOS学习总结--每天学一点iOS:https://github.com/practiceqian/one-day-one-iOS-summary 实现轮播图需要注意的地方 需要 ...

  3. 八个开源的 Spring Boot 前后端分离项目,一定要收藏!

    八个开源的 Spring Boot 前后端分离项目 最近前后端分离已经在慢慢走进各公司的技术栈,不少公司都已经切换到这个技术栈上面了.即使贵司目前没有切换到这个技术栈上面,我们也非常建议大家学习一下前 ...

  4. Spring AOP实现接口验签

    因项目需要与外部对接,为保证接口的安全性需要使用aop进行方法的验签; 在调用方法的时候,校验外部传入的参数进行验证, 验证通过就执行被调用的方法,验证失败返回错误信息: 不是所有的方法都需要进行验签 ...

  5. 使用vue实现购物车功能

    页面效果图: html代码: <div class="shop-car" id='car'> <div class="count-custom" ...

  6. js 前端实现文件流下载的几种方式

    后端是用Java写的一个下载的接口,返回的是文件流,需求:点击,请求,下载 利用iframe实现文件流下载 //把上一次创建的iframe删掉,不然随着下载次数的增多页面上会一堆的iframe var ...

  7. Python的概述

    官网:https://www.python.org/ 诞生:1989年底诞生,1990年V1发布,2000年V2发布,2008年V3发布(不兼容V2),2017年随着AI的崛起而流行 特点:简单.跨平 ...

  8. mysql小白系列_09 mysql性能优化关键点

    一 服务器参数调优,有哪些关键点? 1. 应用访问优化 优化方法 性能提升效果 优化成本 说明 减少数据访问能不访问就不访问-减少磁盘IO 1~1000 低 缓存服务器缓存mysql数据,Redis. ...

  9. Null passed to a callee that requires a non-null argument

    OC中定义的方法参数默认是不为空的,如果能够为空需要手动指定__nullable ,我想这个警告是提示开发者警惕可能空参数

  10. view组件的封装是否需要特有模型?

    必须需要. 现在接手的老项目,所有自定义组件全部使用的原始的全量数据,作为模型给view用来展示. 结果发现,基本数据的选择错误,需要选择另一个数据作为基本数据,这导致一个很麻烦的问题,需要改动全部的 ...