一 序
本文屬於極客時間Elasticsearch核心技術與實戰學習筆記系列。
二 文檔儲存在分片上
文檔會存儲在具體的某個主分片和副本分片上:例如文檔 1,會儲存在 P0 R0 分片上
文檔到分片的映射算法
- 確保文檔能均勻分佈在所用分片上,充分利用硬件資源,避免部分機器空閒,部門機器繁忙
- 潛在的算法
- 隨機 / Round Robin. 當查詢文檔 1,分片數很多,需要多次查詢才能查檔文檔 1
- 維護文檔到分片的映射關係,當文檔數據量大的時候,維護成本高
- 實時計算,通過文檔 1,自動算出,需要去哪個分片上獲取文檔.
這裏ES採用的就是方案3
2.1 文檔到分片的路由算法
shard = hash(_routing) % number_of_primary_shards
- Hash 算法確保文檔均勻分散到分片中
- 默認的_routing 值是文檔 id
- 可以自行制定 routing 數值,例如用相同國家的商品,都分配到制定的 shard
- 設置 Index Setting 後,Primary 數,不能隨意修改的根本原因
2.2 更新文檔
順序: index -> hash -> route -> delete -> index -> success -> response
1, 用戶發出update請求,第一個節點是Coordinating Node,他通過hash計算算出文檔對應分片,路由到這個分片。
更新是執行的兩步,先刪除再創建。成功後返回一個success給Coordinating Node,Coordinating Node再返回response
2.3刪除一個文檔
順序 :detele -> hash&route -> delete -> delete replica -> success -> deleted -> response
跟更新類似,多了刪除副本的流程。
補充知識點:
- 可以設置 Index Settings ,控制數據的分片
- Primary Shard 的值不能修改,修改需要重新 Index。
- 索引寫入數據後,Replica 值可以修改。增加副本,可提高大併發下的讀取性能
- 通過控制集羣的節點數,設置 Primary Shard 數,實現水平擴展