分布式数据同步中间件canal
什么是canal?
目前公司使用的各种异构数据源之间的实时增量同步系统底层有用到canal这个中间件,我们借此可以简单来讲下canal有什么用。
传统的主从同步原理
master将数据记录到了binlog日志里面,然后slave会通过一个io线程去读取master那边指定位置点开始的binlog日志内容,并将相应的信息写到slave这边的relay日志里面,最后slave会有单独的sql线程来读取这些master那边执行的sql语句记录,达成两端的数据同步。
canal中间件功能
Binlog是MySQL数据库的二进制日志,用于记录用户对数据库操作的SQL语句(除了数据查询语句)信息。而Binlog格式也有三种,分别为STATEMENT、ROW、MIXED。STATMENT模式基于SQL语句的复制,每一条会修改数据的SQL语句会记录。ROW模式除了记录SQL语句之外,还会记录每个字段的变化情况,能够清楚的记录每行数据的变化历史,会占用较多的空间。MIXED比较灵活的记录,当遇到表结构变更的时候,就会记录为STATMENT模式,当遇到了数据更新或者删除情况下就会变为ROW模式。Binlog三个用途分别为数据恢复、复制、审计。
Canal是阿里MySQL数据库Binlog的增量订阅&消费组件 ,基于数据库Binlog可以监控数据库数据的变化,进而用于数据同步等业务。分为Canal Server与Canal Client,前者读取Binlog解析后存储,后者连接前者消费。
canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议mysql master收到dump请求,开始推送binary log给slave(也就是canal),canal解析binary log对象(原始为byte流),通过对binlog数据进行解析即可获取需要同步的数据,在进行同步数据的过程中还可以加入开发人员的一些额外逻辑处理,比较开放。
canal的安装
下载地址:https://github.com/alibaba/canal/releases
canal配置省略。。。
本文部分学习参考了:https://www.cnblogs.com/javazhiyin/p/10836846.html
https://zhuanlan.zhihu.com/p/96628405