# 實時搜索系統設
## 一、背景
傳統的關系型數據庫在存儲大數據量時需要進行分庫分表,但是分庫分表后又很難實現復雜查詢的需求,所以這個時候就需要引入異構數據源來做OLAP的場景
## 二、搜索系統的目標
* **海量請求**:支持億級請求
* **秒級響應**:復雜查詢秒級內出結果
* **實時搜索**:數據被修改后,能實時搜索到最新數據
## 三、總體架構如下

### 1\. 海量請求和秒級響應
使用ElasticSearch來實現這個目標,是一個基于Lucene的搜索服務器。它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java開發的,并作為Apache許可條款下的開放源碼發布,是當前流行的企業級搜索引擎。能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。關于ES的安裝部署可查看 [非docker安裝部署](http://www.hmoore.net/zlt2000/microservices-platform/961675)
### 2\. 實時增量同步
阿里的開源項目`Canal`,就是用來解決這個問題的,`Canal`項目利用了`MySQL`數據庫主從同步的原理,將`Canal Server`模擬成一臺需要同步的從庫,從而讓主庫將`binlog`日志流發送到`Canal Server`接口。`Canal`項目對`binlog`日志的解析進行了封裝,我們可以直接得到解析后的數據,而不需要理會`binlog`的日志格式。而且`Canal`項目整合了`zookeeper`,整體實現了高可用,可伸縮性強;關于`Canal`的原理詳細介紹和安裝部署可查看 [Canal介紹](http://www.hmoore.net/zlt2000/microservices-platform/1036866)
### 3\. MQ
`Canal`收集的`binlog`數據支持直接發送到MQ中目前支持`RocketMQ`和`Kafka`,用于**削峰填谷**;關于`RocketMQ`的安裝部署可查看 [安裝部署](http://www.hmoore.net/zlt2000/microservices-platform/1023349)
> 如果并發不大的情況下可以省略這一層
### 4\. Adapter
`Canal`提供各種`Adapter`組件用于binlog轉換,這里利用`Adapter`實現消費MQ的`binlog信息`自動轉換為索引數據存到`ES`中,關于`Adapter`的安裝和用法可查看 [實時同步數據到ElasticSearch](http://www.hmoore.net/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開啟端口