首页/数据/NoSQL 速查/ILM 索引生命周期策略
Elasticsearch89 条

ILM 索引生命周期策略

ILM 把索引按年龄或体积分到 hot/warm/cold/delete 阶段并自动执行 rollover、shrink、force merge、删除等动作;策略通过模板绑定到索引,需搭配写别名使用。

NoSQL 速查数据更新于 2026-10-13

ILM 做什么

索引生命周期管理把索引按年龄或体积划分到 hot、warm、cold、delete 等阶段,并在阶段内自动执行 rollover、forcemerge、shrink、allocate、delete 等动作。策略本身只是定义,必须通过索引模板或 _settings 绑定到索引上才会生效,滚动还依赖写别名。

基本信息

适用版本Elasticsearch 7.x / 8.x(基础版即可用)
定义策略PUT /_ilm/policy/<name>
绑定方式模板 settings 里写 index.lifecycle.name
滚动前提写别名 + index.lifecycle.rollover_alias
执行节奏由 indices.lifecycle.poll_interval 轮询触发,默认 10 分钟

典型使用场景

  • 日志与指标索引按天或按体积滚动,避免单个索引无限增长
  • 冷热分层:热节点放近期索引,老索引迁到低配节点并降低副本
  • 合并优化:进入 warm 后 forcemerge 减少段数,提升查询效率
  • 到期清理:delete 阶段自动删除超过保留期的索引,替代手工脚本
  • 上线前的安全审查:用 _ilm/explain 核对每个索引所处阶段与下一步动作

示例

示例
PUT /_ilm/policy/logs_policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": { "max_primary_shard_size": "50gb", "max_age": "7d" },
          "set_priority": { "priority": 100 }
        }
      },
      "warm": {
        "min_age": "7d",
        "actions": {
          "forcemerge": { "max_num_segments": 1 },
          "set_priority": { "priority": 50 }
        }
      },
      "delete": { "min_age": "90d", "actions": { "delete": {} } }
    }
  }
}

PUT /_index_template/logs_template               # 绑定策略并挂写别名,rollover 才能工作
{
  "index_patterns": ["logs-*"],
  "template": {
    "settings": {
      "index.lifecycle.name": "logs_policy",
      "index.lifecycle.rollover_alias": "logs-write"
    },
    "aliases": { "logs-write": { "is_write_index": true } }
  }
}

GET /logs-write-000001/_ilm/explain              # 看当前阶段、年龄与下一步动作
GET /_ilm/status                                 # 看 ILM 运行状态(正常为 RUNNING)

阶段与动作

阶段典型动作说明
hotrollover、set_priority正在写入;rollover 只允许放在 hot 阶段
warmforcemerge、allocate、set_priority不再写入,侧重查询效率与资源降级
coldallocate、降低副本数仅偶尔查询,迁到低成本节点省资源
deletedelete不可逆,上线前必须核对年龄阈值
通用约束min_age 控制进入时机从索引创建时刻计时,而非数据写入时间
策略定义完不会自动生效:已有索引要 PUT /<index>/_settings 单独挂 index.lifecycle.name,新索引则通过索引模板继承,两者都别忘。
rollover 依赖写别名:模板里设好 index.lifecycle.rollover_alias,并保证被指向的索引别名带 is_write_index: true,否则滚动动作不会把写入切到新索引上,业务会继续写老索引。
delete 阶段执行后数据不可恢复(除非另有快照);策略上线前先用 _ilm/explain 核对每个索引的阶段与剩余时间,并确认 min_age 的口径符合预期。

易错点

  • 把 rollover 动作放进 warm 或 cold 阶段,策略校验直接报错 → rollover 只能配在 hot
  • 忘了建写别名或别名没设 is_write_index: true,索引一直不滚动,写入量全压在一个索引上
  • 把 min_age 理解成「数据写入时间」:它按索引创建时刻计时,效果与直觉可能差好几天
  • 改完策略长时间没反应就以为失效,实际要等轮询周期(默认 10 分钟)触发
  • delete 阶段阈值设得比业务保留期短,历史数据被自动删掉且无法恢复

数据来源与参考

  • Elasticsearch Guide: Index lifecycle management
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌