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...