為什麼 ISM 政策中的變換索引動作在 Amazon OpenSearch Service 中一直執行失敗?

3 分的閱讀內容
0

我希望使用 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 記憶體壓力進行疑難排解?


AWS 官方
AWS 官方已更新 1 年前