解決叢集 Yellow 與 Red 的問題

CrazyZard發表於2020-03-04
  • 叢集健康度
    分片健康
  • 紅:至少有一個主分片沒有分配
  • 黃:至少有一個副本沒有分配
  • 綠:主副本分片全部正常分配
    • 索引健康: 最差的分片的狀態
    • 叢集健康: 最差的索引的狀態
GET _cluster/health 叢集的狀態(檢查 節點數量)
GET _cluster/health?level=indices 所有索引的健康狀態 (檢視有問題的索引
GET _cluster/health/my_index 單個索引的健康狀態(檢視具體的索引)
GET _cluster/health?level=shards 分片級的索引
GET _cluster/allocation/explain 返回第一個未分配 Shard 的原因

解決叢集 Yellow 與 Red 的問題

案例 1

  • 症狀:叢集變紅
  • 分析:通過 Allocation Explain API 發現 建立索引失敗,因為無法找到標記了相應 box type
    的節點
  • 解決:刪除索引,叢集變綠。重新建立索引,並且指定正確的 routing box type,索引建立成
    功。叢集保持綠色狀態
PUT mytest
{
  "settings":{
    "number_of_shards":3,
    "number_of_replicas":0,
    "index.routing.allocation.require.box_type":"hott"
  }
}
# 檢查叢集狀態,檢視是否有節點丟失,有多少分片無法分配
GET /_cluster/health/

# 檢視索引級別,找到紅色的索引
GET /_cluster/health?level=indices

#檢視索引的分片
GET _cluster/health?level=shards

# Explain 變紅的原因
GET /_cluster/allocation/explain
//return 
"deciders" : [
        {
          "decider" : "filter",
          "decision" : "NO",
          "explanation" : """node does not match index setting [index.routing.allocation.require] filters [box_type:"hott"]"""
        }
      ]

GET /_cat/shards/mytest

GET _cat/nodeattrs

DELETE mytest
# 檢視叢集 叢集變綠
GET /_cluster/health/

PUT mytest
{
  "settings":{
    "number_of_shards":3,
    "number_of_replicas":0,
    "index.routing.allocation.require.box_type":"hot"
  }
}

案例 2

  • 症狀:叢集變黃
  • 分析:通過 Allocation Explain API 發現無法在相同的節點上建立副本
  • 解決:將索引的副本數設定為 0,或者通過增加節點解決
    PUT mytest
    {
    "settings":{
      "number_of_shards":2,
      "number_of_replicas":1,
      "index.routing.allocation.require.box_type":"hot"
    }
    }
    GET _cluster/health
    GET _cat/shards/mytest
    GET /_cluster/allocation/explain
    PUT mytest/_settings
    {
      "number_of_replicas": 0
    }
  • INDEX_CREATE: 建立索引導致。在索引的全部分片分配完成之前,會有短暫的 Red,不一定代表有問題
  • CLUSTER_RECOVER:叢集重啟階段,會有這個問題
  • INDEX_REOPEN:Open 一個之前 Close 的索引
  • DANGLING_INDEX_IMPORTED:一個節點離開叢集期間,有索引被刪除。這個節點重新返回時,會導致 Dangling 的問題
  • 叢集變紅,需要檢查是否有節點離線。如果有,通常通過重啟離線的節點可以解決問題
  • 由於配置導致的問題,需要修復相關的配置(例如錯誤的 box_type,錯誤的副本數)
    • 如果是測試的索引,可以直接刪除
  • 因為磁碟空間限制,分片規則(Shard Filtering)引發的,需要調整規則或者增加節點
  • 對於節點返回叢集,導致的 dangling 變紅,可直接刪除 dangling 索引
  • Red & Yellow 是叢集運維中常見的問題
  • 除了叢集故障,一些建立,增加副本等操作,
    都會導致叢集短暫的 Red 和 Yellow,所以
    監控和報警時需要設定一定的延時
  • 通過檢查節點數,使用 ES 提供的相關 API,
    找到真正的原因
  • 可以指定 Move 或者 Reallocate 分片

解決叢集 Yellow 與 Red 的問題

本作品採用《CC 協議》,轉載必須註明作者和本文連結

快樂就是解決一個又一個的問題!

相關文章