什麼是分片(Shard)和副本(Replica)?一文徹底搞懂!

❝明明數據量不大,ES 卻經常報紅?集羣老是負載不均?
問題 80% 出在分片和副本沒理解透!
本文一次性講清楚 Shard 和 Replica 的底層邏輯與實戰經驗。❞

🧠 什麼是分片(Shard)?

一句話理解:

分片(Shard)就是把一個索引的數據,切成多塊,分別存到不同節點上。

因爲 Elasticsearch 是面向大數據量設計的,如果一個索引特別大(比如上億條文檔),單機根本存不下。

所以,ES 會自動把數據分成多個小塊 —— 每一塊就是一個 主分片(Primary Shard)

每個主分片背後,就是一個獨立的 Lucene 引擎實例。

🎯 爲什麼要有分片?

🧠 什麼是副本(Replica)?

副本,是對主分片的完整拷貝

每個主分片,都可以有一份或者多份副本分片。

副本在另外的節點上存儲,主要爲了兩件事:

⚡ 重點注意:副本不會參與寫入,只用於查詢故障切換

📦 一個簡單的例子

假設有:

那麼實際在集羣中,會有:

總共 6 個分片,分佈在不同節點上。

4osylW

🔥 分片和副本的工作流程

  1. 寫入數據 ➔ 落到某個主分片(Primary)

  2. 同時複製 ➔ 落到對應的副本分片(Replica)

  3. 查詢請求 ➔ 可以隨機從主分片或者副本分片讀取

⚡ 如果某臺機器掛了,只要副本還在,數據無損,系統無感切換!

🛠 如何設置分片和副本?

建索引的時候可以指定,比如:

PUT /products
{
  "settings"{
    "number_of_shards": 3,
    "number_of_replicas"1
  }
}

注意:

修改副本數示例:

PUT /products/_settings
{
  "number_of_replicas"2
}

🎯 分片數量怎麼選?(面試必考!)

經驗總結:

t1HVng

💡 目標是:每個分片的數據量控制在 10~50GB 左右最理想!

太少分片 ➔ 節點資源浪費
太多分片 ➔ 集羣管理開銷爆炸(分片過多,集羣變慢)

⚡ 常見坑提醒

小結一句話

主分片負責存,副本負責頂;合理分片,集羣纔有好命!

掌握分片與副本的設計邏輯,才能真正讓 Elasticsearch 又快又穩!

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/OaMvNcxdtZ05ITS9RB1tdQ