技术杂谈--canal

前言

本篇旨在让大家了解一个通过解析mysql binlog日志实现mysql数据库实时数据同步功能的开源项目canal,简单介绍其原理及相关知识,文末有canal项目的一些关键链接

canal概述

canal是阿里巴巴旗下的一款开源项目,纯Java开发。基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL,如果使用canal,那前提是mysql的binlog format格式必须是ROW,参考备注一

canal工作原理

原理相对比较简单:

  1. canal模拟mysql slave与mysql master的交互协议,伪装自己是一个mysql slave,向mysql master发送dump协议
  2. mysql master收到mysql slave(canal)发送的dump请求,开始推送binlog增量日志给slave(也就是canal)
  3. mysql slave(canal伪装的)收到binlog增量日志后,就可以对这部分日志进行解析,获取主库的结构及数据变更 ## mysql主从同步原理 canal工作原理其实也是基于mysql主从同步原理的,所以理解mysql主从同步原理是第一步
  4. master将改变记录到二进制日志(binary log)中
  5. slave(I/O thread)将master的记录改变的binlog日志拷贝到它的中继日志(relay log)中
  6. slave(SQL thread)重做中继日志中的事件,将改变反映它自己的数据从库中 ## 交互的过程 canal(Client)与mysql master(DB)的交互主要分为两个阶段:握手认证阶段和dump命令执行阶段,到这个地方要引入一个握手简介了,查看备注二
  7. canal与DB进行连接,然后根据握手协议,进行握手认证
  8. 握手成功以后,canal对DB发送show master status命令,此命令中会带回当前最新binlog存储在哪个文件,以及对应文件的哪个偏移量。如果想从当前开始接收binlog,则在后面发送binlog dump命令的传递文件名和偏移量这两个参数的时候用这两个值就好。
  9. 发送show global variables like 'binlog_checksum'命令,这个命令的作用简单的非准确的可以认为client想知道它应该怎么验证接收到的mysql master的binlog日志是不是准确的啊,有没有错误啊,丢失啊,什么的(就比如你下载一个.tar.gz类型的包,里面带有一个MD5码一样,你就知道要用这个MD5码进行验证一下这个下载的东西是不是正确的),mysql5.6.5以后的版本中binlog_checksum=crc32,而低版本都是binlog_checksum=none(这个none,crc32就是验证方式)
  10. canal发送Dump命令,接收DB返回的binlog日志(里面记载的记录都是一些事件,binlog event),这个时候需要引入canal的架构,参考备注三,eventParser 解析接收到的binlog日志,eventSink对这些解析出来的数据进行过滤,加工,分发等,然后传输给eventStore,存储到要存储的地方 ## 备注一:mysql的binlog format类型 binlog的类型有三种: (1)Statement:每一条会修改数据的sql都会记录在binlog中。 (2)Row:不记录sql语句上下文相关信息,仅保存哪条记录被修改,更改前后的数据。 (3)Mixed:以上两种Level的混合。 ## 备注二:握手认证阶段 握手认证阶段为客户端与服务器建立连接后进行,交互过程如下:
  11. 服务器 -> 客户端:握手初始化消息
  12. 客户端 -> 服务器:登陆认证消息
  13. 服务器 -> 客户端:认证结果消息 ## 备注三:canal架构 说明: server代表一个canal运行实例,对应于一个jvm instance对应于一个数据队列

instance模块:
eventParser (数据源接入,模拟slave协议和master进行交互,协议解析)
eventSink (Parser和Store链接器,进行数据过滤,加工,分发的工作)
eventStore (数据存储)
metaManager (增量订阅&消费信息管理器)

备注四:canal项目的一些链接及使用

canal项目的使用demo: https://github.com/alibaba/canal/wiki/ClientExamplel
canal项目的安装配置:https://github.com/alibaba/canal/wiki/QuickStart
canal的客户端开发api:http://alibaba.github.io/canal/apidocs/1.0.13/index.html?overview-summary.html

如有问题,欢迎指正,问题交流群:737184824

© 著作权归作者所有
这个作品真棒,我要支持一下!
机器学习、深度学习、大数据、数据科学爱好者集结地,分享 在各自领域里的工程实践经验和应用 让我们每天进步一点点...
0条评论
top Created with Sketch.