🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 实时搜索系统设 ## 一、背景 传统的关系型数据库在存储大数据量时需要进行分库分表,但是分库分表后又很难实现复杂查询的需求,所以这个时候就需要引入异构数据源来做OLAP的场景 ## 二、搜索系统的目标 * **海量请求**:支持亿级请求 * **秒级响应**:复杂查询秒级内出结果 * **实时搜索**:数据被修改后,能实时搜索到最新数据 ## 三、总体架构如下 ![](https://box.kancloud.cn/cfbd8a3b001bbcb0455aeb0663598c1d_798x769.png) ### 1\. 海量请求和秒级响应 使用ElasticSearch来实现这个目标,是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。能够达到实时搜索,稳定,可靠,快速,安装使用方便。关于ES的安装部署可查看 [非docker安装部署](https://www.kancloud.cn/zlt2000/microservices-platform/961675) ### 2\. 实时增量同步 阿里的开源项目`Canal`,就是用来解决这个问题的,`Canal`项目利用了`MySQL`数据库主从同步的原理,将`Canal Server`模拟成一台需要同步的从库,从而让主库将`binlog`日志流发送到`Canal Server`接口。`Canal`项目对`binlog`日志的解析进行了封装,我们可以直接得到解析后的数据,而不需要理会`binlog`的日志格式。而且`Canal`项目整合了`zookeeper`,整体实现了高可用,可伸缩性强;关于`Canal`的原理详细介绍和安装部署可查看 [Canal介绍](https://www.kancloud.cn/zlt2000/microservices-platform/1036866) ### 3\. MQ `Canal`收集的`binlog`数据支持直接发送到MQ中目前支持`RocketMQ`和`Kafka`,用于**削峰填谷**;关于`RocketMQ`的安装部署可查看 [安装部署](https://www.kancloud.cn/zlt2000/microservices-platform/1023349) > 如果并发不大的情况下可以省略这一层 ### 4\. Adapter `Canal`提供各种`Adapter`组件用于binlog转换,这里利用`Adapter`实现消费MQ的`binlog信息`自动转换为索引数据存到`ES`中,关于`Adapter`的安装和用法可查看 [实时同步数据到ElasticSearch](https://www.kancloud.cn/zlt2000/microservices-platform/1050447) > 在同步之前需要先创建`ES`的索引 ### 5\. 搜索服务 es客户端的api比较复杂难懂,通过通用的`搜索服务`对外提供`restful`的`API`接口供业务系统使用,屏蔽底层的复杂性