【Elastic Search權威指南 讀書小記6】ES之分佈式搜索

有道雲筆記:https://note.youdao.com/ynoteshare1/index.html?id=5fe5c88843a8519ca0b258104593f63d&type=note

爲了充分使用每個節點的性能,查詢的時候實際上是分治法到每個節點取一定量的數據,然後通過歸併排序等方式在查詢節點整合數據並返回。

查詢階段

查詢階段包含以下三步:

1.客戶端發送一個 search(搜索) 請求給 Node 3 , Node 3 創建了一個長度爲 from+size 的空優

先級隊列。

2. Node 3 轉發這個搜索請求到索引中每個分片的原本或副本。每個分片在本地執行這個查詢並且結果將結果到一個大小爲 from+size 的有序本地優先隊列裏去。

3.每個分片返回document的ID和它優先隊列裏的所有document的排序值給協調節點 Node 3 。 Node3 把這些值合併到自己的優先隊列裏產生全局排序結果。當一個搜索請求被髮送到一個節點Node,這個節點就變成了協調節點。這個節點的工作是向所有相關的分片廣播搜索請求並且把它們的響應整合成一個全局的有序結果集。這個結果集會被返回給客戶端。

第一步是向索引裏的每個節點的分片副本廣播請求。就像document的 GET 請求一樣,搜索請求可以被每個分片的原本或任意副本處理。這就是更多的副本(當結合更多的硬件時)如何提高搜索的吞吐量的方法。對於後續請求,協調節點會輪詢所有的分片副本以分攤負載。

每一個分片在本地執行查詢和建立一個長度爲 from+size 的有序優先隊列——這個長度意味着它自己的結果數量就足夠滿足全局的請求要求。分片返回一個輕量級的結果列表給協調節點。只包含documentID值和排序需要用到的值,例如 _score 。

協調節點將這些分片級的結果合併到自己的有序優先隊列裏。這個就代表了最終的全局有序結果集。到這裏,查詢階段結束。

整個過程類似於歸併排序算法,先分組排序再歸併到一起,對於這種分佈式場景非常適用。

 

分發階段由以下步驟構成:

1.協調節點辨別出哪個document需要取回,並且向相關分片發出 GET 請求。

2.每個分片加載document並且根據需要豐富(enrich)它們,然後再將document返回協調節

點。

3.一旦所有的document都被取回,協調節點會將結果返回給客戶端。

協調節點先決定哪些document是實際(actually)需要取回的。例如,我們指定查詢 {

"from": 90, "size": 10 } ,那麼前90條將會被丟棄,只有之後的10條會需要取回。這些

document可能來自與原始查詢請求相關的某個、某些或者全部分片。

協調節點爲每個持有相關document的分片建立多點get請求然後發送請求到處理查詢階段的分片副本。分片加載document主體—— _source field。如果需要,還會根據元數據豐富結果和高亮搜索片斷。一旦協調節點收到所有結果,會將它們彙集到單一的回答響應裏,這個響應將會返回給客戶端。

深分頁

深分頁的壓力也比mysql大了幾倍,而且無法limit聚簇索引。ES的深分頁變得十分耗費性能。

掃描和滾屏

scan(掃描) 搜索類型是和 scroll(滾屏) API一起使用來從Elasticsearch裏高效地取回巨大數

量的結果而不需要付出深分頁的代價。

scroll(滾屏)

一個滾屏搜索允許我們做一個初始階段搜索並且持續批量從Elasticsearch里拉取結果直到沒有結果剩下。這有點像傳統數據庫裏的cursors(遊標)。滾屏搜索會及時製作快照。這個快照不會包含任何在初始階段搜索請求後對index做的修改。它通過將舊的數據文件保存在手邊,所以可以保護index的樣子看起來像搜索開始時的樣子。

scan(掃描)

深度分頁代價最高的部分是對結果的全局排序,但如果禁用排序,就能以很低的代價獲得全部返回結果。爲達成這個目的,可以採用 scan(掃描) 搜索模式。掃描模式讓Elasticsearch不排序,只要分片裏還有結果可以返回,就返回一批結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章