Elasticsearch索引生命周期管理核心概念
Elasticsearch索引生命周期管理(Index Lifecycle Management,ILM)是处理时序数据(日志、指标、事件)的自动化方案,根据数据年龄自动执行滚动、合并、迁移、删除操作,减少人工干预并优化存储成本。
时序数据的访问特征明显:近期数据查询频繁(热),中期数据偶尔查询(温),远期数据极少访问但需保留(冷)。ILM将这一特征编码为策略,让索引在不同阶段间自动流转。
ILM的核心概念:
1. Policy(策略):定义生命周期阶段的规则,绑定到索引模板
2. Phase(阶段):hot、warm、cold、delete四个阶段
3. Action(动作):每个阶段执行的操作,如rollover、shrink、forcemerge、migrate、delete
4. Binding(绑定):Policy通过索引模板自动应用到匹配的新索引
ILM策略配置与阶段动作详解
生产环境ILM策略配置示例,覆盖日志类数据全生命周期:
PUT _ilm/policy/logs-policy
{
"policy": {
"phases": {
"hot": {
"min_age": "0ms",
"actions": {
"rollover": {
"max_primary_shard_size": "50gb",
"max_age": "1d",
"max_docs": 100000000
},
"set_priority": {
"priority": 100
}
}
},
"warm": {
"min_age": "7d",
"actions": {
"shrink": {
"number_of_shards": 1
},
"forcemerge": {
"max_num_segments": 1
},
"allocate": {
"number_of_replicas": 1,
"require": {
"data": "warm"
}
},
"set_priority": {
"priority": 50
}
}
},
"cold": {
"min_age": "30d",
"actions": {
"allocate": {
"require": {
"data": "cold"
}
},
"set_priority": {
"priority": 0
},
"freeze": {}
}
},
"delete": {
"min_age": "90d",
"actions": {
"delete": {}
}
}
}
}
}
各阶段动作解析:
Hot阶段:rollover触发索引滚动,创建新写入索引。max_primary_shard_size限制主分片最大50GB,超过后滚动。max_age设置最长1天强制滚动,避免单索引过大。
Warm阶段:shrink将多分片合并为1个分片,减少元数据开销。forcemerge合并段文件为1个段,降低IO消耗。allocate将索引迁移到warm节点。
Cold阶段:迁移到冷存储节点,freeze冻结索引减少堆内存占用。冻结索引查询需要先解冻,适合偶尔审计的归档数据。
Delete阶段:90天后自动删除索引,释放存储空间。
索引模板与数据流绑定ILM
索引模板(Index Template)将ILM策略自动应用到新索引。数据流(Data Stream)是时序数据的推荐写入方式,背后是一组按时间滚动的隐藏索引:
PUT _index_template/logs-template
{
"index_patterns": ["logs-*"],
"template": {
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"lifecycle.name": "logs-policy",
"lifecycle.rollover_alias": "logs"
},
"mappings": {
"properties": {
"@timestamp": { "type": "date" },
"message": { "type": "text" },
"level": { "type": "keyword" },
"service": { "type": "keyword" },
"host": { "type": "keyword" }
}
}
}
}
PUT _data_stream/logs-app
写入数据流时,Elasticsearch自动路由到当前写入索引:
POST logs-app/_doc
{
"@timestamp": "2026-08-17T10:30:00Z",
"message": "Request processed successfully",
"level": "INFO",
"service": "order-api",
"host": "node-01"
}
rollover触发后自动创建新索引logs-app-000002,写入无缝切换,查询覆盖所有后台索引。
冷热数据分层与节点角色分配
冷热分层依赖节点属性标记,Elasticsearch根据allocate规则迁移索引:
# elasticsearch.yml 节点配置
# 热节点(SSD,高配置)
node.attr.data: hot
node.roles: [data_hot]
# 温节点(SSD,中配置)
node.attr.data: warm
node.roles: [data_warm]
# 冷节点(HDD,低配置)
node.attr.data: cold
node.roles: [data_cold]
节点角色在7.x版本后支持data_hot/data_warm/data_cold内置角色,ILM可直接使用无需手动node.attr配置。Elasticsearch自动感知节点角色,allocate的require条件匹配对应角色。
存储成本对比:热节点用NVMe SSD,IOPS 50万+,$0.3/GB/月。温节点用SATA SSD,IOPS 5万+,$0.1/GB/月。冷节点用HDD,IOPS 500+,$0.02/GB/月。90天数据全量保留,热温冷分层后存储成本仅为全SSD方案的20-30%。
ILM执行状态监控与故障排查
查看索引ILM状态:
# 查看索引当前所处阶段
GET logs-app/_ilm/explain
# 输出示例
{
"indices": {
"logs-app-000001": {
"index": "logs-app-000001",
"phase": "warm",
"action": "complete",
"step": "complete",
"age": "15d"
}
}
}
# 手步触发ILM检查(调试用)
POST logs-app/_ilm/migrate
# 修改策略后重试失败的索引
POST logs-app/_ilm/retry
常见问题:
1. 索引卡在某个阶段不动:检查ILM Explain输出,step字段显示当前步骤。常见原因是目标节点角色不匹配,warm节点不可用时warm阶段无法执行。
2. rolver频率过高:max_age和max_docs参数过小导致索引碎片化。调整max_primary_shard_size为50GB,删除max_age或设置为较大值。
3. shrink失败:shrink要求索引只读且健康状态为green。检查index.blocks.write是否为true,分片是否完成重分配。
4. 迁移缓慢:allocate迁移依赖分片恢复(Recovery)过程,大量数据迁移时网络和磁盘IO是瓶颈。调整indices.recovery.max_bytes_per_sec限制恢复速度,避免影响在线查询。
ILM是Elasticsearch运维自动化的关键工具,合理配置后日志和指标数据无需人工维护,从写入到归档到删除全自动流转。关键原则:热数据控制单索引大小,温数据压缩合并降成本,冷数据归档冻结保合规,到期数据及时清理释放资源。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/elasticsearch-suo-yin-sheng-ming-zhou-qi-guan-li-yu-leng-re/