# 实时搜索系统设
## 一、背景
传统的关系型数据库在存储大数据量时需要进行分库分表,但是分库分表后又很难实现复杂查询的需求,所以这个时候就需要引入异构数据源来做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`接口供业务系统使用,屏蔽底层的复杂性
- 项目介绍
- 项目声明
- 项目简介
- 架构设计
- 项目亮点功能介绍
- 技术栈介绍
- 核心功能
- 运行环境
- 项目更新日志
- 文档更新日志
- F&Q
- 部署教程
- 环境准备
- JDK安装
- JDK1.8,17共存
- maven
- 分布式缓存Redis
- 单机版
- 集群
- 注册&配置中心alibaba/nacos
- 介绍
- Nacos安装
- Nacos配置中心
- Nacos注册发现
- Nacos生产部署方案
- 服务监控-BootAdmin
- 基本介绍
- 如何使用
- 整合Admin-Ui
- 客户端配置
- 链路追踪
- 基本介绍
- SkyWalking-1
- Skywalking-1
- 消息队列
- Kafka
- docker安装kafka
- Linux集群
- Maven私服
- nexus安装部署
- nexus使用介绍
- 全文搜索elasticsearch
- windows集群搭建
- docker安装es
- ElasticHD
- linux集群部署
- 统一日志解决方案
- 日志解决方案设计
- 介绍与相关资料
- ELK安装部署
- elasticsearch 7.5
- logstash-7.5
- kibana-7.5
- filebeat
- 服务监控-Prometheus
- Prometheus安装配置
- Prometheus介绍
- grafana
- 持续集成部署CICD
- 自动化部署Jenkins
- 安装部署win
- 打包发布远程执行
- 安装部署linux
- jenkins+gitlab+docker容器化工程自动化部署
- Git
- CICD说明
- 阿里云效
- CentOS_MYSQL安装
- docker
- 安装
- Docker安装Nginx
- Docker部署启动springboot
- dockerCompose
- harbor
- Docker私有镜像仓库
- Portainer
- Docker远程连接设置
- 打包工程
- 必要启动模块
- 核心模块
- 登录认证
- 缓存功能
- 日志模块
- 分布式锁
- 消息队列
- 异常处理
- 系统接口
- 参数验证
- es检索
- 数据导出
- 系统设计
- 系统总体架构
- 扩展模块(可选)
- 限流熔断alibaba/sentinel
- 使用Sentinel实现gateway网关及服务接口限流
- Sentinel使用Nacos存储规则及同步
- 服务调用Feign
- Feign基本介绍
- 如何使用
- 负载均衡
- 请求超时
- 请求拦截器
- 分布式任务调度
- XXL-JOB
- 分布式事务
- TX-LCN
- Seata
- Seata原理解析
- 数据库分库分表
- swagger文档
- 分布式ID生成器解决方案
- 服务网关CloudGateway
- 基本介绍
- 使用网关
- 路由配置
- 全局过滤器
- 服务认证授权架构设计
- 认证服务流程
- 授权服务流程
- 系统幂等性设计与实践
- 分布式日志链路跟踪
- 实时搜索系统设计
- 应用性能
- 压力测试工具
- Apache JMeter介绍和安装
- ApacheJMeter使用
- JVM
- JVM性能调优
- 常见JVM内存错误及解决方案
- JVM 分析工具详解
- Spring Cloud性能调优
- Linux运维
- Linux 常用命令
- Linux开启端口