canal 入门篇

826

前言

想必做过商品服务都是将商品相关的信息和价格保存在数据库中,例如 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技术干货,期待你的关注!