跳至內容

為什麼 OpenSearch Service 中 ISM 政策的變換索引動作會失敗?

3 分的閱讀內容
0

我想使用索引狀態管理 (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-aliasanother_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 記憶體壓力問題。

AWS 官方已更新 9 個月前