Elasticsearch索引生命周期管理的必要性与阶段划分
Elasticsearch中日志、指标类时序数据每天产生新索引,如果不加管理,磁盘空间持续膨胀,集群性能逐渐退化。ILM(Index Lifecycle Management)通过自动化策略管理索引从创建到删除的完整生命周期,解决人工运维成本高和遗漏风险大的问题。
ILM定义四个阶段:Hot(热)、Warm(温)、Cold(冷)、Delete(删除)。Hot阶段索引支持读写,分配在SSD节点;Warm阶段索引只读,分配在HDD节点;Cold阶段索引极少访问,可以冻结(freeze)节省内存;Delete阶段直接删除索引释放空间。
PUT _ilm/policy/logs-policy
{
"policy": {
"phases": {
"hot": {
"min_age": "0ms",
"actions": {
"rollover": {
"max_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": { "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": {} }
}
}
}
}
Rollover策略与索引滚动机制
Rollover是Hot阶段的核心动作,根据条件自动滚动创建新索引。当索引满足max_size、max_age或max_docs中任一条件时触发滚动。以日志场景为例,每天产生一个索引,超过50GB或1天时创建新索引,旧索引进入Warm阶段倒计时。
Rollover依赖索引别名(alias),写入操作指向别名,滚动后别名自动切换到新索引:
PUT _component_template/logs-settings
{
"template": {
"settings": {
"index.lifecycle.name": "logs-policy",
"index.lifecycle.rollover_alias": "logs",
"number_of_shards": 3,
"number_of_replicas": 1,
"refresh_interval": "5s"
}
}
}
PUT _index_template/logs-template
{
"index_patterns": ["logs-*"],
"composed_of": ["logs-settings"],
"priority": 100
}
PUT logs-000001
{
"aliases": {
"logs": { "is_write_index": true }
}
}
is_write_index: true确保别名logs始终指向当前可写入的索引。Rollover后logs-000001变为只读,新索引logs-000002成为写入目标。
Shrink与ForceMerge优化存储空间
Warm阶段的shrink动作将索引分片数减少到指定值。日志索引在Hot阶段可能配置3-5个分片以提升写入吞吐,进入Warm阶段后不再写入,单个分片即可支撑查询,shrink能显著减少分片数和元数据开销。
shrink的前提条件是索引必须只读(index.blocks.write: true),所有分片必须在同一节点上。Elasticsearch在shrink时会创建新索引并硬链接源分段的文件,不产生数据拷贝,执行速度很快。
forcemerge将索引的段合并为指定数量,减少段文件数和查询时的IO次数。日志类数据合并为1个段是最佳选择:
POST logs-000001/_forcemerge?max_num_segments=1
forcemerge期间会产生大量磁盘IO,建议在业务低峰期执行。ILM自动执行时会在后台逐步处理,不会瞬间占满IO。
冷热架构节点角色分配与路由规则
冷热分层依赖节点的自定义属性。在elasticsearch.yml中配置节点角色:
# Hot节点(SSD)
node.roles: [data_hot]
node.attr.data: hot
# Warm节点(HDD)
node.roles: [data_warm]
node.attr.data: warm
# Cold节点(归档存储)
node.roles: [data_cold]
node.attr.data: cold
ILM的allocate动作根据节点属性将索引迁移到对应层级的节点。迁移过程在后台执行,先在新节点创建分片副本,再删除旧分片,保证数据可用性。
节点配置建议:Hot节点SSD磁盘、高CPU、大内存;Warm节点HDD磁盘、中等CPU;Cold节点可以使用对象存储(如S3)通过Searchable Snapshot挂载,成本极低但查询延迟较高。
ILM策略监控与异常处理
# 查看索引的ILM状态
GET logs-000001/_ilm/explain
# 查看所有索引的ILM状态
GET */_ilm/explain
# 手动重试失败的ILM步骤
POST logs-000001/_ilm/retry
ILM执行失败时索引会进入STOPPED状态,不影响读写但停止生命周期推进。常见失败原因包括:shrink时节点磁盘空间不足、allocate时目标层节点不存在、forcemerge时段合并超时等。修复底层问题后用retry命令恢复执行。
监控方面,Elasticsearch暴露了ILM相关的JMX指标,可以通过Prometheus exporter采集。关键指标包括:当前各阶段的索引数量、ILM步骤执行耗时、失败次数。建议设置告警:任何索引进入STOPPED状态超过1小时即触发通知。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/elasticsearch-suo-yin-sheng-ming-zhou-qi-guan-li-ilm-yu/