canal源码分析——整体架构分析

 目前内部使用的同步,已经支持mysql5.x和oracle部分版本的日志解析

 

基于日志增量订阅&消费支持的业务:

  1. 数据库镜像
  2. 数据库实时备份
  3. 多级索引 (卖家和买家各自分库索引)
  4. search build
  5. 业务cache刷新
  6. 价格变化等重要业务消息

项目介绍

   名称:canal [kə'næl]

   译意: 水道/管道/沟渠 

   语言: 纯java开发

   定位: 基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了mysql

 

工作原理

mysql主备复制实现

 

从上层来看,复制分成三步:

  1. master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events,可以通过show binlog events进行查看);
  2. slave将master的binary log events拷贝到它的中继日志(relay log);
  3. slave重做中继日志中的事件,将改变反映它自己的数据。

canal的工作原理:

原理相对比较简单:

  1. canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
  2. mysql master收到dump请求,开始推送binary log给slave(也就是canal)
  3. canal解析binary log对象(原始为byte流)
  4.  
  5. 架构

说明:

  • server代表一个canal运行实例,对应于一个jvm
  • instance对应于一个数据队列  (1个server对应1..n个instance)

instance模块:

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

  • http://dev.mysql.com/doc/refman/5.5/en/binary-log.html
  • http://www.taobaodba.com/html/474_mysqls-binary-log_details.html
  • 简单点说:

  • mysql的binlog是多文件存储,定位一个LogEvent需要通过binlog filename +  binlog position,进行定位
  • mysql的binlog数据格式,按照生成的方式,主要分为:statement-based、row-based、mixed。

    Java代码  收藏代码

    1. mysql> show variables like 'binlog_format';  
    2. +---------------+-------+  
    3. | Variable_name | Value |  
    4. +---------------+-------+  
    5. | binlog_format | ROW   |  
    6. +---------------+-------+  
    7. 1 row in set (0.00 sec)  
  • 目前canal只能支持row模式的增量订阅(statement只有sql,没有数据,所以无法获取原始的变更日志)

原文章地址

https://blog.csdn.net/lvzhuyiyi/article/details/51842697

你可能感兴趣的:(数据库)