Elasticsearch索引生命周期管理ILM的核心概念
Elasticsearch索引生命周期管理(Index Lifecycle Management, ILM)是ES内置的自动化索引管理策略,根据索引年龄或大小自动执行rollover、shrink、forceMerge、freeze、delete等操作。日志、监控指标、业务事件等时序数据天然具有冷热特征:近期数据高频访问,历史数据偶尔查询,超过保留期的数据直接删除。ILM将这些运维决策声明式配置,免去了手动管理成百上千个索引的工作量。
ILM定义四个阶段,按顺序执行:Hot(热阶段,索引正在写入)、Warm(温阶段,索引不再写入但仍需查询)、Cold(冷阶段,索引极少查询可冻结)、Delete(删除阶段,索引超期删除)。每个阶段可配置一个或多个动作,动作之间串行执行。
ILM策略配置与Rollover机制
Rollover是ILM最核心的动作,当一个索引达到指定条件(大小、年龄、文档数)时,自动创建新索引并将写入别名指向新索引。旧索引进入温/冷阶段处理。
ILM策略定义示例:
PUT _ilm/policy/logs-policy
{
"policy": {
"phases": {
"hot": {
"min_age": "0ms",
"actions": {
"rollover": {
"max_primary_shard_size": "50gb",
"max_age": "7d",
"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": {
"freeze": {},
"allocate": {
"require": {
"data": "cold"
}
},
"set_priority": {
"priority": 0
}
}
},
"delete": {
"min_age": "90d",
"actions": {
"delete": {}
}
}
}
}
}
该策略的工作流程:索引写入期间(Hot),任一shard达到50GB或索引满7天或文档数达1亿,触发rollover创建新索引。rollover后的旧索引7天后进入Warm阶段,shrink到1个shard并forceMerge到1个segment,迁移到warm节点。30天后进入Cold阶段冻结,迁移到cold节点。90天后自动删除。
冷热数据分层节点架构设计
ILM的allocate动作依赖节点的属性标签。冷热分层架构通过为不同规格的节点打data属性标签,ILM根据阶段自动将索引迁移到对应节点。
节点elasticsearch.yml配置:
# Hot节点:NVMe SSD,高配CPU/内存
node.roles: [data_hot]
node.attr.data: hot
# Warm节点:SATA SSD或HDD RAID,中配
node.roles: [data_warm]
node.attr.data: warm
# Cold节点:大容量HDD,低配
node.roles: [data_cold]
node.attr.data: cold
ES 7.x以后支持node.roles直接定义data_hot/data_warm/data_cold角色,无需手动打属性标签。ILM的allocate动作会自动识别节点角色进行迁移。Hot节点通常配备NVMe SSD和充足内存(128GB+),以支撑高频写入和查询。Warm节点使用SATA SSD降低成本,Cold节点使用HDD阵列或对象存储(通过Frozen Tier)。
ILM策略应用与索引模板绑定
ILM策略通过索引模板绑定到索引。创建索引模板时指定settings.ilm.name,新创建的索引自动继承策略:
PUT _index_template/logs-template
{
"index_patterns": ["logs-*"],
"template": {
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"index.lifecycle.name": "logs-policy",
"index.lifecycle.rollover_alias": "logs"
}
}
}
创建第一个索引并绑定写入别名:
PUT logs-000001
{
"aliases": {
"logs": {
"is_write_index": true
}
}
}
此后应用写入logs别名,ILM在条件满足时自动rollover创建logs-000002、logs-000003等索引,写入别名始终指向最新索引。
ILM运维常见问题与调优
ILM策略变更不会立即生效于已有索引。修改策略后,新rollover的索引使用新策略,已有索引保持旧策略。需要手动更新已有索引的ILM策略:
PUT logs-000001/_settings
{
"index.lifecycle.name": "logs-policy-v2"
}
Rollover条件中的max_primary_shard_size是推荐的最佳实践。传统按索引总大小rollover会导致shard大小不均匀,按shard大小rollover确保每个shard都在50GB以内,避免巨型shard导致的恢复缓慢和查询性能下降。
forceMerge到1个segment后,索引不再支持写入(因为merge是不可逆操作)。如果业务需要回补历史数据,应在forceMerge之前完成。freeze动作在ES 8.x中已标记为废弃(frozen tier不再推荐),建议使用Searchable Snapshot替代:将cold数据快照到对象存储,按需挂载查询,节省本地存储成本。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/elasticsearch-suo-yin-sheng-ming-zhou-qi-guan-li-ilm-yu/