创建和管理Elasticsearch索引策略
本文介绍如何创建和管理Elasticsearch集群的生命周期索引策略。
背景信息
Elasticsearch的ISM(Index State Management)是一个索引状态管理插件,支持通过索引使用期限、索引大小或文档数等信息的变化来自动触发周期性的管理操作。通过ISM插件可以自定义索引策略,实现自动处理索引的滚动或删除,以优化集群搜索性能或降低存储成本。ISM的使用流程:
- 创建生命周期策略:在Kibana创建索引的生命周期策略Policy。
- 索引关联生命周期策略:将索引关联上创建的生命周期策略,生成索引策略。
- 管理索引策略:支持对索引策略进行策略修改、重启和变更。
ISM更多功能请参见索引管理官方介绍。
约束限制
- 仅Elasticsearch集群版本≥7.6.2时才支持索引状态管理ISM。
- Kibana中可以自定义策略名称,但不支持中文字符。
- 不同版本的Kibana界面可能有所差异,请以实际操作环境为准。本文以Kibana 7.6.2版本作为示例。
创建生命周期策略
- 登录云搜索服务管理控制台。
- 在左侧导航栏,选择“集群管理 > Elasticsearch”。
- 在集群列表,选择目标集群,单击操作列的“Kibana”,登录Kibana。
- 在Kibana左侧导航栏选择“IM”或“Index Management”,进入索引管理页面 。
- 单击“Create policy”,配置生命周期策略。
- “Policy ID”:自定义策略名称。
- “Define policy”:基于策略示例,配置自定义策略。
图1 配置策略
- 单击“Create”,完成策略的创建。
索引关联生命周期策略
生命周期策略创建完成后,可以将此策略关联到一个或多个索引中,匹配该索引模板创建出的索引都将被执行该策略。
索引关联生命周期策略有如下2种方式,任选一种方式配置即可。
- 方式1:Kibana命令行
在Kibana的“Dev Tools”页面,执行如下命令在索引模板中关联策略ID。
PUT _template/<template_name> { "index_patterns": ["index_name-*"], "settings": { "opendistro.index_state_management.policy_id": "policy_id" } }- template_name:需要替换为创建的索引模板名。
- policy_id:需要替换为自定义的策略ID,即“Policy ID”。
更多创建索引模板的说明可参考索引模板。
- 方式2:Kibana控制台
- 在Kibana菜单栏选择“IM”或“Index Management”,进入索引管理页面 。
- 左侧选择“Indices”。
图2 选择Indices
- 在Indices列表中勾选要关联策略的一个或多个索引。
- 单击右上角的“Apply policy”,在弹窗中选择要关联的“Policy ID”。
图3 添加索引策略
图4 选择索引策略
- 单击“Apply”,完成索引关联策略。
当索引关联策略后,ISM会默认创建一个每5分钟运行一次的作业,用于执行策略操作、检查条件并将索引转换为不同的状态。
管理索引策略
- 在Kibana的“Index Management”页面,选择“Managed Indices”,进入索引策略管理列表。
此处会展示当前集群已配置的索引策略。
- 在索引策略管理列表,管理策略。
- 当索引的策略状态异常时,可以勾选状态异常的索引,单击“Retry policy”,可以重试策略。
- 当需要更新索引的策略时,可以勾选索引,单击“Change policy”进入变更策略页面,更新策略后,单击“Change”变更策略。
- 当需要解除索引的策略时,可以勾选索引,单击“Remove policy”,在弹窗确认后单击“Remove”该索引将被解除策略。
具体使用可参考索引管理官方介绍。
设置空索引不滚动更新
集群在配置生命周期管理策略后,当索引达到特定条件(如创建时长达到指定天数)时,系统会自动创建新索引以接收后续数据写入。在默认情况下,即使当前索引中无数据,系统仍会持续创建新索引。随着时间的推移,这将导致大量空索引生成。为避免在无数据写入时持续创建空索引,CSS服务提供了空索引不滚动更新功能。该功能允许用户在设置生命周期策略时指定仅当索引包含数据时才执行Rollover操作。启用此功能后,可有效减少空索引的生成,优化存储资源使用,提升系统整体效率。
- 集群版本号:7.6.2或7.10.2
- 镜像版本号:不低于x.x.x_25.9.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特性)。该功能可在检测到任务失败后,按照预设时间间隔自动重试,直至任务成功,从而确保索引生命周期管理的连续性和可靠性。
- 集群版本号:7.6.2或7.10.2
- 镜像版本号:不低于x.x.x_25.9.0_xxx
满足条件的Elasticsearch集群默认启用索引生命周期自动重试功能。
当集群不满足以上条件时,可通过升级集群版本启用该功能。但升级前已失败的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
}
}
|
配置项 |
类型 |
说明 |
|---|---|---|
|
plugins.index_state_management.coordinator.css.reactivate |
Boolean |
Reactivate特性开关。
|
|
plugins.index_state_management.coordinator.css.reactivate_period |
Time |
Reactivate周期轮询时间。 取值范围:≥5m 默认值:30m |
|
plugins.index_state_management.coordinator.css.reactivate_duration |
Time |
初始Reactivate时间,即任务第一次失败后等待重启的时长,与后续的指数退避计算无关。 取值范围:≥1m 默认值:1h |
|
plugins.index_state_management.coordinator.css.reactivate_max_duration |
Time |
最大Reactivate时间,即任务多次失败后,指数退避等待时间的最大值,确保无论失败次数如何增加,重试间隔不会无限增长。 取值范围:≥1m 默认值:24h |
|
plugins.index_state_management.coordinator.css.max_inflight_reactivate_tasks |
Long |
同时重试任务数最大值,即最多允许几个失败任务同时处于重试执行状态。 取值范围:1~100000 默认值:10000 |
重试任务的幂等处理限制
- 幂等操作:重试时可以从头开始执行所有步骤,确保数据一致性。
- 非幂等操作:重试时会从当前步骤继续执行,若失败原因未解决,可能导致重试任务失败,此时需要人工干预。
Elasticsearch集群生命周期任务中的非幂等操作包括:ForceMerge、Notification、Snapshot。
云搜索服务在索引生命周期任务详情接口中新增了任务执行记录的字段,通过以下命令可查看索引生命周期任务的执行记录,包括失败次数、失败时间、激活时间及任务失败原因等信息:
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" : 0, // 任务执行时间,首次执行时间为0
"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]"
}
}
]
},
...
}
}