為何我的 Amazon OpenSearch Service 叢集處於紅色或黃色狀態?

上次更新日期:2021 年 7 月 30 日

我的 Amazon OpenSearch Service (Amazon Elasticsearch Service 的後繼服務) 叢集處於紅色或黃色的叢集狀態。為什麼會發生此情況?

簡短描述

OpenSearch Service 主控台中的 Monitoring (監控) 索引標籤會指出叢集中運作狀態最差索引的狀態。顯示紅色狀態的叢集狀態並不代表叢集已關閉。而是這種狀態表示至少有一個主碎片及其複本沒有分配到節點。如果您的叢集狀態顯示黃色狀態,則所有索引的主碎片都已分配到叢集中的節點。但是,至少一個索引的複本碎片沒有分配到任何節點。

注意:未先解除紅色叢集狀態之前,請勿重新設定網域。如果您嘗試在網域處於紅色叢集狀態時重新設定網域,可能會卡在 "Processing" (處理中) 狀態。如需有關叢集卡在 "Processing" (處理中) 狀態的詳細資訊,請參閱為什麼我的 Amazon OpenSearch Service 網域停留在 "Processing" (處理中) 狀態?

您的叢集之所以進入紅色狀態,可能的原因如下:

  • 多個資料節點故障
  • 對索引使用損毀或紅色碎片
  • 高 JVM 記憶體壓力或 CPU 使用率
  • 磁碟空間不足或磁碟偏斜

注意:在某些情況下,您可以刪除並從自動快照中還原索引,以解決紅色叢集狀態。

您的叢集之所以進入黃色運作狀態,可能的原因如下:

  • 建立新索引
  • 沒有足夠的節點可分配給碎片或磁盤偏斜
  • 高 JVM 記憶體壓力
  • 單一節點故障
  • 超過碎片分配重試次數上限

注意:如果您的黃色叢集狀態無法自行解除,可以透過更新索引設定或手動重新路由未分配的碎片來解除狀態。如果您的黃色叢集狀態無法自我解除,請識別並疑難排解根本原因。若要避免進入黃色叢集狀態,請套用叢集運作狀態最佳實務

解決方案

識別未分配碎片的原因

若要識別未分配的碎片,請執行下列步驟:

1.    列出未分配的碎片:

$ curl -XGET 'domain-endpoint/_cat/shards?h=index,shard,prirep,state,unassigned.reason' | grep UNASSIGNED

2.    擷取碎片為何未分配的詳細資訊:

$ curl -XGET 'domain-endpoint/_cluster/allocation/explain?pretty' -H 'Content-Type:application/json' -d'{"index": "<index name>", "shard": <shardId>, "primary":<true or false>}'

3.    (選擇性) 若為紅色叢集狀態,請刪除該索引,並識別並解決根本原因:

curl -XDELETE 'domain-endpoint/<index names>'

然後,識別可用的快照,並並從快照還原索引

curl -XGET 'domain-endpoint/_snapshot?pretty'

對於黃色叢集狀態,請解決根本原因,以便分配您的碎片。

疑難排解紅色或黃色叢集狀態

沒有足夠的節點可分配給碎片

複本碎片不會被分配到與主碎片相同的節點。具有複本碎片的單一節點叢集始終會在黃色叢集狀態下初始化。單一節點叢集會以這種方式初始化,是因為沒有其他節點可供 OpenSearch Service 分配複本。

OpenSearch Service 7.x 及更新版本的 cluster.max_shards_per_node 設定也有 "1,000" 的預設限制。最佳實務是維持 cluster.max_shards_per_node 設定為預設值 "1000"。如果您設定碎片分配篩選條件以控制 OpenSearch Service 如何分配碎片,則碎片可能會由於篩選後沒有足夠的節點而未能分配。若要避免此節點短缺,請增加您的節點數量。請確保每個主碎片的複本數量小於資料節點的數量。您也可以減少複本碎片的數量。如需詳細資訊,請參閱規模調整 OpenSearch Service 網域OpenSearch Service 碎片分配解密

磁碟空間不足或磁碟偏斜

如果磁碟空間不足,您的叢集可能進入紅色或黃色的運作狀態。在 OpenSearch Service 分配碎片之前,必須有足夠的磁盤空間能容納碎片。

若要檢查叢集中的每個節點有多少可用儲存空間,請使用下列語法:

$ curl domain-endpoint/_cat/allocation?v

如需有關儲存空間問題的詳細資訊,請參閱如何疑難排解 Amazon OpenSearch Service 網域中的低儲存空間?

磁碟嚴重偏斜也會導致某些資料節點發生儲存空間不足的問題。如果您決定重新分配任何碎片,碎片可能會在碎片分佈期間變成未分配。若要解決此問題,請參閱如何重新平衡 Amazon OpenSearch Service 叢集中的不均勻碎片分佈?

以磁碟為基礎的碎片分配設定也可能導致碎片未分配。例如,如果 cluster.routing.allocation.disk.watermark.low 指標設為 50 GB,則必須有指定的磁碟空間數量可供碎片分配使用。

若要檢查目前的以磁碟為基礎的碎片分配設定,請使用下列語法:

$ curl -XGET domain-endpoint/_cluster/settings?include_defaults=true&flat_settings=true

若要解決磁碟空間問題,請考慮下列方法:

  • 刪除任何不需要的索引。
  • 擴展 EBS 磁碟區。
  • 新增更多資料節點。

高 JVM 記憶體壓力

每次碎片分配都會用到 CPU、堆積空間,以及磁碟和網路資源。持續施加高程度的 JVM 記憶體壓力可能導致碎片分配失敗。例如,如果 JVM 記憶體壓力超過 95%,會觸發記憶體上層斷路器。分配執行緒就會取消,導致碎片並未分配。

若要解決此問題,請先降低 JVM 記憶體壓力程度。在您的 JVM 記憶體壓力降低後,請考慮以下其他提示,使您的叢集恢復綠色運作狀態:

  • 將預設碎片重試值增加到 "5" 或更高。
  • 將複本碎片停用再重新啟用。
  • 手動重試未分配的碎片。

如需有關減少 JVM 記憶體壓力的詳細資訊,請參閱如何疑難排解 Amazon OpenSearch Service 叢集上的高 JVM 記憶體壓力?

節點故障

當您的叢集遇到節點故障時,分配給節點的碎片會變成未分配。當給定索引沒有可用的複本碎片時,即使是單個節點故障也會導致紅色的運作狀態。擁有兩個複本碎片和異地同步備份部署可保護您的叢集,避免在硬體故障期間遺失資料。

如果所有索引都有複本碎片,則單個節點故障可能會導致叢集暫時進入黃色運作狀態。如果您的叢集暫時處於黃色運作狀態,則 OpenSearch Service 會在節點再次運作狀況良好時自動復原。或者,當碎片分配給新的節點時,OpenSearch Service 即可復原。

您可以透過檢查 Amazon CloudWatch 的指標來確認任何節點故障。如需識別節點故障的詳細資訊,請參閱故障的叢集節點

注意:同樣地,最佳實務是為每個索引分配一個複本碎片或使用專屬主節點並啟用區域感知。如需更多資訊,請參閱 Elasticsearch 網站上的 Coping with failure (因應故障)。

超過重試次數上限

在 OpenSearch Service 中,您的叢集不可超過碎片分配的最大時間限制 (5,000 毫秒) 或重試次數 (5)。如果您的叢集已達到最大閾值,則必須手動觸發碎片分配。若要手動觸發分片分配,請停用再重新啟用索引的複本碎片。

叢集上的組態變更也可以觸發碎片分配。不過,當叢集處於紅色運作狀態時,請避免對叢集進行任何組態變更。如需有關碎片分配的更多資訊,請參閱 Elasticsearch 網站上的 Every shard deserves a home (每個碎片都應當有個去處)。

注意:如果叢集的工作負載繁重,則手動觸發碎片分配並不是最佳實務。如果從索引中刪除所有複本,則索引必須僅依賴主碎片。當節點故障時,您的叢集接著會進入紅色運作狀態,因為會留下主碎片而未分配。

若要停用複本碎片,請將 number_of_replicas 的值更新為 "0":

$ curl -XPUT 'domain-endpoint/<indexname>/_settings' -H 'Content-Type: application/json' -d'
{
  "index" : {
    "number_of_replicas" : 0
  }
}'

此外,請檢查以確保 index.auto_expand_replicas 設定設為 "false"。當您的叢集回到綠色運作狀態時,可以將 index.number_of_replicas 的值設回所需值,以觸發複本碎片的分配。如果碎片分配成功,您的叢集將進入綠色運作狀態。

叢集運作狀態最佳實務

若要解除黃色或紅色叢集狀態,請考慮下列最佳實務:

如需有關 OpenSearch Service 最佳實務的詳細資訊,請參閱 Amazon OpenSearch Service 最佳實務


此文章是否有幫助?


您是否需要帳單或技術支援?