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