
# 配置索引生命周期策略（ISM）
随着业务发展，企业的日志、监控指标等时序数据量呈爆炸式增长。海量数据导致存储成本急剧上升，且随着单个索引体积过大，查询性能显著下降。运维人员每天需要手动创建新索引、迁移旧数据、删除过期数据，工作繁琐且容易出错。如何实现索引的全生命周期自动化管理，既能保证热数据的读写性能，又能降低冷数据的存储成本，同时实现自动清理？CSS服务的OpenSearch集群提供ISM (Index State Management) 插件。通过配置生命周期策略，您可以自动化管理索引的流转（如：当索引达到50GB自动滚动、30天后自动转冷、90天后自动删除），从而实现降本增效。
此外，CSS服务为索引生命周期策略提供了空索引不滚动和自动重试的高级功能，进一步降低运维成本，提升任务执行的可靠性。
- ISM (Index State Management)：OpenSearch的索引状态管理插件，用于自动化执行索引的生命周期任务。详细介绍请参见官方文档[Index State Management](https://docs.opensearch.org/latest/im-plugin/ism/index/)。
- Policy (策略)：定义索引生命周期的规则集合。例如：如果索引文档数超过1000万，则执行Rollover。
- Rollover (滚动)：当现有索引满足条件（如大小、时间、文档数）时，自动创建新索引接收写入，旧索引转为只读或归档。
不同版本的OpenSearch Dashboards页面可能有所差异，请以实际操作环境为准。本文以OpenSearch Dashboards 1.3.6版本作为示例。
 #### 步骤一：创建生命周期策略
在OpenSearch Dashboards中定义一套索引生命周期的规则，告诉集群如何管理索引。
1. 登录[云搜索服务管理控制台](https://console.huaweicloud.com/elasticsearch/)。
2. 在左侧导航栏，选择"集群管理 \> OpenSearch"。
3. 在集群列表，选择目标集群，单击操作列的"Dashboards"，登录OpenSearch Dashboards。
4. 在OpenSearch Dashboards左侧导航栏选择"Index Management"，进入索引管理页面。
5. 选择"Index Policies"或"State management policies"。
6. 右侧单击"Create policy"，创建索引策略。在Configuration method对话框中，选择"JSON editor"，单击"Continue"进入创建索引策略页面。
   - "Policy ID"：自定义策略名称，不支持中文字符。
   
   - "Define policy"：输入JSON格式的策略定义。可以参考默认示例或根据业务需求修改示例。
     图1配置策略   
     ![](https://support.huaweicloud.com/usermanual-css/figure/zh-cn_image_0000001999761193.png "点击放大") 
    
7. 单击"Create"完成索引策略的创建。
 
#### 步骤二：关联策略到索引
索引生命周期策略创建完成后，需要将其应用到具体的索引上。推荐使用索引模板 (Template) 方式，确保新生成的索引自动继承策略。
- **方式1：通过索引模板自动关联（推荐）**
  适用于数据序列的索引数据。
  如果在[步骤一：创建生命周期策略]的JSON配置了"ism_template"字段（如下示例），那么后续新建的符合规则（如logs-\*）的索引将自动绑定该策略，无需额外操作。
  示例：创建一个名字为"policy1"的策略，其中"ism_template"部分用于指定需要绑定的索引。在此策略创建以后，新创建的以"logs-"开头的索引会自动与该策略关联。
  ```
  PUT _plugins/_ism/policies/policy1
  { 
    "policy": { 
      "description": "an example policy", 
      "default_state": "hot", 
      "states": [ 
          // 省略state部分
      ], 
      "ism_template": { 
        "index_patterns": [ 
          "logs-*" 
        ], 
        "priority": 100 
      } 
    } 
  }
  ```
  
- **方式2：为现有索引手动关联**
  适用于已经存在且未绑定策略的索引。
  1. 在OpenSearch Dashboards左侧导航栏选择"Index Management"，进入索引管理页面。
  
  2. 选择"Indices"。
  
  3. 在Indices列表中勾选要关联策略的一个或多个索引。
  
  4. 单击右上角的"Apply policy"或"Actions \> Apply policy"，在弹窗中选择要关联的"Policy ID"。
     图2添加引用策略   
     ![](https://support.huaweicloud.com/usermanual-css/figure/zh-cn_image_0000002547659977.png "点击放大") 
  
  5. 单击"Apply"，完成索引关联策略。
  
  6. 在"Managed Indices"或"Policy managed indexes"页面查看索引，确认其"Policy"显示为关联的策略ID。
   
当索引关联策略后，ISM会自动创建一个每5分钟运行一次的作业，用于执行策略操作、检查条件并将索引转换为不同的状态，确保策略生效。
#### 步骤三：管理索引策略
索引生命周期策略应用后，可以在OpenSearch Dashboards的"Index Management \> Managed Indices"或"Index Management \> Policy managed indexes"页面管理策略：
- 查看状态：在 "Managed Indices" 或"Policy managed indexes"列表中，查看索引当前的应用的策略，及策略状态。
- 重试策略：当索引的策略状态异常时，可以勾选索引并单击"Retry policy"。
- 变更策略：当需要更新索引的策略时，可以单击 "Change policy" 为索引切换新策略。
- 移除策略：当需要解除索引的策略时，可以勾选索引并单击 "Remove policy" 停止生命周期管理。
 
#### 高级功能：设置空索引不滚动更新
集群在配置生命周期管理策略后，当索引达到特定条件（如创建时长达到指定天数）时，系统会自动创建新索引以接收后续数据写入。在默认情况下，即使当前索引中无数据，系统仍会持续创建新索引。随着时间的推移，这将导致大量空索引生成。为避免在无数据写入时持续创建空索引，CSS服务提供了空索引不滚动更新功能。该功能允许用户在设置生命周期策略时指定仅当索引包含数据时才执行Rollover操作。启用此功能后，可有效减少空索引的生成，优化存储资源使用，提升系统整体效率。
支持设置空索引不滚动更新的OpenSearch集群版本：1.3.6（镜像版本不低于x.x.x_25.9.0_xxx）、2.19.0（镜像版本不低于x.x.x_25.9.0_xxx）或3.4.0（镜像版本不低于3.4.0_26.6.0_xxx）
空索引不滚动更新功能支持索引级和集群级配置，索引级配置优先级高于集群级配置。**该功能需要手动开启**，命令参考如下：
- 为**指定索引** 设置空索引不滚动更新，即仅当索引不为空时才执行Rollover操作。
  ```
  PUT {index_name}/_settings
  {
    "index.plugins.index_state_management.rollover.only_if_has_documents": true
  }
  ```
  
- 为**集群** 设置空索引不滚动更新，即集群中所有配置了Rollover的索引仅当不为空时才执行Rollover操作。
  ```
  PUT _cluster/settings
  {
    "persistent": {
      "plugins.index_state_management.rollover.only_if_has_documents": true
    }
  }
  ```
  
 
#### 高级功能：设置索引生命周期自动重试
在索引生命周期管理过程中，ISM任务可能会因各种异常（如集群资源瞬时异常、节点重启、网络分区等短暂性异常）而执行失败，导致关键数据的生命周期管理（如热数据转冷、定时删除等）出现延迟。为了解决这一问题，CSS服务提供了索引生命周期自动重试功能（即Reactivate特性）。该功能可在检测到任务失败后，按照预设时间间隔自动重试，直至任务成功，从而确保索引生命周期管理的连续性和可靠性。
支持设置索引生命周期自动重试的OpenSearch集群版本：1.3.6（镜像版本不低于x.x.x_25.9.0_xxx）、2.19.0（镜像版本不低于x.x.x_25.9.0_xxx）或3.4.0（镜像版本不低于3.4.0_26.6.0_xxx）
满足条件的OpenSearch集群**默认启用索引生命周期自动重试**功能。
当集群不满足以上条件时，可通过升级集群版本启用该功能。但升级前已失败的ISM任务，在集群升级后不会自动重试，需手动重试ISM任务，之后才会自动重试。重试失败的ISM任务的命令参考如下：
```
POST _opendistro/_ism/retry/{index_name}
```
执行如下命令可修改索引生命周期自动重试配置：
```
PUT _cluster/settings
{
  "persistent": {
    "plugins.index_state_management.coordinator.css.reactivate": true,
    "plugins.index_state_management.coordinator.css.reactivate_period": "5m",
    "plugins.index_state_management.coordinator.css.reactivate_duration": "30m",
    "plugins.index_state_management.coordinator.css.reactivate_max_duration": "12h",
    "plugins.index_state_management.coordinator.css.max_inflight_reactivate_tasks": 1000
  }
}
```
表1配置参数说明 
| 参数                                                                           | 类型      | 默认值   | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
|:---|:---|:---|:---|
| plugins.index_state_management.coordinator.css.reactivate                    | Boolean | true  | Reactivate特性开关。 - true：开启索引生命周期自动重试。  - false：关闭索引生命周期自动重试。   |
| plugins.index_state_management.coordinator.css.reactivate_period             | Time    | 30m   | Reactivate周期轮询时间。 取值范围：≥5m                                                                                                                                                                                                                                                                                                                                                                                                                              |
| plugins.index_state_management.coordinator.css.reactivate_duration           | Time    | 1h    | 初始Reactivate时间，即任务第一次失败后等待重启的时长，与后续的指数退避计算无关。 取值范围：≥1m                                                                                                                                                                                                                                                                                                                                                                                                   |
| plugins.index_state_management.coordinator.css.reactivate_max_duration       | Time    | 24h   | 最大Reactivate时间，即任务多次失败后，指数退避等待时间的最大值，确保无论失败次数如何增加，重试间隔不会无限增长。 取值范围：≥1m                                                                                                                                                                                                                                                                                                                                                                                  |
| plugins.index_state_management.coordinator.css.max_inflight_reactivate_tasks | Long    | 10000 | 同时重试任务数最大值，即最多允许几个失败任务同时处于重试执行状态。 取值范围：1\~100000                                                                                                                                                                                                                                                                                                                                                                                                        |
   
**重试任务的幂等处理限制**
- 幂等操作：重试时可以从头开始执行所有步骤，确保数据一致性。
- 非幂等操作：重试时会从当前步骤继续执行，如果失败原因未解决，可能导致重试任务失败，此时需要人工干预。 OpenSearch集群生命周期任务中的非幂等操作包括：ForceMerge、Notification、Snapshot、Shrink。其中，Shrink仅OpenSearch 2.19.0和OpenSearch 3.4.0（镜像版本不低于3.4.0_26.6.0_xxx）涉及。
  
云搜索服务在**索引生命周期任务详情接口**中新增了任务执行记录的字段，通过以下命令可查看索引生命周期任务的执行记录，包括失败次数、失败时间、激活时间及任务失败原因等信息：
```
GET /_opendistro/_ism/explain/{index_name}
```
返回示例：
```
{
  "rollover-0000001" : {
    "index.opendistro.index_state_management.policy_id" : "logs-policy-rollover",
    "index" : "rollover-0000001",
    ...
    "reactivate_info" : {
      "count" : 2, // 总失败次数
      "latest_failed_time" : 1764301006792, // 最新的失败时间
      "latest_reactivate_time" : 1764301486800, // 最新的激活时间
      "failed_infos" : [  // 历史失败的执行记录，仅保留最近的10条记录
        {
          "start_time" : 1764299686801, // 任务执行时间，首次执行时间为索引创建时间
          "failed_time" : 1764299686814, // 任务失败时间
          "info" : {  // 任务失败原因
            "message" : "Missing rollover_alias index setting [index=rollover-0000001]"
          }
        },
        {
          "start_time" : 1764300286841,
          "failed_time" : 1764301006792,
          "info" : {
            "message" : "Missing rollover_alias index setting [index=rollover-0000001]"
          }
        }
      ]
    },
    ...
  }
}
```
