圖解ES文檔的讀寫原理
1. 簡介
ES的Document API分單文檔API和多文檔API,它們的作用是對文檔進行CRUD操作。
注意:所有的CRUD API都單index API,它們只接收一個index name或alias。
1.1 單文檔API
- Index
- Get
- Delete
- Update
1.2 多文檔API
- Multi Get
- Bulk
- Delete By Query
- Update By Query
- Reindex
2. 讀寫文檔
2.1 主分片和副本分片
ES中每個index都被切分爲幾個分片,每個分片都可有多個副本。
舉例:
- 1個集羣有3個節點(node1~node3)
- 1個index被分爲2個分片,分片1(P1),分片2(P2),P是Primary的縮寫
- 1個主分片有2個副本分片,P1的副本爲R1,P2的副本是R2,R是Replica的縮寫
目前分片情況如下圖:
圖中綠色方塊P1+兩個R1是屬於同一個複製組(Replication Group)。
同理黃色方塊P2+兩個R2是屬於同一個複製組(Replication Group)。
3. 寫模式
文檔的寫模式包括新增/修改/刪除文檔。它一般有如下執行步驟。
- ES的index操作第一步都是通過routing決定發往哪個複製組(Replication Group)。
- 一旦確定了複製組,index操作會被轉發給這個複製組內的主分片(如上圖的P1或P2)。
- 主分片負責驗證index操作,驗證通過則執行該index操作。
- 主分片執行成功後,把index操作轉發給它的所有副本分片。
- 一旦所有的副本分片執行成功並通知到主分片,主分片才通知主節點(協調節點)執行成功。
- 主節點將結果返回給客戶端。
下面通過圖片依次介紹上面的操作(PPT畫的圖,不好看,見諒)
3.1 routing到主分片
- 客戶端(笑臉)把請求發給ES集羣裏的協調節點node1
- 根據routing算出文檔屬於黃色的複製組
- 協調節點node1把index操作轉發給黃色複製組中主分片P2
3.2 主分片分發給副本分片
- 主分片P2介紹到請求並驗證,驗證通過後執行操作
- 主分片P2把請求轉發給它的副本(2個黃色的R2)
3.3 執行成功後返回通知
- 副本分片R2執行請求,把結果返回給主分片P2,圖中紅色線4
- 主分片接受到所有的副本分片返回的成功結果,才通知協調節點node1成功了,圖中黃色線5
- 協調節點node1告訴客戶端(笑臉)該寫操作執行成功
4. 讀模式
ES可以有非常輕量級的查詢:按照ID查找。也可以有複雜的聚合搜索請求。主備模型的一個優點就是它讓所有的分片(主和備)的數據是等同的。
ES的增刪改是在主節點上協調操作的,但是讀操作是可以由非主節點操作。
當一個節點接受到讀請求時,該節點負責將該請求轉發到保存該文檔的相關分片的節點。我們稱該節點爲協調節點(注意只是本次請求的協調節點)。
- 協調節點解析到相關分片,默認根據id值hash,獲取是哪個分片(複製組1還是複製組2)
- 從分片的複製組中選擇一個活動分片(通常是輪詢),可以是主分片也可是副本分片
- 向所選分片發送讀取請求,分片查詢結果返回給協調節點
- 協調節點將結果整合,返回給客戶端
4.1 接受請求,再獲取分片複製組
- node1獲取了客戶端的請求,箭頭1
- node1計算出文檔在綠色的複製組(P1+R1)
- node1根據輪詢算法,把請求發給node2上的R1
4.2 返回結果
- node2把R1裏的文檔飯會給node1,箭頭3
- node1把文檔返回給客戶端,箭頭4
5. 總結
ES的知識點太多,這裏只是簡單的介紹下它的讀寫模式,他的讀寫異常處理暫時不涉及到,需要了解的可以看官方文檔,寫的很詳細。
下面打算結合ES的Query DSL和JavaAPI,深入學習ES的Document和Search模塊。