我的 Amazon OpenSearch Service 叢集變成黃色,並顯示「failed to obtain in-memory shard lock」(無法取得記憶體碎片鎖) 錯誤訊息。為什麼我會收到這個錯誤訊息,以及該如何解決?
簡短描述
如果您的碎片無法取得碎片分配的記憶體鎖 (在 OpenSearch Service 的設定臨界值內),您會收到下列錯誤訊息:
"failed_allocation_attempts" : 5,
"details" : "failed shard on node []: failed to create shard, failure IOException[failed to obtain in-memory shard lock]; nested: ShardLockObtainFailedException[[][5]: obtaining shard lock timed out after 5000ms]; ",
.
.
"explanation" : "shard has exceeded the maximum number of retries [5] on failed allocation attempts - manually call [/_cluster/reroute?retry_failed=true] to retry, [unassigned_info[[reason=ALLOCATION_FAILED], at[], failed_attempts[5], delayed=false, details[failed shard on node [lga-THKoSXykhSDbghN57A]: failed to create shard, failure IOException[failed to obtain in-memory shard lock]; nested: ShardLockObtainFailedException[[evelog-zdn-2020.04.28][5]: obtaining shard lock timed out after 5000ms]; ], allocation_status[no_attempt]]]"
**注意:**在 OpenSearch Service 中,您的叢集不可超過碎片分配的時間限制 (5000 毫秒) 和最大重試次數 (5)。
若要解決錯誤訊息,請嘗試下列方法:
- 針對黃色叢集狀態進行疑難排解。
- 增加最大重試設定。
- 更新複本計數。
**注意:**最佳實務不是更新具有大量工作負載的 OpenSearch Service 叢集的複本計數。
解決方案
針對黃色叢集狀態進行疑難排解
您的 OpenSearch Service 叢集可能會因為節點或網路故障而進入黃色狀態。如果叢集中的節點因為內部硬體問題而故障,則現有的節點會由新節點取代。此替代方案是 OpenSearch Service 的自動偵測功能。但是,在某些情況下,錯誤節點中的副本碎片被保留未分配。當先前使用的資源沒有釋放時,副本碎片會保留未分配。在此期間,領導者節點會嘗試五次分配副本碎片。如果領導者節點的五次嘗試分配複本碎片失敗,則您的叢集會進入紅色或黃色的運作狀態。
注意:最佳實務是執行叢集分配解釋 API 來診斷未分配的碎片。如需詳細資訊,請參閱 Elasticsearch 網站上的叢集分配解釋 API。
若要識別哪些索引造成叢集輸入黃色狀態,請使用下列查詢:
GET /_cat/indices?v&health=yellow
然後,使用以下查詢來識別叢集未分配碎片的根本原因:
GET _cluster/allocation/explain
**注意:**OpenSearch Service 無法辨識叢集重新路由 API。如需有關支援 API 操作的詳細資訊,請參閱值得注意的 API 差異。
增加最大重試設定
若要讓 OpenSearch Service 叢集回到綠色狀態,請增加每個黃色索引的重試次數上限:
PUT /<yellow-index-name>/_settings
{
"index.allocation.max_retries": 10
}
執行此 API 呼叫時,領導者節點會重試叢集上指定索引的碎片分配。
**注意:**當您增加重試設定上限時,碎片不一定會自動指派。您可能必須手動分配碎片。
更新複本計數
**重要提示:**如果您的 OpenSearch Service 叢集負載很高,請勿使用此方法。當您從索引中移除所有複本時,索引必須僅依賴主碎片。如果一個節點關閉,那麼你的叢集可能會進入紅色叢集狀態,因為主碎片未分配。
若要變更複本計數,請執行下列步驟:
1. 移除任何複本,使受影響的索引計數變為 0:
PUT /<yellow-index-name>/_settings
{
"index": {
"number_of_replicas": 0
}
}
2. 將複本計數變更回所需的計數:
PUT /<yellow-index-name>/_settings
{
"index": {
"number_of_replicas": 1
}
}
相關資訊
為何我的 Amazon OpenSearch Service 叢集處於紅色或黃色狀態?
為何我的 Amazon OpenSearch Service 節點當機?
如何對 Amazon OpenSearch Service 叢集上的高 JVM 記憶體壓力進行疑難排解?