當前位置:
首頁 > 最新 > ElasticSearch簡介與整體預覽

ElasticSearch簡介與整體預覽

一、ES是什麼?

??ElasticSearch是一個開源的、可擴展、分散式的搜索和分析系統。目前是Apache軟體基金會下的一個開源項目。這裡介紹寫明了它還是一個"分析"系統。這個說法也不假,官方的介紹是這樣的

Elasticsearch is a distributed, RESTful search and analytics engine.

??了解過ES(ElasticSearch)的人第一印象應該是它是一個分散式的全文檢索引擎,基於Lucene上做了分散式集群功能,實現了分散式的存儲、查詢功能。同時,會有人告訴你,他們用ElasticSearch實現了日誌檢索、站內檢索等搜索功能。其實,ES本身是more than search的,並不局限於傳統的全文檢索功能,它具備靈活的伸縮性、容災、備份、自動搬遷恢復的功能以應對分散式環境挑戰,同時它支持複雜查詢條件、准實時、快速的查詢能力;對於使用者來說提供簡單的Http Rest api介面使用。

?? 從開源至今的6、7年時間裡面,它也緊跟大數據的發展在變化的,但是它的發展除了和大數據在不斷發展相關外,還有一些原因,首先它基於lucene的基礎上進行支持分散式查詢搜索,lucene本身是開源界很成熟並且應用廣的全文檢索引擎,在實際現實場景中,很多企業會使用lucene進行檢索的需求,ES可幫助這些企業快速搭建搜索服務,這也是為什麼大部分的人會用ES做搜索功能。此外,ES的功能模塊清晰、源碼架構分明,並在配置上儘可能對使用、開發人員屏蔽調底層存儲、集群管理的細節。

二、可能的業務的場景?

??在特定的應用場景下,選擇ES是一個合適的方案。那麼,在沒有完整認識的前提下,通過了解已有的大數據下的新穎應用場景案例可以給我們一個對ES的直觀認識。

??下面的場景是網路上記錄的ES應用案例:

維基百科使用ES作為用戶全文檢索的引擎,官方給出的原因是:友好的文檔,並有良好的社區支撐;性能優異;簡潔方便的維護、應用api;自動均衡,故障恢復。

Github使用ES搜索數千億行的代碼。

投行使用ES分析股票市場的變動。

對於國內,美團、百度等企業使用ES進行海量數據查詢分析、站內搜索等功能。

??從這些應用看,ES的應用不再局限於搜索,互聯網公司在大數據的背景下,在特定場景里,選擇了ES作為場景海量數據的存儲、複雜條件查詢、聚合的引擎,為特定類型的數據分析、挖掘的場景提供有力支持。

??根據對ES的了解,其實ElasticSearch適合的場景需要有以下一些特點:

不需要事務支持。

可以適應准實時的查詢特點,注意ES不是實時查詢的資料庫。

需要支持多維度查詢的場景,即需要在很多欄位進行過濾,比如數十、數百甚至更大的欄位中選擇過濾。

需要支持龐大數據量的聚合、排序、統計的要求,但對並發請求要求不高。

需要支撐千萬、甚至數百億以上的數據查詢。

三、ES系統介紹

?ES的概念介紹

??ES裡面有各類概念,這些和我們理解的關係型資料庫,例如mysql裡面的實例、庫、表、表結構、行、列有一一對應的關係。

集群(Cluster),有共同的 cluster name 的節點

節點(Node) ,集群中 Elasticearch 實例

索引(Index) ,等同於關係資料庫中的database,集群可以有多個索引

主分片(Primary shard),一個索引數據可劃分成多個shard(分片),相互shard之間無交集。分布到不同的集群節點上。分片對應的是 Lucene 中的索引

副本分片(Replica shard),每個主分片可以有一個或者多個副本

類型(Type),等同於資料庫中的table概念。同一個索引里可以包含多個 Type

映射(Mapping) ,等同於 資料庫中的schema

文檔(Document), 等同於 資料庫中的行

欄位(Field),等同於 資料庫中的列

??這些概念形成一個直觀的圖大概是這樣的:

?ES的系統結構

??ES系統整體上的模塊(Module)劃分主要分為傳輸層、集群自身管理、節點請求(接收、分發請求)、數據讀寫、底層存儲引擎、周邊模塊幾大類。

??傳輸層:

??ES的傳輸層負責接收用戶的請求,集群內部節點相互之間進行請求和數據傳輸等,ES內部可開啟(開關)支持用戶的http請求,請求和返回都是按json格式組織。同時,ES也可直接走ES內部的傳輸協議。對於網路傳輸,ES採用了開源的java網路框架netty,支持NIO,性能和穩定性上都很不錯。

??集群層:

??ES啟動(bootstrap)後,會通過guice查找依賴並注入各類實例,然後啟動各個模塊的入口函數。而集群層就是各模塊啟動後開始首先做事的層級。

??比如,Discover模塊會啟動節點Ping服務探測、選舉Master、處理節點加入、publish集群信息變更等。cluster模塊管理集群的元數據信息,包括有哪些節點、索引、路由等,集群信息變更會通知cluster模塊變更元數據信息。一旦啟動或者集群發生變更,Gateway會進行數據的恢復行為。indices模塊負責索引的管理,包括增刪查改。snapshot用戶的備份請求,可以按集群、索引的粒度進行備份。

??請求管理:

??對與用戶請求,ES內部按請求類型分開不同的client實例進行請求收攏,因為對於ES節點來說,它自身需要根據路由請求不同的數據節點,因此,本身來說自身就是一個client角色。client會i根據請求調用底層的Action層,這層會根據路由進行請求不同的節點、或者本地節點,數據的寫入路由、查詢合併都在Action層完成。

??讀寫:

??讀寫層根據類型分開不同,Index層負責寫入數據、寫translog、刷新緩存、重啟恢復、合併等。Script模塊支持用戶的腳步讀寫,例如js/mvel等。Search模塊提供用戶查詢、聚合、排序、查詢預熱等讀請求。

??引擎層:

??該層實際是封裝了lucene,目的是為上層提供一個規範的engine介面。同時,為底層選擇除lucene以外的存儲引擎提供可能。和mysql的底層資料庫引擎、VFS下面的文件系統的模型類似。

??周邊模塊:

??ES系統架構裡面還包括監控、告警、緩存、線程持這些周邊模塊。這些模塊為上層模塊提供支持。

??整體的系統模塊結構圖如下:

?ES的功能概述

??文檔(Document)操作:

Index API:寫入記錄,請參考官方文檔(下同)。

Get API:按主鍵讀取某條記錄。

Delete API:按主鍵刪除記錄。

Update API:按主鍵更新記錄

Update By Query API:按語句批量更新

Multi Get API:批量主鍵讀取。

Bulk API:批量寫入。

ReIndex API:索引重建功能,應用與已有的欄位結構變更需要重建索引場景(穩定性待驗證)。

Term Vectors:返回某個文檔的統計、詞向量信息。

Multi termvectors API:按主鍵批量返回詞向量信息。

Version:帶版本號更新,cas機制。

??搜索(Search)查詢操作:

Search:按條件進行搜索查詢,類似搜索引擎的查詢,可指定欄位查詢。支持參數包括

Query:指定查詢條件和index,支持multi index、multi type聯合查詢(相當於我們理解的跨資料庫、表),這點很重要

From / Size:翻頁參數

Sort:任意欄位組合排序

Fields:指定返回哪些記錄的欄位,默認全部返回

Highlighting:高亮設置

Rescoring:重排序,用於提高排序效果

Search Type:指定分布搜索,對性能和查詢效果有影響。

Scroll:滾動查詢,用於全量數據檢索

Preference:制定查主、備分片的特性

Version:返回版本號,更新的時候可以帶版本號寫

Index Boost:搜索的關鍵詞權重提升min_score:設置記錄滿足搜索得分的最小值

Searh Shard API:查詢索引的shards情況

Suggestor:查詢相關的詞、語句的

multi search API:批量查詢

count API:查詢滿足請求的記錄數

explain API:分析某個查詢是否滿足某個記錄

??聚集(Aggression)功能:

ES內置類似sql的group by的功能,支持分組統計

??索引(Indices)管理功能:

Create Index :創建索引

Delete Index :刪除索引

Get Index :讀取索引

Indices Exists :索引是否存在

Open / Close Index API :打開、關閉索引

Put Mapping :設置索引的映射(表結構)

Get Mapping :讀取索引的映射

Types Exists :types是否存在

Index Aliases :索引別名,類似文件系統裡面的alias,系統數據割接遷移可以用到

Update Indices Settings :更新索引配置

Get Settings :獲取索引配置

Analyze :設置分詞器

Index Templates :索引默認的模版mapping

Warmers :預熱索引,用於提升查詢效果

Shadow replica indices :

Indices Stats :索引狀態統計

Indices Segments :索引有多少個段(lucene的段)

Indices Recovery :索引

Indices Shard Stores

Clear Cache :清楚索引緩存

Flush :fsync索引

Refresh :讓索引生成,可能尚未落盤(這裡和lucene的原理背景有關)

Force Merge :強制合併(這裡和lucene的原理背景有關)

??集群查詢與控制:

Cluster Health :集群健康讀

Cluster State :集群狀態的元數據信息,例如version/master/nodes/routing/metadata/blocks這些表達集群的關鍵信息。

Cluster Stats :集群數據統計,包括os/jvm/indices等的各類統計

Pending cluster tasks :列舉集群有哪些變更,可監控進去狀態變化

Cluster Reroute :重新路由,用於搬遷

Cluster Update Settings :更新集群的配置

Nodes Stats :節點級別的統計信息

Nodes Info :節點的詳細信息

Task Management API :查詢當前的任務列表

Nodes hot_threads:查詢節點哪些線程cpu消耗很大。

?ES的周邊產品

??相對而言,ES目前由一個公司elastic.co維護,公司創始人即為ES的創始人,同樣提供了幾類產品組合使用。

四、ES的穩定性保障

??ES本身應對機器、節點故障、網路分區的分散式環境挑戰下,有一定機制保障服務正常恢復運行。

保持探測,防止節點故障

??ES內部有2個Detect服務,分別是MasterDetectFault/NodeDetectFault,master和普通節點之間會進行探測,能及時發現節點的失敗情況。節點失敗後會進行恢復處理。

節點故障後自動master選舉並恢復

??節點故障後,ES內部會分開幾類,包括master節點故障、普通節點故障、master角色節點故障等。如果不滿足master的要求,比如過半(配置項)同意master角色節點的節點不夠。ES會重新按配置進行master的選舉,防止腦裂的出現。 ES的選舉部分怎麼證明master的不會出現腦裂部分涉及整體流程和完整證明,需要另外篇幅描述。

translog保障ES進程故障時,數據不丟失

??ES內置對每個寫操作,底層的lucene實例並不會馬上寫入磁碟,為了保障ES進程寫入但是未落盤,ES會寫入translog日誌去確保重啟後能從translog裡面恢復。但這裡需要考慮translog是否緩存對性能的影響,此外ES是先寫數據再寫translog,這裡的原子性需要保持。

gateway用於集群恢復

??每個ES節點會保存global文件、index的stat文件、shard的stat文件,如果機器重啟恢復,那麼master節點的gateway模塊會收集各節點的各類stat文件,然後對數據進行恢復整理,重新計算路由等,形成新的集群元數據信息。也就是說,單機故障丟失情況下,只要有副本,ES同樣可以恢復服務和數據。

snapshot備份恢復功能

??ES還有一個非常關鍵的功能,我們可以通過介面讓ES把集群或者某個索引的數據備份的指定目錄,並能按需恢復快照。這個功能可以讓我們定期備份現網關鍵數據,具備數據回檔能力。

副本功能

??ES可以設置多個副本,防止單個shard故障丟失後無法恢複數據。涉及副本,一定需要說分散式副本間的數據一致性。

負載均衡

??ES內部具備Reroute的功能,master維護了節點的整體狀態,比如磁碟存儲、負載信息,ES會判斷這些機器負載情況對數據進行均衡。

五、ES可能帶來的挑戰

??在實際應用過程中,ES並不是拿來即可大規模使用,其實會遇到各類挑戰,面對挑戰需要深入系統實現去了解如何更好應用並避免 。比如:

ES不對數據副本的一致性

??對於高要求的場景,ES副本之間的寫入情況,ES本身不做過多保證,ES會把寫入情況返回,包括主、備shard的寫入情況共請求客戶端處理。實際上,業務如果需要保障強一致寫,可考慮副本都寫入成功再返回;對於強一致讀,可考慮只讀主分片,但這裡又涉及節點故障情況下服務的可用性。同時,這裡又涉及ES內部寫流程和強一致的過程論證,後續另外篇幅描述。

ES在龐大集群下的性能調優

??對於ES的性能,我們可以在有限的幾台機器上面進行性能的驗證,測試。但是在龐大集群情況下,真實的環境遇到的問題和挑戰更大,因此集群的性能能否支撐起來就和業務、架構設計非常相關。可能方向之一是分集群劃分數據,然後通過ES的tribe服務聚合多個集群,避免集群規模帶來的性能影響。

ES在龐大數據量下的穩定性

??生成環境中,可能遇到各類的問題比如cpu過高、內存消耗過多導致頻繁gc的問題,是否有辦法避免或者快速解決。又或者在集群部分數據丟失情況下,是否有能力快速恢復(比如通過快照)。這些問題其實都和實際場景相關,官方的文檔或許可以給出部分建議,比如設置jvm的heap不能超過系統可用內存的一半等。但是有時會遇到更多未知的問題,每個問題都是和場景相關,因此需要使用ES也需要在穩定性上做更多準備和驗證(比如大規模集群驗證)。

六、總結

??本文從ES的基礎介紹、適用場景特點、系統組成和基本功能特性進行描述,以便快速對系統的整體的有了解。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Thoughts和科技 的精彩文章:

TAG:Thoughts和科技 |