前言
前面的文章里,我们了解到 canal 可以从 MySQL 中感知数据的变化。这是因为它模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,从而实现了主从复制。
正是了解到这一点,笔者有两个问题便一直萦绕于心:
它是如何模拟 MySQL slave 交互协议的?
它又是怎么解析 binlog 日志的呢?
今天,笔者准备就着这两个问题,扒拉扒拉 canal 的代码,一探究竟。
一、MySQL 主从复制
在谈 canal 之前,我们有必要再重温下 MySQL 主从复制的原理。
image
总结上图的流程如下:
MySQL master 将数据变更写入二进制日志 (binary log , 其中记录叫做二进制日志事件binary log events);
MySQL slave 将 master 的 binary log events 拷贝到它的中继日志 (relay log);
MySQL slave 重放 relay log 中的事件,将数据变更反映到自己的数据库。
二、canal 原理
image
上图就很形象的描述了 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 主从复制和 canal 原理之后,为了方便 debug &#