什麼是分片(Shard)和副本(Replica)?一文徹底搞懂!
❝明明數據量不大,ES 卻經常報紅?集羣老是負載不均?
問題 80% 出在分片和副本沒理解透!
本文一次性講清楚 Shard 和 Replica 的底層邏輯與實戰經驗。❞
🧠 什麼是分片(Shard)?
一句話理解:
分片(Shard)就是把一個索引的數據,切成多塊,分別存到不同節點上。
因爲 Elasticsearch 是面向大數據量設計的,如果一個索引特別大(比如上億條文檔),單機根本存不下。
所以,ES 會自動把數據分成多個小塊 —— 每一塊就是一個 主分片(Primary Shard)。
每個主分片背後,就是一個獨立的 Lucene 引擎實例。
🎯 爲什麼要有分片?
-
✅ 支持海量數據存儲(TB、PB 級別都能頂住)
-
✅ 支持分佈式併發查詢(多個分片同時查,速度飛起)
-
✅ 支持水平擴展(加機器,加節點,系統變更強)
🧠 什麼是副本(Replica)?
副本,是對主分片的完整拷貝。
每個主分片,都可以有一份或者多份副本分片。
副本在另外的節點上存儲,主要爲了兩件事:
-
✅ 高可用:主分片壞了,副本能馬上頂上。
-
✅ 讀性能優化:查詢可以在副本上分攤壓力。
⚡ 重點注意:副本不會參與寫入,只用於查詢和故障切換。
📦 一個簡單的例子
假設有:
-
一個索引
products
-
主分片數:3
-
副本數:1
那麼實際在集羣中,會有:
-
3 個主分片(P0、P1、P2)
-
3 個副本分片(R0、R1、R2)
總共 6 個分片,分佈在不同節點上。
🔥 分片和副本的工作流程
-
寫入數據 ➔ 落到某個主分片(Primary)
-
同時複製 ➔ 落到對應的副本分片(Replica)
-
查詢請求 ➔ 可以隨機從主分片或者副本分片讀取
⚡ 如果某臺機器掛了,只要副本還在,數據無損,系統無感切換!
🛠 如何設置分片和副本?
建索引的時候可以指定,比如:
PUT /products
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}
注意:
-
分片數量(number_of_shards) ➔ 索引創建時就要確定,後期不能改!(只能重建索引)
-
副本數量(number_of_replicas) ➔ 可以動態修改!
修改副本數示例:
PUT /products/_settings
{
"number_of_replicas": 2
}
🎯 分片數量怎麼選?(面試必考!)
經驗總結:
💡 目標是:每個分片的數據量控制在 10~50GB 左右最理想!
太少分片 ➔ 節點資源浪費
太多分片 ➔ 集羣管理開銷爆炸(分片過多,集羣變慢)
⚡ 常見坑提醒
-
❗ 分片數定死了,後期不能改!要提前預估好數據量。
-
❗ ** 副本不是備份!** 副本保護的是高可用,不是防止誤刪!
-
❗ ** 副本同步是實時的,不是秒同步。** 大量寫入時注意副本延遲問題。
小結一句話
主分片負責存,副本負責頂;合理分片,集羣纔有好命!
掌握分片與副本的設計邏輯,才能真正讓 Elasticsearch 又快又穩!
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/OaMvNcxdtZ05ITS9RB1tdQ