浅谈Canal原理

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

Canal与DTS提供的功能基本相似
基于Mysql的Slave协议实时dump binlog流,解析为事件发送给订阅方。
单Canal instance,单DTS数据订阅通道均只支持订阅一个RDS,提供给一个消费者。
可以使用canal-client客户端进行消息消费。
也可以通过简单配置,也可以不需要自行使用canal-client消费,可以选择直接投递到kafka或者RocketMQ集群,用户只需要使用消息队列的consumer消费即可。
成功消费消息后需要进行Ack,以确保一致性,服务端则会维护客户端目前的消费位点。

Canal是怎么实现的?

在这里插入图片描述

MySQL的主从复制分成三步:

master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events,可以通过show binlog events进行查看);
slave将master的binary log events拷贝到它的中继日志(relay log);
slave重做中继日志中的事件,将改变反映它自己的数据。
在这里插入图片描述
canal 就是模拟了MySQL主从复制这个过程
canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送 dump 协议
MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
canal 解析 binary log 对象(原始为 byte 流)
在这里插入图片描述
canal 1.1.4开始支持admin管理,通过canal-admin为canal提供整体配置管理、节点运维等面向运维的功能,提供相对友好的WebUI操作界面,方便更多用户快速和安全的操作,替代了过去繁琐的配置文件管理。
多个canal-server可以组成集群模式,每个instance任务通过zookeeper在集群中实现高可用
通过多个集群,可以实现同步资源的物理隔离
可以直接抓取消费投递MQ,可以实现生产/消费解耦、消息堆积、消息回溯
可以抓取消费投递给canal-client,在用户的服务中进行消息处理,减少中间过程

Canal-server架构

在这里插入图片描述
server 代表一个 canal 运行实例,对应于一个 jvm进程
instance 对应于一个数据队列 (1个 canal server 对应 1…n 个 instance )
instance 下的子模块 :
eventParser: 数据源接入,模拟 slave 协议和 master 进行交互,协议解析
eventSink: Parser 和 Store 链接器,进行数据过滤,加工,分发的工作
eventStore: 数据存储
metaManager: 增量订阅 & 消费信息管理器

EventParser子模块

主要有两个核心组件组成:
CanalLogPositionManager:用来记录最新解析成功的binlog position信息,在canal重启后,作为起始位点
CanalHAController:支持Mysql主备,基于Heartbeat判断当前数据库连接的有效性,一旦主库失去心跳,就切换连接备库
EventParser从CanalHAController确定连接mysql的位置,然后通过LogPositionManager确定binlog解析位点的起点,最后便通过dump协议拉取binlog进行解析,把解析后的消息存入EventSink.

EventSink子模块

目前只提供了一个带有实际作用的实现:GroupEventSink
GroupEventSink用于将多个instance上的数据进行归并,常用于分库后的多数据源归并。

EventStore子模块

目前只实现了基于内存存储的MemoryEventStoreWIthBuffer
MemoryEventStoreWIthBuffer内部采用的是一个RingBuffer,我们可以理解为基于内存的高性能消息队列。如果使用canal-client直接消费canal-server的数据,那么只能通过这个消息队列做一定程度的消息堆积。
在这里插入图片描述

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

这些位点信息通过MetaManager进行管理

源码概览

在这里插入图片描述
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相关配置,非常好用。

模块关联

在这里插入图片描述

server模块是服务端核心模块,用来拉取binlog的实时变更,然后投递到客户端。
server可以通过配置,选择投递到MQ,或者是启动一个netty,让客户端来拉取。
client-adapter就是一个独立部署到服务,可以直接拉取canal-server的消息(或者拉取mq的消息),转发到对应RDS/Redis/HBase,当然,你也可以自己实现一个转发到redis的adapter
admin模块是管理控制台,可以调度canal-server组成一个个集群实现instance的高可用、可以更改server、instance的配置信息。
Canal-server模块局部关系,包括deployer模块、server模块、instance模块、parser模块、sink模块、store模块、meta模块、client模块。
在这里插入图片描述

deployer模块是一个启动模块,可以启动canal-server。
一个server是一个独立应用,是一个jvm进程,里面可以有多个instance对象。
instance内包括了parser、sink、store、meta
parser负责获取binlog变更,然后sink将parser获取的binlog变更转换为event,存入store。
meta是元信息管理器
client模块可以内嵌入你的应用,用来消费canal-server的消息事件。

实践

在这里插入图片描述
集群管理
管理canal-server集群,核心配置:

#canal-admin
canal.admin.manager = 172.16.66.181:18200
canal.admin.port = 11110
canal.admin.user = admin
canal.admin.passwd = 6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
canal.zkServers = 172.16.86.180:2181,172.16.66.181:2181,172.16.66.182:2181
# binlog filter config
canal.instance.filter.druid.ddl = true
canal.instance.filter.query.dcl = false
canal.instance.filter.query.dml = false
canal.instance.filter.query.ddl = false
#MQ Properties
rocketmq.producer.group = canal_default_producer_group
rocketmq.enable.message.trace = false
rocketmq.customized.trace.topic =
rocketmq.namespace =
rocketmq.namesrv.addr = rmq-cn-4xl3ctfi70a-vpc.cn-shenzhen.rmq.aliyuncs.com:8080
rocketmq.retry.times.when.send.failed = 3

Server管理
在这里插入图片描述
Instance管理
在这里插入图片描述

# position info
canal.instance.master.address=rm-wz90f49ny39o6je81.mysql.rds.aliyuncs.com:3306
canal.instance.master.journal.name=
canal.instance.master.position=
canal.instance.master.timestamp=
# username/password
canal.instance.dbUsername=canal
canal.instance.dbPassword=Canal2023
canal.instance.connectionCharset = UTF-8
# table regex
canal.instance.filter.regex= frxs_erp_basedata\\.wproducts
# mq config
canal.mq.topic=tp_default_product_change
# dynamic topic route by schema or table regex
canal.mq.dynamicTopic=tp_product_change:frxs_erp_basedata\\.wproducts

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/48382.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue2学习笔记9 - 通过观察vue实例中的data,理解Vue中的数据代理

接着上一节,学一学vue中的数据代理。学vue这几天,最大的感受就是,名词众多,听得发懵。。不过,深入理解之后,其实说得都是一回事。 在Vue中,数据代理是指在实例化Vue对象时,将data对…

神经网络模型实现(训练、测试)

目录 一、神经网络骨架:二、卷积操作:三、卷积层:四、池化层:五、激活函数(以ReLU为例):六、模型搭建:七、损失函数、梯度下降:八、模型保存与加载:九、模型训…

基于RFID的课堂签到系统设计

1.简介 基于RFID的课堂签到系统设计是一种利用无线射频识别(RFID)技术实现课堂自动签到的系统。这种系统通过RFID标签(通常是学生携带的卡片或手环等)与安装在教室内的RFID读写器之间的无线电信号进行数据交换,从而实现…

移动设备安全革命:应对威胁与解决方案

移动设备已成为我们日常工作和家庭生活中不可或缺的工具,然而,对于它们安全性的关注和投资仍然远远不够。本文深入分析了移动设备安全的发展轨迹、目前面临的威胁态势,以及业界对于这些安全漏洞响应迟缓的深层原因。文中还探讨了人们在心理层…

Java跨平台的原理是什么?JDK,JRE,JVM三者的作用和区别?xxx.java和xxx.class有什么区别?看这一篇就够了

目录 1. Java跨平台相关问题 1.1 什么是跨平台(平台无关性)? 1.2 跨平台(平台无关性)的好处? 1.3 编译原理基础(Java程序编译过程) 1.4Java跨平台的是实现原理? 1.4.1 JVM(Java虚拟机) 1.4.2 Class文件 1.4.3 …

485开关量采集模块16路I/O输入输出ModbusRTU协议—DAM-3950A

品牌:阿尔泰科技 型号:DAM-3950A 概述: DAM-3950A为16路隔离数字量输入,6路C型10路A型信号继电器输出模块,RS485通讯接口,带有标准ModbusRTU协议。配备良好的人机交互界面,使用方便&#xff…

Linux 文件安装的mysql 启动

1、找到my.cnf 2、确定文件类容: 并确保这些重要的配置:basedir 、datadir、socket 文件或目录都存在 3、找到mysqld 位置 4、启动mysqld mysqld --defaults-file/etc/my.cnf --usermysql

c++基础(类和对象中)(类的默认成员函数)

目录 一.构造函数(类似初始化) 1.概念 2.构造函数的特点 二.析构函数(类似 销毁对象/空间) 三.拷贝构造函数(类似复制粘贴的一种 初始化 ) 1.概念: 2.拷贝构造的特点: 四.赋值运算符重载&#xff08…

level 6 day2-3 网络基础2---TCP编程

1.socket(三种套接字:认真看) 套接字就是在这个应用空间和内核空间的一个接口,如下图 原始套接字可以从应用层直接访问到网络层,跳过了传输层,比如在ubtan里面直接ping 一个ip地址,他没有经过TCP或者UDP的数…

华为OD机试(C卷,200分)- 二叉树计算

题目描述 给出一个二叉树如下图所示: 请由该二叉树生成一个新的二叉树,它满足其树中的每个节点将包含原始树中的左子树和右子树的和。 左子树表示该节点左侧叶子节点为根节点的一颗新树;右子树表示该节点右侧叶子节点为根节点的一颗新树。…

食南之徒~马伯庸

◆ 第一章 >> 老赵,这你就不懂了。过大于功,要受罚挨打,不合算;功大于过,下回上司有什么脏活累活,第一时间会想到你,也是麻烦多多。只有功过相抵,上司既挑不出你的错&#xf…

MMU(内存管理单元)

概述 MMU 即内存管理单元,是用硬件电路逻辑实现的一个地址转换器件,它负责接受虚拟地址和地址关系转换表,以及输出物理地址 线性地址 由于保护模式的内存模型是分段模型,它并不适合于 MMU 的分页模型,所以我们要使用…

springcloud-config客户端启用服务发现报错找不到bean EurekaHttpClient

背景 在对已有项目进行改造的时候,集成SpringConfigStarter,编写完bootstrap.yml,在idea 启动项中编辑并新增VM options -Dspring.cloud.config.discovery.enabledtrue,该版本不加spring不会从configService获取信息,…

三、GPIO口

我们在刚接触C语言时,写的第一个程序必定是hello world,其他的编程语言也是这样类似的代码是告诉我们进入了编程的世界,在单片机中也不例外,不过我们的传统就是点亮第一个LED灯,点亮电阻,电容的兄弟&#x…

[CSS] 浮动布局的深入理解与应用

文章目录 浮动的简介元素浮动后的特点解决浮动产生的影响浮动后的影响解决浮动产生的影响 浮动相关属性实际应用示例示例1:图片与文字环绕示例2:多列布局示例3:响应式布局 总结 浮动布局是CSS中一种非常强大的布局方式,最初设计用…

java项目(knife4j使用,静态资源未放在static资源包下,公共字段自动填充,Spring Cache与Spring Task)

Knife4j(生成接口文档) 使用swagger你只需要按照它的规范去定义接口及接口相关的信息,就可以做到生成接口文档,以及在线接口调试页面。官网:https://swagger.io/ Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。…

JMeter请求导出Excel

前言 今天记录一个使用JMeter模拟浏览器请求后端导出,并下载Excel到指定位置的过程 创建请求 同样先创建一个线程组,再创建一个请求,设置好请求路径,端口号等 查看结果树 右键--添加--监听器--查看结果树 这里可以查看&#…

Windows搭建RTMP视频流服务器

参考了一篇文章,见文末。 博客中nginx下载地址失效,附上一个有效的地址: Index of /download/ 另外,在搭建过程中,遇到的问题总结如下: 1 两个压缩包下载解压并重命名后,需要 将nginx-rtmp…

【Linux】编辑器vscode与linux的联动

1.vscode简单学习 vscode是编辑器,可以写各种语言的程序 下载链接:Download Visual Studio Code - Mac, Linux, Windows 来用一下vscode 我们保存了就能在我们的那个文件夹里面看到这个 这个就是编辑器,跟我们的文本文件好像差不多&#…

栈及栈的应用(有效的括号 力扣20)

栈的概念 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 画个图理解一下 咱们可以观…