最近在準備面試,正把平時積累的筆記、項目中遇到的問題與解決方案、對核心原理的理解,以及高頻業務場景的應對策略系統梳理一遍,既能加深記憶,也能讓知識體系更扎實,供大家參考,歡迎討論。
一、核心優勢
Elasticsearch可以實現秒級的搜索,cluster(集群)分布式部署,極易擴展,這樣很容易使它處理PB級的數據庫容量。最重要的是Elasticsearch使它搜索的結果可以按照分數進行排序,它能提供我們最相關的搜索結果(relevance-相關性)。
二、主要特點
-
安裝方便:沒有其他依賴,下載后安裝非常方便;只用修改幾個參數就可以搭建起來一個集群(工作中一般使用阿里云等云廠商的ES服務,很少有自己搭建的)
-
JSON格式:輸入/輸出格式為JSON,意味著不需要定義Schema,快捷方便
- Schema(模式)通常指的是一種描述數據結構的規范或定義。它定義了數據的組織方式、字段的類型以及數據之間的關系。使用模式能夠確保數據的一致性、完整性和有效性,并為數據的生成、解析、驗證提供了標準
-
RESTful接口:基本所有操作(索引、查詢、甚至是配置)都可以通過HTTP接口進行
-
分布式架構:節點對外表現對等(每個節點都可以用來做入口),加入節點自動負載均衡
-
多租戶支持:可根據不同的用途分索引,可以同時操作多個索引
- 共享底層資源、邏輯隔離上層數據、支持并行操作
- 在Elasticsearch中,多租戶模式通常涉及根據不同的用途或不同的用戶組織創建不同的索引,使得這些索引能夠彼此獨立存在,而且可以同時操作多個索引。這樣的設計允許不同的用戶、組織或應用程序在同一個Elasticsearch集群中使用各自的索引,實現數據的隔離和獨立管理
-
大數據支持:可以擴展到PB級的結構化和非結構化數據,支持海量數據的近實時處理
三、核心功能
- 分布式搜索引擎
- 自動將海量數據分散到多臺服務器上去存儲和檢索
- 全文檢索
- 提供模糊搜索等自動化程度很高的查詢方式,并進行相關性排名,高亮等功能
- 數據分析引擎(分組聚合)
- 適用于社區網站等場景的最近一周用戶登錄、最近一個月各功能使用情況等分析
- 近實時處理
- 對海量數據進行近實時(秒級)的處理,采用分布式架構實現水平擴展
四、應用場景
- 搜索類場景
- 人員檢索、設備檢索、App內的搜索、訂單搜索、IM消息搜索
- 日志分析類場景
- 經典的ELK組合(Logstash/Elasticsearch/Kibana),實現日志收集,日志存儲,日志分析
- 數據預警平臺及數據分析場景
- 例如社區團購提示,當優惠的價格低于某個值時,自動觸發通知消息
- 分析競爭對手商品銷量Top10,供運營分析
- 商業智能(BI)系統
- 分析某一地區用戶消費金額及商品類別,輸出相應的報表數據
- 預測該地區的熱賣商品,通過區域和人群特征劃分進行定向推薦
- Elasticsearch執行數據分析和挖掘,Kibana做數據可視化
五、競品對比
- Lucene
- Java編寫的信息搜索工具包(Jar包),只是一個框架,熟練運用非常復雜
- Solr
- 基于Lucene的HTTP接口查詢服務器,是一個封裝了很多Lucene細節的搜索引擎系統
- Elasticsearch
- 基于Lucene的分布式海量數據近實時搜索引擎,采用的策略是將每一個字段都編入索引,使其可以被搜索
對比
- Solr利用Zookeeper進行分布式管理,而Elasticsearch自身帶有分布式協調管理功能
- Solr比Elasticsearch實現更加全面,而Elasticsearch本身更注重于核心功能,高級功能多由第三方插件提供
- Solr在傳統的搜索應用中表現好于Elasticsearch,而Elasticsearch在實時搜索應用方面比Solr表現好
當前版本信息
- 目前主流依然是Elasticsearch7.x,最新的是7.8,推薦使用JDK11(LTS),也兼容JDK8,目前工作中用到的
- 優化:集成默認JDK、升級Lucene8大幅提升TopK性能、引入熔斷機制避免OOM發生
- 集成默認JDK:確保Elasticsearch版本與JDK版本兼容
- 升級Lucene8:帶來性能提升,但需確保版本匹配
- 引入熔斷機制:避免OOM錯誤,需合理配置參數
六、多租戶架構
- 概念
- 允許單一軟件實例同時為多個租戶提供服務,每個租戶擁有獨立空間和資源
- Elasticsearch中的實現
- 通過不同索引為每個租戶分隔數據
- 提供RBAC和索引別名實現權限管理和操作靈活性
- 關鍵要素
- 租戶:獨立使用者或實體
- 索引隔離:為每個租戶分配獨立的索引空間(單個或多個索引)
- 權限控制:管理各租戶數據訪問權限
- 資源隔離:保障各租戶資源配額
七、字段索引控制
- 索引設置選項
- “index”: true:默認設置,字段會被分析以支持全文搜索
- “index”: false:不對該字段建立索引,適用于不需要搜索的字段
- “index”: “no”:早期版本中表示不建立索引(與false相似)
- 應用場景
- 對不需要進行搜索的字段禁用索引,可減少存儲空間并提高索引構建速度