第五阶段 46 · ILM 索引生命周期管理(hot-warm-cold-delete)
46 · ILM 索引生命周期管理hot-warm-cold-delete阶段第五阶段 / 运维进阶ESILMIndex Lifecycle Management | PostgreSQL分区表滚动 定时归档/清理1. 概念时序数据日志、指标会无限增长。ILM 让索引按年龄/大小自动流转无需人工阶段做什么类比hot正在写入、频繁查询到阈值自动rollover滚出新索引当前活跃分区warm只读降副本、forcemerge合并段迁到较廉价节点近期历史分区cold很少查可冻结、迁到冷节点归档分区delete到期自动删除DROP旧分区ILM 通常和索引模板 data stream第 34 篇配合模板绑定 policydata stream 自动滚动。2. PostgreSQL 对照-- 手动版定时任务滚动 删除旧分区CREATETABLElogs_2026_08PARTITIONOFlogsFORVALUESFROM(2026-08-01)TO(2026-09-01);DROPTABLElogs_2026_02;-- 删过期分区ILM 就是把「滚动新分区 降配 删旧」自动化的托管版本。3. ES DSL3.1 定义 policyPUT _ilm/policy/logs_policy { policy: { phases: { hot: { actions: { rollover: { max_age: 1d, max_primary_shard_size: 50gb } } }, warm: { min_age: 7d, actions: { set_priority: { priority: 50 }, forcemerge: { max_num_segments: 1 }, shrink: { number_of_shards: 1 } } }, delete: { min_age: 30d, actions: { delete: {} } } } } }3.2 让模板绑定 policy配合 data streamPUT _index_template/logs_template { index_patterns: [logs-*], data_stream: {}, template: { settings: { index.lifecycle.name: logs_policy } } }3.3 观察进度GET logs-*/_ilm/explain # 每个索引当前处于哪个阶段、下一步何时执行4. Spring Boot 实现ComponentpublicclassDoc46Ilm{AutowiredprivateElasticsearchClientelasticsearchClient;/** 创建/更新 ILM policypolicy JSON 外置withJson 直灌 */publicvoidputPolicy(Stringname,StringpolicyJson)throwsIOException{elasticsearchClient.ilm().putLifecycle(p-p.name(name).withJson(newStringReader(policyJson)));}/** 查看某索引的 ILM 进度 */publicvoidexplain(Stringindex)throwsIOException{varrespelasticsearchClient.ilm().explainLifecycle(e-e.index(index));resp.indices().forEach((idx,detail)-log.info(index{} ilm{},idx,detail));}}ILM 客户端在elasticsearchClient.ilm()。策略 JSON 外置到资源文件改策略不改代码。5. 坑与最佳实践ILM 是后台周期任务默认约 10 分钟检查一次indices.lifecycle.poll_interval阶段流转不是实时。rollover 靠“写别名/ data stream”应用写别名或 data streamILM 才能滚动直接写具体索引名滚不动。min_age从 rollover 起算warm/cold/delete 的年龄基准是索引被 rollover 的时间不是创建时间。forcemerge 很重只在 warm 且不再写入时做别对 hot 索引 forcemerge。先小流量验证用短max_age如5m在测试环境跑通阶段流转再上生产参数。