百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

MySQL 数据同步神器 - Canal 入门篇

itomcoil 2025-09-11 21:04 5 浏览

前言

想必做过商品服务都是将商品相关的信息和价格保存在数据库中,例如 MySql,当有商品的信息和价格一条数据新增或修改需要马上将数据同步到 kafka 中或其他的数据库中,这时候就需要借助阿里开源出来的 Canal 来实现我们功能。

什么是 canal

官方描述:canal,译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费

简单理解 canal 主要是针对 MySQL 增量数据同步工具,将实时数据同步到 MysqlKafkaElasticsearchHbaseRocketMQPulsar

canal

canal 使用场景

  • 数据库镜像
  • 数据库实时备份
  • 索引构建和实时维护(拆分异构索引、倒排索引等)
  • 业务 cache 刷新
  • 带业务逻辑的增量数据处理

注意: 当前 Canal 支持的 MySQL 版本有 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x

canal 工作原理

了解 canal 工作原理前,我们需要想知道 MySQL 主备复制原理

MySQL 主备复制原理

  1. MySQL master 将数据变更写入二进制日志(binary log, 其中记录叫做二进制日志事件 binary log events,可以通过 show binlog events 进行查看)
  2. MySQL slavemasterbinary log events 拷贝到它的中继日志(relay log)
  3. MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据

canal 工作原理也就是基于MySQL 主备复制原理,因此也就相对比较简单:

  1. canal 模拟 mysql slave 的交互协议,伪装自己为 mysql slave,向 mysql master 发送 dump 协议
  2. mysql master 收到 dump 请求,开始推送 binary logslave(也就是 canal)
  3. canal 解析 binary log 对象(原始为 byte 流)

canal 架构

1.1.4 canal 整体架构,主要包括 admin模块、server模块、instance模块、client-adapter模块、RDS、zk、消息中间件等

1.1.4 canal 架构

说明:

  • canal-admin:设计上是为 canal 提供整体配置管理、节点运维等面向运维的功能,提供相对友好的 WebUI 操作界面,方便更多用户快速和安全的操作
  • canal-server cluster:同一个集群中的多台 canal-server,一个集群中有多个 instance 实例任务,每个 instance 实例通过 zookeeper 在集群中实现高可用,一般我们是通过2台 canal-server 组成集群模式
  • canal-server:一个 canal-server 里可以运行多个 instance 实例任务
  • instance:一个实际运行订阅 mysql 的数据队列(核心模块),包括了 EventPaserEventSinkEventStore等组件
  • canal-client:用于消费 instance 订阅 mysql 的数据队列,RocketMQ 投递的方式是一样的(内嵌 client 将消费到的数据直接投递到 RocketMQ中,业务开发只需要订阅 RocketMQ 消息即可)。不管是内嵌 client 的方式,还是 canal-client 的方式都是 基于Mysql 的 Slave 协议实时 dump binlog 流,解析为事件发送给订阅方。数据对象格式:EntryProtocol.proto
Entry
    Header
        logfileName [binlog文件名]
        logfileOffset [binlog position]
        executeTime [binlog里记录变更发生的时间戳]
        schemaName [数据库实例]
        tableName [表名]
        eventType [insert/update/delete类型]
    entryType   [事务头BEGIN/事务尾END/数据ROWDATA]
    storeValue  [byte数据,可展开,对应的类型为RowChange]
RowChange
isDdl        [是否是ddl变更操作,比如create table/drop table]
sql        [具体的ddl sql]
rowDatas    [具体insert/update/delete的变更数据,可为多条,1个binlog event事件可对应多条变更,比如批处理]
beforeColumns [Column类型的数组]
afterColumns  [Column类型的数组]


Column
index          [column序号]
sqlType          [jdbc type]
name          [column name]
isKey          [是否为主键]
updated          [是否发生过变更]
isNull          [值是否为null]
value          [具体的内容,注意为文本]

说明:

  • 可以提供数据库变更前和变更后的字段内容,针对 binlog 中没有的name,isKey 等信息进行补全
  • 可以提供 ddl 的变更语句

canal-server 架构

说明:

  • server 代表一个 canal 运行实例,对应于一个 jvm
  • instance 对应于一个数据队列 (1个 server 对应1..n个 instance)

instance模块:

  • eventParser :数据源接入,模拟 slave 协议和 master 进行交互:dump binlog、协议解析
  • eventSinkParserStore 链接器,进行数据过滤,加工,分发的工作
  • eventStore :存储 sink 模块处理后的数据
  • metaManager :增量订阅&消费信息管理器

知识科普 -- MySQL 的 Binary Log 简介

Mysql 官方 The Binary Log 详细介绍

  • mysqlbinlog 是多文件存储,定位一个 LogEvent 需要通过 binlog filename + binlog position,进行定位
  • mysqlbinlog 数据格式,按照生成的方式,主要分为:statement-basedrow-basedmixed
mysql> show variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+
1 row in set (0.00 sec)

binlog 结构解析图

binlog 结构解析

想必现在大家也算是对 canal 已经有了大致的了解,后续方木会带着大家 手把手地搭建整套 canal 集群: canal+zookeeper+kafka+mysql



我的微信公众号:Java架构师进阶编程


专注分享Java技术干货,包括JVM、SpringBoot、SpringCloud、数据库、架构设计,还有我整理的上百份面试题库,持续更新中!期待你的关注!


相关推荐

python数据分析中你必须知道的陷阱和技巧

数据分析是一门既有趣又有挑战的技能,它可以帮助我们从海量的数据中提取有价值的信息,为决策提供支持。但是,数据分析也不是一件轻松的事情,它需要我们掌握一定的编程、统计、可视化等知识,同时也要注意避免一些...

python常见五大坑及避坑指南_python解决什么问题

python是一门非常流行和强大的编程语言,但是也有一些容易让初学者或者不熟悉的人掉入的坑。这里列举了一些python常见五大坑,以及如何避免或者解决它们。缩进问题。python使用缩进来表示代码块,...

收藏!2022年国家职业资格考试时间表公布

人社部14日公布2022年度专业技术人员职业资格考试工作计划,包括中小学生教师资格、会计师、精算师、建造师等各项考试日期。其中,证券期货基金业从业人员资格各次考试地点不同,具体安排以相关行业协会考试公...

苹果mac系统必须安装python3_macbook安装python3.7

苹果mac系统必须安装python3苹果mac系统口碑很好,但不能像linux系统一样同时提供python2和python3环境,对程序员来说是非常不友善的。资深程序员都知道,Python3才是P...

通过python实现猴子吃桃问题_python小猴子吃桃的问题

1、问题描述:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩...

python 中的第一个 hello world 程序输出

程序运行:print("helloworld")我使用的是Python程序3.7.0版本介绍下print概念print字面意思打印,将文本输出内容打印出来输入:print(&...

持久化 Python 会话:实现数据持久化和可重用性

Midjourney生成R语言会话持久化熟悉或常用R语言进行数据分析/数据挖掘/数据建模的数据工作者可能对R语言的会话保存和会话恢复印象比较深刻,它可以将当前session会话持久化保存,以便分...

如何将Python算法模型注册成Spark UDF函数实现全景模型部署

背景Background对于算法业务团队来说,将训练好的模型部署成服务的业务场景是非常常见的。通常会应用于三个场景:部署到流式程序里,比如风控需要通过流式处理来实时监控。部署到批任务中部署成API服...

Python 字典l转换成 JSON_python转化字典

本文需要5分钟。如果对您有用可以点赞评论关注.Python字典到JSONJSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,它基于ECMAScrip...

[python] 基于PyOD库实现数据异常检测

PyOD是一个全面且易于使用的Python库,专门用于检测多变量数据中的异常点或离群点。异常点是指那些与大多数数据点显著不同的数据,它们可能表示错误、噪声或潜在的有趣现象。无论是处理小规模项目还是大型...

总结90条写Python程序的建议_python写程序的步骤

  1.首先  建议1、理解Pythonic概念—-详见Python中的《Python之禅》  建议2、编写Pythonic代码  (1)避免不规范代码,比如只用大小写区分变量、使用容易...

ptrade系列第六天:持久化处理2_持久化的三种状态

前一次跟大家分享了利用pickle进行策略数据的持久化。但是这种方式有个问题,就是保存下来的数据无法很直观的看到,比较不方便,所以今天给大家带来另一种方式,将数据通过json保存。importjso...

Python数据持久化:JSON_python的json用法

编程派微信号:codingpy上周更新的《ThinkPython2e》第14章讲述了几种数据持久化的方式,包括dbm、pickle等,但是考虑到篇幅和读者等因素,并没有将各种方式都列全。本文将介绍...

干货 | 如何利用Python处理JSON格式的数据,建议收藏

作者:俊欣来源:关于数据分析与可视化JSON数据格式在我们的日常工作中经常会接触到,无论是做爬虫开发还是一般的数据分析处理,今天,小编就来分享一下当数据接口是JSON格式时,如何进行数据处理进行详...

Python中Pyyaml模块的使用_python模块介绍

一、YAML是什么YAML是专门用来写配置文件的语言,远比JSON格式方便。YAML语言的设计目标,就是方便人类读写。YAML是一种比XML和JSON更轻的文件格式,也更简单更强大,它可以通过缩进来表...