Elasticsearch版本:6.0
一、Elasticsearch計算分片位置的公式
shard = hash(routing) % number_of_primary_shards
解釋:
routing是一個可變值,默認是文檔的_id,也可以設置成一個自定義的值。routing通過 hash 函數生成一個數字,然后這個數字再除以number_of_primary_shards(主分片的數量)后得到 余數 。這個分布在0到number_of_primary_shards-1之間的余數,就是我們所尋求的文檔所在分片的位置。所以說主分片的數量不會改變,,因為如果改變了,文檔就找不到了。
二、主分片和副本分片的交互
我們可以發送請求到集群中的任一節點。 每個節點都有能力處理任意請求。 每個節點都知道集群中任一文檔位置,所以可以直接將請求轉發到需要的節點上。
TIP: 當發送請求的時候,為了擴展負載,更好的做法是輪詢集群中所有的節點。
新建、索引和刪除 請求都是 寫 操作, 必須在主分片上面完成之后才能被復制到相關的副本分片。
在處理讀取請求時,協調結點在每次請求的時候都會通過輪詢所有的副本分片來達到負載均衡。
局部更新文檔update API 結合了先前說明的讀取和寫入模式 。
查詢階段
查詢會廣播到索引中每一個分片拷貝(主分片或者副本分片)。 每個分片在本地執行搜索並構建一個匹配文檔的 _優先隊列_。
- 客戶端發送一個 search 請求到 Node 3 , Node 3 會創建一個大小為 from + size 的空優先隊列。
- Node 3 將查詢請求轉發到索引的每個主分片或副本分片中。每個分片在本地執行查詢並添加結果到大小為 from + size 的本地有序優先隊列中。
- 每個分片返回各自優先隊列中所有文檔的 ID 和排序值給協調節點,也就是 Node 3 ,它合並這些值到自己的優先隊列中來產生一個全局排序后的結果列表。
分片返回一個輕量級的結果列表到協調節點,它僅包含文檔 ID 集合以及任何排序需要用到的值,例如 _score 。
取回階段
取回階段,查詢階段標識哪些文檔滿足 搜索請求,但是我們仍然需要取回這些文檔。
- 協調節點辨別出哪些文檔需要被取回並向相關的分片提交多個 GET 請求。
- 每個分片加載並 豐富 文檔,如果有需要的話,接着返回文檔給協調節點。
- 一旦所有的文檔都被取回了,協調節點返回結果給客戶端。





