需求

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

image-20200904143209285

1 数据同步方案

1.1 方案一: 业务代码中同步

在增加、修改、删除之后,执行操作solr索引库的逻辑代码。

image-20200904143243158

优点 : 操作简便

缺点 :

  1. 业务耦合度高

  2. 执行效率变低

1.2 方案二: 定时任务同步

在执行完增加、修改、删除,操作数据库中的数据变更之后 ,通过定时任务定时的将数据库的数据同步到solr的索引库中。

定时任务技术 : SpringTask , Quartz

优点:同步solr索引库操作与业务代码完全解耦。

缺点:数据的实时性并不高。

1.3 方案三: 通过MQ实现同步

在执行完增加、修改、删除之后, 往MQ中发送一条消息 ;同步程序作为MQ中的消费者,从消息队列中获取消息,然后执行同步solr索引库的逻辑。

image-20200904143311071

image-20200904143317786

优点:业务代码解耦, 并且可以做到准实时

缺点:需要在业务代码中加入发送消息到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版本.

image-20200904143553554

下载压缩包

image-20200904143729089

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主从同步实现

原理:

image-20200904143747678

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

  1. master 将改变记录到二进制日志 (binary log) 中(这些记录叫做二进制日志事件, binary log events ,可以通过 show binlog events 进行查看);

  2. slave 将 master 的 binary log events 拷贝到它的中继日志 (relay log);

  3. slave 重做中继日志中的事件将改变反映它自己的数据。

3.2 Canal内部原理

原理图:

image-20200904143923215

原理相对比较简单:

  1. canal 模拟 mysql slave 的交互协议,伪装自己为 mysql slave ,向 mysql master 发送 dump 协议。

  2. mysql master 收到 dump 请求,开始推送 binary log 给 slave( 也就是 canal) 。

  3. canal 解析 binary log 对象 ( 原始为 byte 流 ) 。

3.3 Canal内部结构

image-20200904144043501

说明:

  1. Server : 代表一个canal运行实例,对应于一个jvm

  2. Instance : 对应于一个数据队列 (1个server对应1..n个instance)

image-20200904144055144
instance下的子模块:

eventParser : (数据源接入,模拟slave协议和master进行交互,协议解析)

eventSink : (Parser和Store链接器,进行数据过滤,加工,分发的工作)

eventStore : (数据存储)

metaManager : (增量订阅&消费信息管理器)

版权声明:本文为dalianpai原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/dalianpai/p/13614038.html