這邊列出幾個常見的 shards & replicas 問題及流程機制:

shard & replicas 資料寫入流程

在 Elasticsearch 的 consistency 參數可設定儲存的策略,是否要等 shard & replicas 儲存完才可以查詢,或參數設定為 one 就能讓 primary shard 儲存後就先回覆成功。

Client 如果要寫入數據時,首先會透過協調節點透過 Hash(id)% shards number 算法來轉換到指定節點,主 shard 先將數據保存,再將數據同步到 replicas shards,確認完成後主 shard 會再回覆 Client 成功寫入,基本流程如下:

  1. Client 端請求 Cluster node
  2. 協調節點將請求轉換到指定的 Node
  3. primary shard 將數據儲存
  4. primary shard 將數據發送到 Replicas shards 儲存
  5. primary shard 取得儲存成功回應
  6. Client 端取得儲存成功回應

shard & replicas 查詢數據流程

Client 發出請求時,會透過協調節點計算出所在的 node,以及取得 primary shard 與 replicas,會用輪詢方式訪問其中一個以達到負載均衡,再透過該 Node 返回給 Client,流程羅列如下:

  1. Client 發送查詢請求到協調節點
  2. 協調節點會計算數據所在的分片,以及所有 replicas 位置
  3. 會輪詢這些數據所在的 shard & replicas ,達到負載均衡
  4. 將請求轉發給具體的 node
  5. node 返回結果給 Client

shard & replicas 更新數據流程

基本流程與前面提到的差不多,但更新會需要先進行查詢,再執行更新。

single node replicas shards Unassigned 原因及解決方式

當 Cluster 中只有一個 node 在運作,就稱為單節點集群,數據在這情況下無法建立 replicas (replicas shards 會顯示為 Unassigned),只要 node 發生問題,數據就會丟失,

例如,可以試著單一個空的 Node 在創建索引時,同時設置 shards 以及 replicas,下方為 3 primary shards 以及 replicas shards:

request PUT 'http://localhost:9200/products' 
header 'Content-Type: application/json' 
data-raw '{
  "settings":{
    "number_of_shards": 3,
    "number_of_replicas": 1
  }
}'

response

{
    "acknowledged": true,
    "shards_acknowledged": true,
    "index": "products"
}

設定完成後,如果是單一節點,上面 3 個 shards 都會分配到同一個 node 中,可以透過 chrome 瀏覽器的擴充套件 elasticsearch-head 來查看 elasticsearch cluster 的狀況。

開啟後,應該就可以看到 shards 顯示正常,但 replicas shards 會顯示為 Unassigned 的警示。

這時只要再加入另外一個 node,Cluster 的 primary shard 以及 Replicas shards 就會在重新分配,

這時就能夠讓兩個 Node 都恢復正常運作,可以看到 replicas shards 顯示為綠色。

當資料量成長,可以再增加 Node 進行水平擴充讓 shard 重新分配到多台機器,提升吞吐負載。

Elasticsearch 增加容量時,shards 如何調整?

提醒的是,primary shard 在創建時,數量已經確定就無法再更改;

前面提到,協調節點會透過算法來將查詢的內容根據 shard 的數量來做路由分配,

所以在初期需要好好的評估業務數據量,判斷適當的 shard,太多的 shard 則匹配度效率也會變低,

一般來說,**shard 佔用的容量不要超過 JVM 堆疊空間的配置,通常不會設定超過 32G **,

設定 shard 的數量不會超過 Node 的 3 倍,避免 shard 遠超過 node ,可能會導致一個 node 存在多個 shard,該 node 如果發生故障,

就算有設定 1 個以上的 replicas,仍有可能導致數據丟失無法恢復。

primary shard 與 replicas shard 設置的數量可以參考下面的計算方式:

Node number <= primary shard * (replica + 1)

當機器需要大量提升時,但 primary shard 數量設定低於機器數量,這時可以透過增加 replicas shards 的數量

例如,下方 replicas shards 由 1 調整為 2:

request PUT 'http://localhost:9200/products' 
header 'Content-Type: application/json' 
data-raw '{
  "settings":{
    "number_of_replicas": 2
  }
}'

Node 發生異常時,health 變更為 Yellow 的狀況

如果 Cluster 多個 node,某一個 Node 故障出現 Unassigned 時,會造成集群健康狀況降低,

但如果 primary shards 還健全,雖然 replicas 不完全,還能正常提供服務。

如果發生故障的 Node 為 master node,則會再重新推舉出一個 master node 負責管理 cluster, node 及 index。

這時,同前面提到,可以在新增 Node 讓 shard 重新分配讓健康度恢復。