首先分享之前的所有文章 , 欢迎点赞收藏转发三连下次一定 >>>> 😜😜😜
文章合集 : 🎁 juejin.cn/post/694164…
Github : 👉 github.com/black-ant
CASE 备份 : 👉 gitee.com/antblack/ca…
一 . 前言
这一篇来开始学习 canal 的源码 , 文章目的 :
- 了解 canal 项目结构
- 如何启动 canal 源码
- canal Client 主流程
canal 主要用于基于MySQL 的增量日志解析 , 它将自己模拟为一个备份库 , 主库会推送 binlog 带 Canal , Canal 解析 binlog , 并且推送到其他的环境
二 . canal 使用流程
Canal 启动包含 个部分 :
- 从 Canal Git 拉取最新的依赖包 ( canal.deployer)
- 修改 Canal 配置文件 , 并且启动 Canal Server
- 自行编写 Canal Client , 完成 binlog 的截取
前期准备
1 | java复制代码create user 'canal'@'%' identified by 'Canal@123456'; |
Canal 配置文件 (\conf\example\instance.properties)
1 | java复制代码// 数据库访问地址 |
Canal 启动环节
Canal 启动只需要调用 \bin\startup.bat 即可 , 其中可能会涉及到如下问题 :
1 | java复制代码// log 日志 |
Canal Client 拦截
Canal 项目中提供了一个案例项目 : github.com/alibaba/can… , 个人加了一些注释 :
1 | java复制代码<!-- Step 1 : 添加依赖关系 --> |
1 | java复制代码public static void main(String args[]) { |
三 . canal 项目结构
Canal Client 源码很清晰 , 代码量也不大 , 这里仅大概过一下
3.1 CanalConnector 接口
CanalConnector提供了很多核心的工具方法 (可以看看源码 , 里面写的很详细) , 它有 SimpleCanalConnector 和 ClusterCanalConnector 2个主要的实现类 , 分别用于处理基础功能和集群功能
Canal 支持三种创建连接的方式 :
1 | java复制代码// 创建单链接的客户端链接 |
ClusterCanalConnector 重试的原理 (failover切换的方式)
1 | java复制代码// Step 1 : 构建集合列表 |
ClusterCanalConnector 的 zk 方式
1 | java复制代码核心的处理方式就是通过 ZkClientx 发起远程的调用 |
四 . canal 主处理流程
4.1 数据的拉取
从上文已经看过了 , 不管是哪种方式 , 其最终都是建立了 InetSocketAddress , 且端口为 11111
我们来看一下各环节的数据情况 :
Message 属性格式
Message message = connector.getWithoutAck(BATCH_SIZE);
其中主要包含 binlog 文件信息 , 偏移量 , 操作类型等数据
4.2 SQL 的读取
1 | java复制代码 |
4.3 不同操作的 SQL 样式
CREATE TABLE
创建语句会直接携带 SQL 过来
INSERT
插入数据时 , 值只要在 AfterColumn 中
UPDATE
Update 时会记录修改前数据和修改后数据 , 所以也可以在这里做数据审计 , 避免反复查询
DELETE
delete 和 insert 正好相反
五. 扩展
5.1 扩展思路
对于 DDL 语句 , 是不需要进行相关同步的 , 主要同步的就是数据变更的相关操作.
在业务中 , 可以同步到 MySQL , Redis ,ES 等多种介质中 ,
同时Canal 最新版本已经默认支持 MQ 的直接推送 , github.com/alibaba/can… , TODO : 后续看 Canal Server
5.2 同步案例
TODO : 后续有时间会完善一个同步案例
总结
这篇文章主要是入门篇 , 是Canal 学习过程中的一些笔记和梳理 , 第二阶段会进入 Canal Server 学习 , 对 Server 中如何拉取 Binlog , 如何模拟数据库进行深入的学习
同时会对其扩展点进行思考
参考文档
本文转载自: 掘金