es之主分片和復制分片的交互過程


1:索引(創建或者刪除)一個文檔

首先:發送一個索引或者刪除的請求給node1

其次:node1接收到請求之后,會根據請求中攜帶的參數“文檔id”判斷出該文檔應該存儲在具體哪一個shard中

shard = hash(routing) % number_of_primary_shards

,比如shard0;其次就是node1通過元數據信息可以知道shard0在具體哪一個節點,於是node1會把請求轉發給node3

最后:node3接收到請求之后會將請求並行的分發給shard0的所有replica shard之上,也就是存在於node 1和node 2中的replica shard;如果所有的replica shard都成功地執行了請求,那么將會向node 3回復一個成功確認,當node 3收到了所有replica shard的確認信息后,則最后向用戶返回一個Success的消息。

 

2:刪除一個文檔

該過程可以分為四個階段來描述: 階段1:客戶端向node 1發送一個文檔刪除的請求。 階段2:同樣的node 1通過請求中文檔的 _id 值判斷出該文檔應該被存儲在shard 0 這個分片中,並且node 1知道shard 0的primary shard位於node 3這個節點上。因此node 1會把這個請求轉發到node 3。 階段3:node 3接收到請求后,在主分片上面執行刪除請求 階段4:如果node 3成功地刪除了文檔,node 3將會請求並行地發給其余所有的replica shard所在node中。這些node也同樣操作刪除,執行后則向node 3確認成功,當node 3接收到所有的成功確認之后,再向客戶端發送一個刪除成功的信息。

3:檢索文檔

檢索文檔的時候,我們並不知道文檔在集群中的哪個位置,所以一般情況下不得不去詢問index中的每一個shard,然后將結果拼接成一個大的已排好序的匯總結果列表;

(1):客戶端發送一個檢索請求給node3,此時node3會創建一個空的優先級隊列並且配置好分頁參數from與size。

(2):node3將檢所請求發送給index中的每一個shard(primary 和 replica),每一個在本地執行檢索,並將結果添加到本地的優先級隊列中;

(3):每個shard返回本地優先級序列中所記錄的_id與score值,並發送node3。Node3將這些值合並到自己的本地的優先級隊列中,並做全局的排序(node 3將它們合並成一條匯總的結果),返回給客戶端。

列子:

1):構建測試數據:

PUT website/blog/1
{
 "title" : "this is title",
 "conteng" : "this is content"
}
PUT website/blog/2
{
 "title" : "thi title",
 "conteng" : "thi content"
}
PUT website/blog/3
{
 "title" : "thitle",
 "conteng" : "thontent"
}
PUT website/blog/4
{
 "title" : "aaa",
 "conteng" : "aaaaa"
}
PUT website/blog/5
{
 "title" : "bbbbb",
 "conteng" : "cccccc"
}

PUT website/blog/6
{
 "title" : "e",
 "conteng" : "ssss"
}
PUT website/blog/7
{
 "title" : "this title",
 "conteng" : "thi content"
}

在最初的查詢過程中,查詢請求會廣播到index中的每一個primary shard和replica shard中,每一個shard會在本地執行檢索,並建立一個優先級隊列(priority queue)。這個優先級隊列是一個根據文檔匹配度這個指標所排序列表,列表的長度由分頁參數from和size兩個參數所決定

GET website/_search
{
 "query": {
   "match": {
     "title": "this"
  }
}
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM