為什麼 ISM 政策中的變換索引動作在 Amazon OpenSearch Service 中一直執行失敗?
上次更新日期:2022 年 10 月 3 日
我希望使用 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 記憶體壓力進行疑難排解?