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

上次更新日期:2021 年 8 月 5 日

我希望使用 Index State Management (ISM) 在 Amazon OpenSearch Service (Amazon Elasticsearch Service 的繼任者) 叢集上變換索引。但是,我的索引無法變換,並且我收到錯誤訊息。為什麼會發生這種情況,我該如何解決問題?

簡短描述

如果您收到「變換索引失敗」的錯誤訊息,您的變換效果動作可能因下列其中一個原因而失敗:

  • 變換目標不存在。
  • 缺少變換別名。
  • 索引名稱與索引模式不相符。
  • 變換別名指向索引範本中重複的別名。
  • 叢集達到資源使用率上限。

若要解決這個問題,請使用 說明 API 來識別錯誤的原因。然後,請檢查您的 ISM 政策。如需有關在 ISM 政策中設定變換動作的詳細資訊,請參閱如何使用 Index State Management (ISM) 來管理 Amazon OpenSearch Service 中儲存空間不足的問題?

解決方案

使用說明 API

如要找出「無法變換索引」錯誤的根本原因,請使用說明 API:

GET _opendistro/_ism/explain/logs-000001?pretty

以下是 說明 API 的輸出範例:

{
  "logs-000001" : {
    "index.opendistro.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 _opendistro/_ism/retry/logs-000001

如需詳細資訊,請參閱 Elasticsearch 網站上的 Open Distro 重試失敗的索引

當您重試失敗的索引時,您可能會收到「嘗試重試」狀態訊息。如果 OpenSearch Service 正在嘗試重試,請等到下一個 ISM 週期才執行動作。ISM 週期會每 30 到 48 分鐘執行一次。如果變換動作成功,您會收到下列訊息:「成功變換索引」。

缺少變換別名

如果說明 API 輸出識別出變換失敗是因為缺少變換別名,請檢查失敗索引的設定:

GET <failed-index-name>/_settings

如果缺少了 index.opendistro.index_state_management.rollover_alias 設定,請將設定手動加入索引:

PUT /<failed-index-name>/_settings
{
  "index.opendistro.index_state_management.rollover_alias":"<rollover-alias>"
}

使用 重試失敗索引 API 來重試失敗索引的變換作業。重試變換動作時,請更新您的政策範本:

PUT _template/<template-name>

請確保使用與現有政策範本相同的設定,以便將變換別名套用至新建立的索引。例如:

PUT _template/<existing-template>
{
  "index_patterns": ["<index-pattern*>"], 
  "settings": {
    "index.opendistro.index_state_management.policy_id": "<policy_id>",
    "index.opendistro.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 _opendistro/_ism/add/my-new-index-* { "policy_id": "<policy_id>" }

更新現有範本以反映新索引模式名稱:

PUT _template/<existing temaplate>

注意:您的 ISM 政策和變換別名必須反映使用相同索引模式建立的連續索引。

變換別名指向索引範本中重複的別名

如果說明 API 顯示您的索引變換失敗是因為變換別名指向重複的別名,請檢查索引範本設定:

GET _template/<template-name>

檢查範本是否包含其他別名欄位 (另一個別名指向相同的索引):

"index_patterns": ["my-index*"],
 "settings": {
        "index.opendistro.index_state_management.policy_id": "rollover-policy",
        "index.opendistro.index_state_management.rollover_alias": "rollover-alias"
        },
 "aliases": {
        "another_alias": {
            "is_write_index": true
        }
    }

存在其他別名有助確認變換作業失敗的原因,理由是多個別名會導致變換失敗。若要解決此類變換失敗,請更新範本設定,而不指定任何別名:

PUT _template/<template-name>

然後,在失敗的索引上執行 重試 API:

POST _opendistro/_ism/retry/my-index-000001

重要事項:如果別名指向多個索引,請確保只有一個索引啟用了寫入存取。變換效果 API 會自動為變換別名指向的索引啟用寫入存取。換言之,當您在 ISM 中執行變換作業時,不需要為 "is_write_index" 設定指定任何別名。

叢集達到資源使用率上限

斷路器例外狀況或缺少儲存空間可能令叢集達到資源使用率上限。

斷路器例外狀況

如果說明 API 傳回斷路器例外狀況,那麼在呼叫變換 API 時,您的叢集可能正承受著相當高的 JVM 記憶體壓力。若要針對 JVM 記憶體壓力問題進行疑難排解,請參閱 如何對 Amazon OpenSearch Service 叢集上的高 JVM 記憶體壓力進行疑難排解?

在 JVM 記憶體壓力低於 75% 之後,您可以通過以下 API 呼叫來重試失敗索引上的活動:

POST _opendistro/_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,表示叢集的儲存空間不足。若要對叢集區塊的例外狀況進行疑難排解,請參閱如何解決 Amazon OpenSearch Service 中的 403 "index_create_block_exception" 錯誤?

ClusterIndexWritesBlocked 指標返回 “0” 後,請在失敗的索引上重試 ISM 動作。如果您的 JVM 記憶體壓力超過 92% 的時間超過 30 分鐘,可能會觸發寫入區塊。如果出現寫入區塊,您就必須針對 JVM 記憶體壓力進行疑難排解。如需有關針對 JVM 記憶體壓力進行疑難排解的詳細資訊,請參閱如何針對 Amazon OpenSearch Service 叢集上的高 JVM 記憶體壓力進行疑難排解?


此文章是否有幫助?


您是否需要帳單或技術支援?