Canal介绍
需求
在现代的系统开发中, 为了提高搜索效率 , 以及搜索的精准度, 会大量的使用 redis ,memcache 等 nosql 系统的数据库 , 以及 solr , elasticsearch 类似的全文检索服务; 那么这个时候, 就又有一个问题需要我们来考虑, 就是数据同步的问题, 如何将实时变化的数据库中的数据同步到 solr 的索引库中或者 redis 中呢 ?

1 数据同步方案
1.1 方案一: 业务代码中同步
在增加、修改、删除之后,执行操作solr索引库的逻辑代码。

优点 : 操作简便
缺点 :
- 
业务耦合度高 
- 
执行效率变低 
1.2 方案二: 定时任务同步
在执行完增加、修改、删除,操作数据库中的数据变更之后 ,通过定时任务定时的将数据库的数据同步到solr的索引库中。
定时任务技术 : SpringTask , Quartz
优点:同步solr索引库操作与业务代码完全解耦。
缺点:数据的实时性并不高。
1.3 方案三: 通过MQ实现同步
在执行完增加、修改、删除之后, 往MQ中发送一条消息 ;同步程序作为MQ中的消费者,从消息队列中获取消息,然后执行同步solr索引库的逻辑。


优点:业务代码解耦, 并且可以做到准实时
缺点:需要在业务代码中加入发送消息到MQ中的代码 , API耦合
1.4 方案四: 通过Canal实现实时同步
通过Canal来解析数据库的日志信息, 来检测数据库中表结构的数据变化,从而更新solr索引库。
优点:业务代码完全解耦,API完全解耦,可以做到准实时。
缺点:无
2 Canal介绍
2.1 Canal概述
阿里巴巴 mysql 数据库 binlog 的增量订阅 & 消费组件。
名称: canal [kə'næl]
译意: 水道 / 管道 / 沟渠
语言: 纯 java 开发
定位: 基于数据库增量日志解析,提供增量数据订阅 & 消费,目前主要支持了 mysql
关键词: mysql binlog parser / real-time / queue&topic
1.1 Canal下载
官网: https://github.com/alibaba/canal
这里选择了Canal的1.1.4版本.

下载压缩包

canal.deployer-1.1.4.tar.gz : 这个是canal Server的部署包
canal.example-1.1.4.tar.gz : 这个是样例
Source code(zip) : 是canal的源码包
3 Canal工作原理
3.1 mysql主从同步实现
原理:

从上层来看,主从复制分成三步:
- 
master 将改变记录到二进制日志 (binary log) 中(这些记录叫做二进制日志事件, binary log events ,可以通过 show binlog events 进行查看); 
- 
slave 将 master 的 binary log events 拷贝到它的中继日志 (relay log); 
- 
slave 重做中继日志中的事件将改变反映它自己的数据。 
3.2 Canal内部原理
原理图:

原理相对比较简单:
- 
canal 模拟 mysql slave 的交互协议,伪装自己为 mysql slave ,向 mysql master 发送 dump 协议。 
- 
mysql master 收到 dump 请求,开始推送 binary log 给 slave( 也就是 canal) 。 
- 
canal 解析 binary log 对象 ( 原始为 byte 流 ) 。 
3.3 Canal内部结构

说明:
- 
Server : 代表一个canal运行实例,对应于一个jvm 
- 
Instance : 对应于一个数据队列 (1个server对应1..n个instance) 

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

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号