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的基礎介紹、適用場景特點、系統組成和基本功能特性進行描述,以便快速對系統的整體的有了解。


TAG:Thoughts和科技 |