《elasticsearch》之讀寫資料
es 寫資料過程
1)客戶端選擇一個 node 傳送請求過去,這個 node 就是coordinating node
(協調節點)。
2)coordinating node
對 document 進行路由,將請求轉發給對應的 node(有 primary shard)。
3)node 上的 主分片(primary shard
)處理請求,然後將資料同步到 複製分片(replica node)
。
4)node報告成功到協調節點,協調節點再報告給客戶端。
es 讀資料過程
可以通過doc id
來查詢,會根據doc id
進行 hash,判斷出來當時把doc id
分配到了哪個 shard 上面去,從那個 shard 去查詢。
1)客戶端傳送請求到任意一個 node,成為coordinate node
。
2)coordinate node
對doc id
進行雜湊路由,將請求轉發到對應的 node,此時會使用round-robin
隨機輪詢演算法,在primary shard
以及其所有 replica 中隨機選擇一個,讓讀請求負載均衡。
3)接收請求的 node 返回 document 給coordinate node
。
4)coordinate node
返回 document 給客戶端。
es 搜尋資料過程
1)客戶端傳送請求到一個coordinate node
。
2)協調節點將搜尋請求轉發到所有的 shard 對應的primary shard
或replica shard
,都可以。
3)query phase:每個 shard 將自己的搜尋結果(其實就是一些doc id
)返回給協調節點,由協調節點進行資料的合併、排序、分頁等操作,產出最終結果。
4)fetch phase:接著由協調節點根據doc id
去各個節點上拉取實際的document
資料,最終返回給客戶端。
查詢階段:
(1)客戶端傳送一個 search(搜尋) 請求給 協調節點,協調節點建立了一個長度為 from+size 的空優先順序佇列。
(2)協調節點轉發這個搜尋請求到索引中每個分片的原本或副本。每個分片在本地執行這個查詢並且結果將結果到一個大小為 from+size 的有序本地優先佇列裡去。
(3)每個分片返回document的ID和它優先佇列裡的所有document的排序值給協調節點 。 協調節點把這些值合併到自己的優先佇列裡產生全域性排序結果。
取回階段:
(1)協調節點辨別出哪個document需要取回,並且向相關分片發出 GET 請求。
(2)每個分片載入document並且根據需要豐富(enrich)它們,然後再將document返回協調節點。
(3)一旦所有的document都被取回,協調節點會將結果返回給客戶端。