如何解決 Amazon OpenSearch Service 中的「無法取得記憶體碎片鎖」異常狀況?

上次更新日期:2021 年 8 月 6 日

我的 Amazon OpenSearch Service (Amazon Elasticsearch Service 的繼任者) 叢集變成黃色,並顯示「無法取得記憶體碎片鎖」錯誤訊息。為什麼我會收到這個錯誤訊息,以及該如何解決?

簡短描述

如果您的碎片無法取得碎片分配的記憶體鎖 (在 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
    }
}