Elasticsearch 分片互動過程分析

2022-03-28 18:56:04 字數 4056 閱讀 3487

1、

elasticseach

如何將資料儲存到分片中

問題:當我們要在es

中儲存資料的時候,資料應該儲存在主分片和複製分片中的哪乙個中去;當我們在

es中檢索資料的時候,又是怎麼判斷要查詢的資料是屬於哪乙個分片。

2、主分片與複製分片如何互動

為了說明這個問題,我用乙個例子來說明。

在上面這個例子中,有三個es的

node

,其中每乙個

index

中包含兩個

primary shard

,每個primary shard

擁有乙個

replica shard

。下面從幾種常見的資料操作來說明二者之間的互動情況。

索引與刪除乙個文件

這兩種過程均可以分為三個過程來描述:

階段1:客戶端傳送了乙個索引或者刪除的請求給

node 1

。階段2

:node 1

通過請求中文件的 

_id 

值判斷出該文件應該被儲存在

shard 0 

這個分片中,並且

node 1

知道shard 0

的primary shard

位於node 3

這個節點上。因此

node 1

會把這個請求**到

node 3

。階段3

:node 3

在shard 0 

的primary shard

上執行請求。如果請求執行成功,它

node 3

將並行地將該請求發給

shard 0

的其餘所有

replica shard

上,也就是存在於

node 1

和node 2

中的replica shard

。如果所有的

replica shard

都成功地執行了請求,那麼將會向

node 3

回覆乙個成功確認,當

node 3

收到了所有

replica shard

的確認資訊後,則最後向使用者返回乙個

success

的訊息。

更新乙個文件

該過程可以分為四個階段來描述:

階段1:客戶端向

node 1

傳送乙個文件更新的請求。

階段2:同樣的

node 1

通過請求中文件的 

_id 

值判斷出該文件應該被儲存在

shard 0 

這個分片中,並且

node 1

知道shard 0

的primary shard

位於node 3

這個節點上。因此

node 1

會把這個請求**到

node 3

。階段3

:node 3

從文件所在的

primary shard

中獲取到它的

json

檔案,並修改其中的

_source

中的內容,之後再重新索引該文件到其

primary shard

中。階段4

:如果node 3

成功地更新了文件,

node 3

將會把文件新的版本並行地發給其餘所有的

replica shard

所在node

中。這些

node

也同樣重新索引新版本的文件,執行後則向

node 3

確認成功,當

node 3

接收到所有的成功確認之後,再向客戶端傳送乙個更新成功的資訊。

檢索文件

crud這些操作的過程中一般都是結合一些唯一的標記例如:

_index

,_type

,以及routing

的值,這就意味在執行操作的時候都是確切的知道文件在集群中的哪個

node

中,哪個

shard

中。而檢索過程往往需要更多的執行模式,因為我們並不清楚所要檢索的文件具體位置所在, 它們可能存在於es

集群中個任何位置。因此,一般情況下,檢索的執行不得不去詢問

index

中的每乙個

shard

。但是,找到所有匹配檢索的文件僅僅只是檢索過程的一半,在向客戶端返回乙個結果列表之前,必須將各個shard

發回的小片的檢索結果,拼接成乙個大的已排好序的彙總結果列表。正因為這個原因,檢索的過程將分為查詢階段與獲取階段(

query phase and fetch phase

)。在最初的查詢過程中,查詢請求會廣播到index

中的每乙個

primary shard

和replica shard

中,每乙個

shard

會在本地執行檢索,並建立乙個優先順序佇列(

priority queue

)。這個優先順序佇列是乙個根據文件匹配度這個指標所排序列表,列表的長度由分頁引數

from

和size

兩個引數所決定。例如:

下面從乙個例子中說明這個過程:

query phase階段可以再細分成

3個小的子階段:

子階段1

:客戶端傳送乙個檢索的請求給

node 3

,此時node 3

會建立乙個空的優先順序佇列並且配置好分頁引數

from

與size

。子階段2

:node 3

將檢索請求傳送給該

index

中個每乙個

shard

(這裡的每乙個意思是無論它是

primary

還是replica

,它們的組合可以構成乙個完整的

index

資料)。每個

shard

在本地執行檢索,並將結果新增到本地優先順序佇列中。

子階段3

:每個shard

返回本地優先順序序列中所記錄的

_id與

sort

值,並傳送

node 3

。node 3

將這些值合併到自己的本地的優先順序佇列中,並做全域性的排序。

query phase主要定位了所要檢索資料的具體位置,但是我們還必須取回它們才能完成整個檢索過程。而

fetch phase

階段的任務就是將這些定位好的資料內容取回並返回給客戶端。

同樣也用乙個例子來說明這個過程:

fetch phase過程可以分為三個子過程來描述:

子階段1

:node 3

獲取了所有待檢索資料的定位之後,傳送乙個

mget

的請求給與資料相關的

shard

。子階段2

:每個收到

node 3

的get

請求的shard

將讀取相關文件

_source

中的內容,並將它們返回給

node 3

。子階段3

:當node 3

獲取到了所有

shard

返回的文件後,

node 3

將它們合併成一條彙總的結果,返回給客戶端。

elasticsearch 分片選擇

相信讀者建立index的時候,一定曾經糾結過分片數應該分配多少。筆者從實用角度來講述一下index分片數量的選擇,index分片數量嚴格來說不能過多,也不能過少,還要兼顧分片平衡以及集群壓力。現在從一些角度來講主分片數應該怎麼選擇。分析 若乙個es集群的節點數為3,則考慮業務擴充套件 無論是容量還是...

ElasticSearch分片詳解

1.我們能夠傳送請求給集群中任意乙個節點。每個節點都有能力處理任意請求。每個節點都知道任意文件所在的節點 2.新建索引和刪除請求都是寫操作,它們必須在主分片上成功完成才能賦值到相關的複製分片上 3.在主分片和複製分片上成功新建 索引或刪除乙個文件必要的順序步驟 1 客戶端給node1 傳送新建 索引...

Elasticsearch 分片原理1

elasticsearch版本 6.0 elasticsearch基於lucene,採用倒排索引寫入磁碟,lucene引入了按段搜尋的概念,來動態更新索引。乙個lucene索引包含乙個提交點和三個短,如圖 關於索引和分片乙個lucene索引在elasticsearch成為分片,乙個elasticse...