為什麼 OpenSearch Service 中 ISM 政策的變換索引動作會失敗?
我想使用索引狀態管理 (ISM),變換 Amazon OpenSearch Service 叢集上的索引。但是,我的索引變換失敗,我還收到錯誤訊息。
簡短描述
若要解決此問題,請使用 explain API 找出失敗的原因。然後,檢閱您的 ISM 政策。如需進一步瞭解如何設定變換動作,請參閱「如何使用 ISM 來管理 Amazon OpenSearch Service 儲存空間不足的情況?」。
**注意:**以下解決方法僅適用於 OpenSearch API。針對舊版 Open Distro API,請參閱 Open Distro 網站上的 ISM API 說明。
解決方法
使用 explain API 找出原因
若要找出索引變換失敗的原因,請使用 explain API:
GET _plugins/_ism/explain/logs-000001?pretty
explain API 輸出範例:
{ "logs-000001": { "index.plugins.index_state_management.policy_id": "rollover-workflow", "index": "logs-000001", "index_uuid": "JUWl2CSES2mWYXqpJJ8qlA", "policy_id": "rollover-workflow", "policy_seq_no": 2, "policy_primary_term": 1, "rolled_over": false, "state": { "name": "open", "start_time": 1614738037066 }, "action": { "name": "rollover", "start_time": 1614739372091, "index": 0, "failed": true, "consumed_retries": 0, "last_retry_time": 0 }, "retry_info": { "failed": false, "consumed_retries": 0 }, "info": { "cause": "rollover target [rolling-indices] does not exist", "message": "Failed to rollover index [index=logs-000001]" } } }
若要找出失敗的原因,請參考輸出結果中的 info 區段。
以上輸出範例顯示,索引變換失敗的原因在於目標變換別名 rolling-indices 並不存在。
變換目標不存在
如果變換作業因為變換目標不存在而失敗,請檢查索引是否已完成變換別名的初始化設定:
GET _cat/aliases
輸出結果會列出叢集中目前的所有別名及其關聯索引。如果 ISM 顯示變換目標不存在,表示缺少變換別名,或者失敗索引沒有建立關聯。
若要解決失敗的索引關聯問題,請將變換別名附加至該索引:
POST /_aliases{ "actions": [{ "add": { "index": "logs-000001", "alias": "my-data" } }] }
附加變換別名後,請在 OpenSearch Service 中針對受管理的索引重試變換動作:
POST _plugins/_ism/retry/logs-000001
詳情請參閱 OpenSearch 網站上的 Retry failed index API 說明。
重試失敗的索引時,您可能會收到 “Attempting to retry” (正在嘗試重試) 狀態訊息。等待下一個 ISM 週期執行。ISM 週期每 30 到 48 分鐘執行一次。如果變換動作成功,您會收到下列訊息: “Successfully rolled over index” (已成功變換索引)。
缺少變換別名
如果變換作業因為缺少變換別名而失敗,請檢查失敗索引的設定:
GET failed-index-name/_settings
**注意:**請將 failed-index-name 替換成變換過程中失敗的索引的名稱。
如果缺少 index.plugins.index_state_management.rollover_alias 設定,請手動將設定新增到索引中:
PUT /failed-index-name/_settings{ "index.plugins.index_state_management.rollover_alias" : "rollover-alias" }
**注意:**請將 failed-index-name 替換成變換過程中失敗的索引的名稱。請將 rollover-alias 替換成要用於索引的別名。
使用 retry failed index API,針對失敗的索引重試變換作業。重新嘗試變換動作時,請更新政策範本:
PUT _index_template/template-name
**注意:**請將 template-name 替換成您的索引範本名稱。
套用現有政策範本中的相同設定,確保 OpenSearch Service 會將變換別名套用至新建立的索引。
範例:
PUT _index_template/existing-template { "index_patterns": [ "index-pattern*" ], "template": { "settings": { "plugins.index_state_management.rollover_alias": "rollover-alias" } } }
索引名稱與索引模式不相符
如果變換作業因為索引名稱和索引模式不相符而失敗,請檢查失敗索引的名稱。若要成功完成變換作業,索引名稱必須符合以下規則運算式模式:
`^.*-\d+$`
此規則運算式模式規定,索引名稱必須包含文字,後方接著連字號 (-) 及一或多個數字。如果索引名稱未遵循此模式,而且第一個索引已有寫入的資料,請將資料重新編入索引。將資料重新編入索引時,請為新索引使用正確的名稱。
範例:
POST _reindex{ "source": { "index": "failed-index" }, "dest": { "index": "my-new-index-000001" } }
當 data API 進行重新編入索引作業時,請將變換別名與失敗的索引解除關聯。然後,將變換別名加到新索引,以確保資料來源能繼續將傳入的資料寫入新索引中。詳情請參閱 OpenSearch 網站上的 Reindex documents API 說明。
範例:
POST /_aliases{ "actions": [{ "remove": { "index": "failed-index", "alias": "rollover-alias" } }, { "add": { "index": "my-new-index-000001", "alias": "rollover-alias" } }] }
使用下列 API 呼叫,手動將 ISM 政策附加至新索引:
POST _plugins/_ism/add/my-new-index-*{ "policy_id": "policy_id" }
**注意:**請將 policy_id 替換成您的 ISM 政策 ID。
使用新索引模式名稱更新現有範本。例如:
PUT _index_template/existing-template { "index_patterns": ["my-new-index-pattern*"], }
**注意:**請將 existing-template 替換成現有範本名稱。請將 my-new-index-pattern 替換成您要使用的索引模式。
**重要事項:**您的 ISM 政策與變換別名,必須對應根據相同索引模式建立的後續索引。
變換別名指向索引範本中的重複別名
如果變換作業因為變換別名指向重複別名而失敗,請檢查索引範本設定:
GET _index_template/template-name
**注意:**請將 template-name 替換成您的範本名稱。
檢查您的範本是否包含額外的 aliases 區段,且其中有另一個別名指向相同的索引。
範例:
{ "index_patterns": ["my-index*"], "settings": { "index.plugins.index_state_management.rollover_alias": "rollover-alias" }, "aliases": { "another_alias": { "is_write_index": true } } }
在上述範例中,有 rollover-alias 和 another_alias 兩個別名。多個別名會導致變換失敗。若要解決此問題,請更新範本設定,不要指定任何別名:
PUT _index_template/template-name
**注意:**請將 template-name 替換成您的範本名稱。
然後,對失敗的索引執行 retry API:
POST _plugins/_ism/retry/logs-000001
**重要事項:**如果別名指向多個索引,請確定只有一個索引啟用寫入權限。rollover API 會自動為變換別名指向的索引提供寫入權限。在 ISM 中執行變換作業時,您不需要為 is_write_index 設定指定任何別名。
您的叢集資源使用率已達上限
觸發斷路器的例外狀況或儲存空間不足,都可能會導致叢集資源使用率達到上限。
觸發斷路器的例外狀況
若因觸發斷路器的例外狀況導致叢集資源使用率達到上限,則在呼叫 rollover API 時,叢集可能會承受相當高的 Java 虛擬機器 (JVM) 記憶體壓力。若要排解高 JVM 記憶體壓力問題,請參閱「如何對 OpenSearch Service 叢集上的 JVM 記憶體壓力過高進行疑難排解?」。
JVM 記憶體壓力降至 75% 以下之後,您可以使用下列 API 呼叫,針對失敗的索引重試該作業:
POST _plugins/_ism/retry/failed-index-name
**注意:**請將 failed-index-name 替換成變換失敗的索引的名稱。
使用索引模式 (*),針對多個失敗的索引重試作業。
若您的叢集偶爾出現 JVM 壓力突增的情況,您也可以更新 ISM 政策,為變換動作加入下列重試區塊:
{ "actions": { "retry": { "count": 3, "backoff": "exponential", "delay": "10m" } } }
在您的 ISM 政策中,每個動作都會根據 count 參數自動重試。如果之前的作業失敗,請檢查 delay 參數,確認必須等待多久 ISM 才會重試該動作。詳情請參閱 OpenSearch 網站上的動作說明。
儲存空間不足
若叢集開始出現儲存空間不足的情況,OpenSearch Service 將會對該叢集啟動寫入限制。寫入限制會導致叢集上的所有寫入操作均傳回 ClusterBlockException。由於叢集封鎖了請求,您的 ClusterIndexWritesBlocked 指標會顯示數值為 “1”。只要嘗試建立新索引,都會失敗。由於叢集儲存空間耗盡,explain API 呼叫也會傳回 403 IndexCreateBlockException。若要排解叢集封鎖例外狀況,請參閱「如何解決 OpenSearch Service 中的 403 “index_create_block_exception” 或 “cluster_block_exception” 錯誤?」。
ClusterIndexWritesBlocked 指標恢復為 0 後,請針對失敗的索引重試 ISM 動作。如果 JVM 記憶體壓力超過 92% 而且時間超過 30 分鐘,OpenSearch 斷路器可能會啟動寫入限制。如果遇到寫入限制,請改為排解 JVM 記憶體壓力問題。
- 語言
- 中文 (繁體)

相關內容
已提問 2 年前