我的 Amazon OpenSearch Service 叢集卡在「處理中」狀態。
簡短描述
您的 OpenSearch Service 叢集會在組態變更時進入「處理中」狀態。如果發生以下任何情況,該叢集可能會卡在**「處理中」**狀態:
- 驗證檢查失敗並顯示錯誤。
- 一組新的資源無法啟動。
- 碎片遷移到新的資料節點集未完成。
- 舊的資源集無法終止。
啟動組態變更時,網域狀態會變更為「處理中」,而 OpenSearch Service 會建立新的環境。在新環境中,OpenSearch Service 會啟動一組新的適用節點,例如資料節點、專用主節點或 UltraWarm 節點。遷移完成後,較舊的節點會終止。
您可以在網域狀態下的主控台中檢視組態變更的進度。您也可以使用 DescribeDomainChangeProgress API 監控組態變更的進度。如需詳細資訊,請參閱組態變更的階段。
解決方法
驗證檢查失敗並顯示錯誤
當您啟動組態變更或執行 OpenSearch Service 網域版本升級時,OpenSearch Service 會先執行一系列驗證檢查。驗證檢查可確保您的網域符合升級資格。當驗證檢查失敗並顯示錯誤時,網域可能會卡在**「處理中」**狀態。驗證檢查失敗有多種原因。若要解決此問題,請參閱對驗證錯誤進行疑難排解。請遵循與驗證錯誤關聯的疑難排解步驟,然後重試組態變更。
一組新的資源無法啟動
在第一次組態變更完成之前向叢集提交同時組態變更時,叢集可能會卡住。提交新的組態變更時,請等到提交完成後再提交另一個組態變更。
在驗證階段中對網域的驗證檢查在整個組態變更期間保持有效。如果您的組態通過驗證階段,請避免修改網域所依賴的資源。例如,請勿停用用於加密的 AWS Key Management Service (KMS) 金鑰。
如果遇到 ClusterBlockException 錯誤,您的網域也可能會卡住。這可能是因為缺少可用的儲存空間或 JVM 記憶體壓力過高。如需詳細資訊和疑難排解,請參閱 ClusterBlockException。
**注意:**您可以在 Amazon CloudWatch 中檢查 FreeStorageSpace、MasterCPUUtilization 和 MasterJVMMemoryPressure 指標。
碎片遷移到新的資料節點集尚未完成
OpenSearch Service 建立新資源之後,碎片將開始從舊的資料節點集遷移到新集。此階段可能需要幾分鐘到幾個小時,具體取決於叢集的負載和大小。
若要監控舊節點與新節點之間碎片的目前遷移,請執行下列 API 呼叫:
GET /<DOMAIN_ENDPOINT>/_cat/recovery?active_only=true
碎片遷移可能會因下列原因而失敗:
若要查看碎片的大小,請在 Elasticsearch 網站上使用 cat shards API。
若要查看指派給每個節點的碎片數量,請使用 Elasticsearch 網站上的 cat allocation API。
若要找出無法將某些碎片指派給新節點的原因,請在 Elasticsearch 網站上使用 cluster allocation explain API。
如果您有不再需要的舊索引,則可以使用 Elasticsearch 網站上的 delete index API 來釋放儲存空間。
如果碎片因超過重試次數上限而無法指派給節點,則可以重試分配。使用下列 API 呼叫,增加與該碎片關聯的 "index.allocation.max_retries" 索引設定:
PUT <INDEX_NAME>/_settings
{
"index.allocation.max_retries" : 10
}
**注意:**依預設,叢集會嘗試最多連續分配 5 次碎片。
- 由於內部硬體故障,舊資料節點上的碎片在遷移期間可能會卡住。
**注意:**視您的硬體問題而定,OpenSearch Service 會執行自我修復指令碼,將節點恢復為運作良好狀態。
- 固定到舊節點集的碎片導致碎片重新定位卡住。為確保碎片未固定至任何節點,請檢查索引設定。或者,檢查您的叢集是否有 ClusterBlockException 錯誤。
若要識別無法分配給新節點的碎片以及對應的索引設定,請使用下列命令:
GET /<DOMAIN_ENDPOINT>/_cluster/allocation/explain?pretty
GET /<DOMAIN_ENDPOINT>/<INDEX_NAME>/_settings?pretty
在 Elasticsearch 網站上使用 get index settings API,檢查是否出現以下任一設定:
{
"index.routing.allocation.require._name": "NODE_NAME" (OR)
"index.blocks.write": true
}
如果在索引設定中發現 "index.routing.allocation.require._name": "<NODE_NAME>",則使用下列 API 呼叫重設該設定:
PUT /<DOMAIN_ENDPOINT>/<INDEX_NAME>/_settings
{
"index.routing.allocation.require._name": null
}
如需詳細資訊,請參閱 Elasticsearch 網站上的索引級碎片分配篩選。
如果在索引設定中看到 "index.blocks.write": true,則表示索引有寫入區塊。此寫入區塊問題可能是 ClusterBlockException 錯誤所致。如需詳細資訊,請參閱如何解決 OpenSearch Service 中的 403 "index_create_block_exception" 或 "cluster_block_exception" 錯誤?
最佳實務
為避免 OpenSearch Service 叢集卡在 **「處理中」**狀態,請遵循下列最佳實務:
- 在提交組態變更之前,請確定您的叢集可以支援藍/綠部署程序。
- 在提交組態變更之前,請先提交試運行變更。
- 確定您的叢集未超載。
- 避免同時提交多個組態變更。
- 考慮在低流量時段提交組態變更。
- 監控組態變更的進度。
**注意:**如果發生以下任何情況,請聯絡 AWS Support:
- 您的叢集卡在 「處理中」 狀態超過 24 小時。
- 您的網域卡在「正在刪除舊資源」階段。