前言
前面的文章里,我们了解到 canal 可以从 MySQL 中感知数据的变化。这是因为它模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,从而实现了主从复制。
正是了解到这一点,笔者有两个问题便一直萦绕于心:
- 它是如何模拟 MySQL slave 交互协议的?
- 它又是怎么解析 binlog 日志的呢?
今天,笔者准备就着这两个问题,扒拉扒拉 canal 的代码,一探究竟。
一、MySQL 主从复制
在谈 canal 之前,我们有必要再重温下 MySQL 主从复制的原理。
总结上图的流程如下:
- MySQL master 将数据变更写入二进制日志 (binary log , 其中记录叫做二进制日志binarylog
events); - MySQL slave 将 master 的 binary log events 拷贝到它的中继日志 (relay log);
- MySQL slave 重放 relay log 中的事件,将数据变更反映到自己的数据库。
二、canal 原理
上图就很形象的描述了 canal 的角色。它的原理也很简单:
- canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议;
- mysql master收到dump请求,开始推送binary log给slave(也就是canal);
- canal解析binary log对象(原始为byte流);
- canal将解析后的对象,根据业务场景,分发到比如 MySQL 、RocketMQ 或者 ES 中。
三、源码启动
看完了 MySQL 主从