需求
在现代的系统开发中, 为了提高搜索效率 , 以及搜索的精准度, 会大量的使用 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 : (增量订阅&消费信息管理器)