1. 程式人生 > >es結構和工作原理概述

es結構和工作原理概述

啟動過程 當ElasticSearch的節點啟動後,它會利用多播(multicast)(或者單播,如果使用者更改了配置)尋找叢集中的其它節點,並與之建立連線。這個過程如下圖所示 在叢集中,一個節點被選舉成主節點(master node)。這個節點負責管理叢集的狀態,當群集的拓撲結構改變時把索引分片分派到相應的節點上。 從使用者的角度來看,主節點在ElasticSearch中並沒有佔據著重要的地位,這與其它的系統(比如資料庫系統)是不同的。實際上使用者並不需要知道哪個節點是主節點;所有的操作需求可以分發到任意的節點,ElasticSearch內部會完成這些讓使用者感到不明覺歷的工作。在必要的情況下,任何節點都可以併發地把查詢子句分發到其它的節點,然後合併各個節點返回的查詢結果。最後返回給使用者一個完整的資料集。所有的這些工作都不需要經過主節點轉發(節點之間通過P2P的方式通訊)。
主節點會去讀取叢集狀態資訊;在必要的時候,會進行恢復工作。在這個階段,主節點會去檢查哪些分片可用,決定哪些分片作為主分片。處理完成後,叢集就會轉入到黃色狀態。 這意味著叢集已經可以處理搜尋請求了,但是還沒有火力全開(這主要是由於所有的主索引分片(primary shard)都已經分配好了,但是索引副本還沒有)。接下來需要做的事情就是找到複製好的分片,並設定成索引副本。當一個分片的副本數量少了,主節點會決定將缺少的分片放置到哪個節點中,並且依照主分片建立副本。所有工作完成後,叢集就會變成綠色的狀態(表示所有的主分片的索引副本都已經分配完成)。 探測失效節點 在正常工作時,主節點會監控所有的節點,檢視各個節點是否工作正常。如果在指定的時間裡面,節點無法訪問,該節點就被視為出故障了,接下來錯誤處理程式就會啟動。叢集需要重新均衡——由於該節點出現故障,分配到該節點的索引分片丟失。其它節點上相應的分片就會把工作接管過來。換句話說,對於每個丟失的主分片,新的主分片將從剩餘的分片副本(Replica)中選舉出來。重新安置新的分片和副本的這個過程可以通過配置來滿足使用者需求。
由於只是展示ElasticSearch的工作原理,我們就以下圖三個節點的叢集為例。叢集中有一個主節點和兩個資料節點。主節點向其它的節點發送Ping命令然後等待迴應。如果沒有得到迴應(實際上可能得不到回覆的Ping命令個數取決於使用者配置),該節點就會被移出叢集。 與ElasticSearch進行通訊 我們已經探討了ElasticSearch是如何構建起來的,但是歸根到底,最重要的是如何往ElasticSearch中新增資料以及如何查詢資料。為了實現上述的需求,ElasticSearch提供了精心設計的API。 ElasticSearch認為資料應該伴隨在URL中,或者作為請求的主體(request body),以一種JSON格式(http://en.wikipedia.org/wiki/JSON )的文件傳送給伺服器。如果讀者用Java或者其它執行在JVM虛擬機器上的語言,應該關注一下Java API,它除了是群集中內建的REST風格API外,功能與URL請求是一樣的。
值得一提的是在ElasticSearch內部,節點之間的通訊也是用相關的Java API。如果想了解關於Java API更多的內容,可以閱讀 第8章 ElasticSearch Java API ,但是現在還是簡要了解一下本章提供的一些API的功能和使用方法。注意本章僅僅是對相關知識的簡單提點(作者會假定讀者已經使對這些知識有所瞭解)。如果事先沒有了解相關知識,強烈建議讀者去學習一下。比如本書就覆蓋了所有的知識點。 索引資料 ElasticSearch提供了4種索引資料的辦法。最簡單的是使用索引API,索引API。通過它可以將文件新增到指定的索引中去。比如,通過curl工具(訪問http://curl.haxx.se/ ),我們可以通過如下的命令建立一個新的文件: curl -XPUT http://localhost:9200/blog/article/1 '{"title": "Newversion of Elastic Search released!", "content": "...","tags":["announce", "elasticsearch", "release"] }' 第2種和第3種辦法可以通過bulk API和UDP bulk API批量新增文件。通常的bulk API採用HTTP協議,UDP bulk API採用非連線的資料包協議。UDP協議傳輸速度會更快,但是可靠性要差一點。最後一種辦法就是通過river外掛。river執行在ElasticSearch叢集的節點上,能夠從外部系統中獲取資料。 有一點需要注意,索引資料的操作只會發生在主分片(primary shard)上,而不會發生在分片副本(Replica) 上。如果索引資料的請求傳送到的節點沒有合適的分片或者分片是副本,那麼請求會被轉發到含有主分片的節點。 資料查詢 我們能夠與叢集中的任何節點通訊,包括主節點。任何一個節點互相知道文件存在於哪個節點上,它們可以轉發請求到我們需要資料所在的節點上。我們通訊的節點負責收集各節點返回的資料,最後一起返回給客戶端。這一切都由Elasticsearch透明的管理。 關於資料查詢,其核心點在於查詢過程不是一個簡單、單一的流程。通常這個過程分為兩個階段:查詢分發階段和結果彙總階段。在查詢分發階段,會從各個分片中查詢資料;在結果彙總階段,會把從各個分片上查詢到的結果進行合併、排序等其它處理過程,然後返回給使用者。 使用者可以通過指定搜尋型別來控制查詢的分發和彙總過程: QUERY_THEN_FETCH 是針對所有的塊執行的,但返回的是足夠的資訊,而不是文件內容(Document)。結果會被排序和分級,基於此,只有相關的塊的文件物件會被返回。由於被取到的僅僅是這些,故而返回的hit的大小正好等於指定的size。這對於有許多塊的index來說是很便利的(返回結果不會有重複的,因為塊被分組了)。 QUERY_AND_FETCH 最原始(也可能是最快的)實現就是簡單的在所有相關的shard上執行檢索並返回結果。每個shard返回一定尺寸的結果。由於每個shard已經返回了一定尺寸的hit,這種型別實際上是返回多個shard的一定尺寸的結果給呼叫者。最快,但不準確 DFS_QUERY_THEN_FETCH 與QUERY_THEN_FETCH相同,預期一個初始的散射相伴用來為更準確的score計算分配了的term頻率。 DFS_QUERY_AND_FETCH 與QUERY_AND_FETCH相同,預期一個初始的散射相伴用來為更準確的score計算分配了的term頻率。SCAN被用來檢索大量的結果(甚至所有的結果),就像在傳統資料庫中使用的遊標.全域性排序,若禁止排序,無法查詢實時資料。官網3.0會棄用 查詢API在ElasticSearch中有著很大的比重。通過使用Query DSL(基於JSON,用來構建複雜查詢的語言) ,我們能夠:
  • 使用各種型別的查詢方式,包括:簡單的關鍵詞查詢(termquery) ,短語(phrase)、區間(range)、布林(boolean)、模糊(fuzzy)、跨度(span)、萬用字元(wildcard)、地理位置(spatial)等其它型別的查詢方式。
  • 通過組合簡單查詢構建出複雜的查詢。
  • 過濾文件,去除不符合標準的文件而且不影響打分排序。
  • 查詢給定文件的相似文件。
  • 查詢給定短語的搜尋建議和查詢短語修正。
  • 通過faceting構建動態的導航和資料統計
  • 使用prospective search而且找到匹配文件的查詢語句。(關於prospective search,似乎是一種推送方式。即把使用者的查詢語句儲存到索引中,如果新的文件新增到索引中,就把文件關聯到匹配的查詢語句中。這種查詢適合於新聞、部落格等會定時更新的應用場景)
索引引數設定 前面已經提到ElasticSearch索引引數的自動化配置和文件結構及域型別的自動識別。當然,ElasticSearch也允許使用者自行修改預設配置。使用者可以自行配置很多引數,比如通過mapping配置索引中的文件結構,設定分片(shard)和副本(replica)的的個數,設定文字分析元件……