為什麼 ISM 政策中的變換索引動作在 Amazon OpenSearch Service 中一直執行失敗?
我希望使用 Index State Management (ISM) 在 Amazon OpenSearch Service 叢集上變換索引。但是,我的索引無法變換,並且我收到錯誤訊息。為什麼會發生這種情況,我該如何解決問題?
簡短描述
如果您收到「變換索引失敗」的錯誤訊息,您的變換效果動作可能因下列其中一個原因而失敗:
- 變換目標不存在。
- 缺少變換別名。
- 索引名稱與索引模式不相符。
- 變換別名指向索引範本中重複的別名。
- 叢集達到資源使用率上限。
若要解決這個問題,請使用說明 API 來識別錯誤的原因。然後,請檢查您的 ISM 政策。如需有關在 ISM 政策中設定變換動作的詳細資訊,請參閱如何使用 ISM 來管理 OpenSearch Service 中儲存空間不足的問題?
**附註:**下列解決方案僅適用於 OpenSearch API。對於舊版的 Open Distro API,請參閱 Open Distro 的ISM API 操作。
解決方案
使用說明 API
如要找出「無法變換索引」錯誤的根本原因,請使用說明 API:
GET _plugins/_ism/explain/logs-000001?pretty
以下是說明 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]" } } }
此輸出範例顯示索引變換失敗是因為不存在目標變換別名 (rolling-indices)。
變換目標不存在
如果說明 API 傳回的原因是「變換目標 [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 網站上的重試失敗的索引。
當您重試失敗的索引時,您可能會收到「嘗試重試」狀態訊息。如果 OpenSearch Service 正在嘗試重試,請等到下一個 ISM 週期才執行動作。ISM 週期會每 30 到 48 分鐘執行一次。如果變換動作成功,則您會收到下列訊息:「成功變換索引」。
缺少變換別名
如果說明 API 輸出識別出變換失敗是因為缺少變換別名,請檢查失敗索引的設定:
GET <failed-index-name>/_settings
如果缺少了 index.plugins.index_state_management.rollover_alias 設定,請將設定手動加入索引:
PUT /<failed-index-name>/_settings { "index.plugins.index_state_management.rollover_alias" : "<rollover-alias>" }
使用重試失敗索引 API 來重試失敗索引的變換作業。重試變換動作時,請更新您的政策範本:
PUT _index_template/<template-name>
請確保使用與現有政策範本相同的設定,以便將變換別名套用至新建立的索引。例如:
PUT _index_template/<existing-template> { "index_patterns": [ "<index-pattern*>" ], "template": { "settings": { "plugins.index_state_management.rollover_alias": "<rollover-alias>" } } }
索引名稱與索引模式不相符
如果 ISM 政策顯示您的變換作業失敗是因為索引名稱和索引模式不相符,請檢查失敗索引的名稱。若要成功變換,索引名稱必須符合下列正規表達式的模式:
`^.*-\d+$`
此正則表達式的模式使用的索引名稱必須包含文字後的連字號 (-) 和一個或多個數字。如果索引名稱不遵循這種模式,而且您在第一個索引中已經寫入資料,請考慮重新建立資料索引。當您重新建立資料索引時,請為新索引訂立正確的名稱。例如:
POST _reindex { "source": { "index": "<failed-index>" }, "dest": { "index": "my-new-index-000001" } }
執行重新建立資料索引 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>" }
更新現有範本以反映新索引模式名稱。例如:
PUT _index_template/<existing-template> { "index_patterns": ["<my-new-index-pattern*>"], }
**注意:**您的 ISM 政策和變換別名必須反映使用相同索引模式建立的連續索引。
變換別名指向索引範本中重複的別名
如果說明 API 顯示您的索引變換失敗是因為變換別名指向重複的別名,請檢查索引範本設定:
GET _index_template/<template-name>
檢查範本是否包含其他別名欄位 (另一個別名指向相同的索引):
{ "index_patterns": ["my-index*"], "settings": { "index.plugins.index_state_management.rollover_alias": "<rollover-alias>" }, "aliases": { "another_alias": { "is_write_index": true } } }
存在其他別名有助確認變換作業失敗的原因,理由是多個別名會導致變換失敗。若要解決此類變換失敗,請更新範本設定,而不指定任何別名:
PUT _index_template/<template-name>
然後,在失敗的索引上執行 重試 API:
POST _plugins/_ism/retry/logs-000001
**重要事項:**如果別名指向多個索引,請確保只有一個索引啟用了寫入存取。變換效果 API 會自動為變換別名指向的索引啟用寫入存取。換言之,當您在 ISM 中執行變換作業時,不需要為 "is_write_index" 設定指定任何別名。
叢集達到資源使用率上限
斷路器例外狀況或缺少儲存空間可能令叢集達到資源使用率上限。
斷路器例外狀況
如果說明 API 傳回斷路器例外狀況,那麼在呼叫變換 API 時,您的叢集可能正承受著相當高的 JVM 記憶體壓力。若要針對 JVM 記憶體壓力問題進行疑難排解,請參閱如何對 OpenSearch Service 叢集上的高 JVM 記憶體壓力進行疑難排解?
在 JVM 記憶體壓力低於 75% 之後,您可以通過以下 API 呼叫來重試失敗索引上的活動:
POST _plugins/_ism/retry/<failed-index-name>
**注意:**您可以使用索引模式 (*) 來重試多個失敗索引上的活動。
如果叢集上出現罕見的 JVM 峰值,您也可以使用下列變換動作的重試區塊來更新 ISM 政策:
{ "actions": { "retry": { "count": 3, "backoff": "exponential", "delay": "10m" } } }
在您的 ISM 政策中,每個動作都會根據計數參數自動重試。如果您先前的作業失敗,請檢查 "delay" 參數,以查看需要等待多久後,ISM 才會重試動作。
缺乏儲存空間
如果您的叢集儲存空間不足,則 OpenSearch Service 會觸發叢集上的寫入區塊,造成所有寫入作業均傳回 ClusterBlockException。您的 ClusterIndexWritesBlocked 指標數值會顯示為 "1",表示叢集正在封鎖請求。因此,任何建立新索引的嘗試都會失敗。說明 API 呼叫也會傳回 403 IndexCreateBlockException,表示叢集的儲存空間不足。若要對叢集區塊的例外狀況進行疑難排解,請參閱如何解決 OpenSearch Service 中的 403「index_create_block_exception」錯誤?
在 ClusterIndexWritesBlocked 指標返回「0」後,請在失敗的索引上重試 ISM 動作。如果您的 JVM 記憶體壓力超過 92% 的時間超過 30 分鐘,可能會觸發寫入區塊。如果出現寫入區塊,您就必須針對 JVM 記憶體壓力進行疑難排解。如需有關針對 JVM 記憶體壓力進行疑難排解的詳細資訊,請參閱如何針對 OpenSearch Service 叢集上的高 JVM 記憶體壓力進行疑難排解?

相關內容
- 已提問 2 年前lg...
- 已提問 2 年前lg...
- 已提問 6 個月前lg...
- 已提問 1 年前lg...
- AWS 官方已更新 2 年前
- AWS 官方已更新 4 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前