Elasticsearch集群随着数据量增长面临磁盘空间不足、查询性能下降和集群状态膨胀等问题。索引生命周期管理(Index Lifecycle Management, ILM)通过策略自动执行索引的滚动、收缩、迁移和删除操作,配合冷热数据分层架构将SSD用于热数据查询、HDD用于冷数据归档,在控制成本的同时保持查询性能。
ILM策略定义与阶段配置
ILM策略将索引生命周期分为五个阶段:Hot(热数据,高频读写)、Warm(温数据,只读查询)、Cold(冷数据,低频查询)、Frozen(冻结数据,按需查询)、Delete(删除)。每个阶段定义触发条件和操作动作。
PUT _ilm/policy/logs-lifecycle-policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_age": "1d",
"max_primary_shard_size": "50gb",
"max_docs": 100000000
},
"set_priority": { "priority": 100 }
}
},
"warm": {
"min_age": "7d",
"actions": {
"shrink": { "number_of_shards": 1 },
"forcemerge": { "max_num_segments": 1 },
"allocate": {
"include": { "data_temperature": "warm" }
},
"set_priority": { "priority": 50 }
}
},
"cold": {
"min_age": "30d",
"actions": {
"allocate": {
"include": { "data_temperature": "cold" }
},
"freeze": {},
"set_priority": { "priority": 0 }
}
},
"delete": {
"min_age": "90d",
"actions": { "delete": {} }
}
}
}
}
策略解读:
- Hot阶段:索引主分片超过50GB或写入超过1亿条文档或存在超过1天时,触发rollover滚动创建新索引
- Warm阶段(7天后):将分片数收缩为1,强制合并segment,迁移到warm节点
- Cold阶段(30天后):迁移到cold节点并冻结,冻结后索引不在内存中维护缓存
- Delete阶段(90天后):直接删除索引
索引模板与别名绑定
ILM要求索引通过别名写入,rollover通过别名指向新索引实现透明切换。
PUT _index_template/logs-template
{
"index_patterns": ["logs-*"],
"template": {
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"index.lifecycle.name": "logs-lifecycle-policy",
"index.lifecycle.rollover_alias": "logs-current",
"index.routing.allocation.include.data_temperature": "hot"
},
"mappings": {
"properties": {
"@timestamp": { "type": "date" },
"level": { "type": "keyword" },
"service": { "type": "keyword" },
"message": { "type": "text" },
"host": { "type": "keyword" },
"duration_ms": { "type": "long" }
}
}
}
}
PUT logs-000001
{
"aliases": {
"logs-current": { "is_write_index": true }
}
}
POST logs-current/_doc
{
"@timestamp": "2026-08-20T10:00:00Z",
"level": "INFO",
"service": "api-gateway",
"message": "Request processed",
"host": "node-1",
"duration_ms": 42
}
is_write_index: true标记当前索引为别名的写入索引。rollover触发后,Elasticsearch自动创建logs-000002,将别名指向新索引,旧索引进入Warm阶段。应用层始终向logs-current别名写入,无需感知索引切换。
冷热节点架构与数据分层
冷热分层通过elasticsearch.yml中的node.roles标记节点角色。
# Hot节点(SSD,高CPU/内存)
node.name: hot-node-1
node.roles: [data_hot]
node.attr.data_temperature: hot
# Warm节点(SSD,中等配置)
node.name: warm-node-1
node.roles: [data_warm]
node.attr.data_temperature: warm
# Cold节点(HDD,低配置)
node.name: cold-node-1
node.roles: [data_cold]
node.attr.data_temperature: cold
硬件规格参考:
Hot节点: 64核 / 256GB RAM / 4x 3.84TB NVMe SSD
Warm节点: 32核 / 128GB RAM / 4x 7.68TB SATA SSD
Cold节点: 16核 / 64GB RAM / 8x 16TB HDD
Frozen阶段在Elasticsearch 7.12后被Searchable Snapshots替代,冷数据存储在对象存储(S3/MinIO)中,查询时按需从快照拉取,大幅降低存储成本,代价是查询延迟增加2-10倍。
Force Merge与Segment合并优化
Warm阶段的forcemerge操作将索引的segment合并为单个段,对于只读索引收益显著:
- 减少segment文件数量,降低文件句柄占用
- 减少查询时需要扫描的segment数,降低I/O开销
- 回收deleted文档占用的磁盘空间
- 压缩字段数据(FST、doc values)到单个segment中
POST logs-000001/_forcemerge?max_num_segments=1
GET _cat/segments/logs-000001?v
GET logs-000001/_stats/store?human
forcemerge是I/O密集型操作,执行期间磁盘吞吐会被占满。ILM策略中Warm阶段设置min_age为7天,确保forcemerge在索引转为只读后执行。手动forcemerge应避开业务高峰期。
ILM策略监控与故障排查
GET logs-000001/_ilm/explain
POST logs-000001/_ilm/retry
POST _ilm/stop
POST _ilm/start
常见ILM卡住原因:
- allocation失败:目标节点磁盘水位超限(85%低水位,90%高水位)
- shrink失败:源索引仍有写入,shrink要求索引为只读状态
- freeze失败:节点内存不足,冻结操作需要将索引元数据加载到内存
- reroute失败:集群存在未分配分片,ILM会等待集群状态green
Shrink操作与分片数规划
Shrink将索引分片数从N缩减为M(M必须能整除N)。操作原理是创建目标索引,使用硬链接复制segment文件,不产生实际数据拷贝。前提是源索引和目标索引在同一节点上。
分片数规划对Shrink效率有直接影响。初始分片数应为shrink目标值的整数倍。如果最终需要1分片,初始可选1/2/3/5;如果需要2分片,初始可选2/4/6/10。分片数过多会导致shard metadata膨胀,加重master节点负担;过少则并行度不足,写入吞吐受限。
PUT logs-000001/_settings
{
"index": {
"routing.allocation.require.data_temperature": "warm",
"blocks.write": true
}
}
POST logs-000001/_shrink/logs-shrinked
{
"settings": {
"index.number_of_shards": 1,
"index.number_of_replicas": 1
}
}
Shrink完成后,原索引可安全删除。ILM自动管理这个过程,手动操作仅用于排查问题或紧急调整。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/elasticsearch-ji-qun-suo-yin-sheng-ming-zhou-qi-guan-li-yu/