一、引言:为何需要管理 Elasticsearch 索引的生命周期?
- 痛点引入:
- 随着时间推移,日志、指标等时序数据不断增长。
- 旧数据查询频率降低,但仍占用高性能、高成本存储。
- 单个索引过大导致性能下降、维护困难。
- 手动管理索引(创建、关闭、删除)繁琐且容易出错。
- 数据保留策略难以统一执行。
- 解决方案概览: Elasticsearch 的索引生命周期管理 (ILM) 和数据分层 (Data Tiers) 机制。
- 本文目标: 详细解释 ILM 和数据分层的概念、工作原理及如何配置它们来优化集群。
二、核心概念解析
- 什么是索引生命周期管理 (ILM)?
- 定义: 一种自动化管理索引从创建到删除整个生命周期的机制。
- 四大阶段 (Phases):
- Hot (热阶段): 索引活跃,频繁读写。强调写入吞吐和查询速度。
- Warm (温阶段): 索引不再写入,查询频率降低。开始考虑成本和资源优化。
- Cold (冷阶段): 索引极少查询,主要用于归档。极致的成本优化。
- Delete (删除阶段): 索引不再需要,永久删除。
- 关键动作 (Actions):
- rollover: 核心动作,自动创建新索引并将别名指向新索引。
- shrink: 减少主分片数量。
- forcemerge: 合并段,减少资源占用,提升只读查询性能。
- allocate: 将索引迁移到特定属性的节点。
- freeze / unfreeze: (旧机制) 冻结/解冻索引以减少内存占用。
- searchable_snapshot: (推荐的冷数据方案) 将索引数据备份到低成本对象存储(如 S3),同时保持可搜索。
- delete: 删除索引。
- set_priority: 设置索引恢复优先级。
- readonly: 设置索引为只读。
- 什么是数据分层 (Data Tiers)?
- 概念: 根据数据的访问频率和重要性,将其存储在不同性能和成本特性的硬件节点上。
- 典型分层:
- Hot Tier Nodes:
- 硬件:高性能 SSD (如 NVMe)。
- 角色:处理新数据写入和最频繁的查询。
- 节点配置 (elasticsearch.yml): node.roles: [ data_hot, … ] (推荐) 或 node.attr.data_tier: hot。
- Warm Tier Nodes:
- 硬件:大容量 SATA SSD 或性能较好的 HDD。
- 角色:存储不再写入但仍需查询的数据。
- 节点配置: node.roles: [ data_warm, … ] 或 node.attr.data_tier: warm。
- Cold Tier Nodes:
- 硬件:大容量、低成本 HDD。
- 角色:存储极少访问的归档数据,或作为可搜索快照的目标(数据实际在对象存储)。
- 节点配置: node.roles: [ data_cold, … ] 或 node.attr.data_tier: cold。
- (可选) Frozen Tier: 主要是通过 searchable_snapshot 实现,数据存储在对象存储中,由 data_frozen 角色的节点进行协调搜索。
- Hot Tier Nodes:
三、ILM 与数据分层如何协同工作?—— 自动化的数据流转
- 核心机制: ILM 策略中的 allocate 动作是连接 ILM 和数据分层的桥梁。
- 工作流程:
- 节点标记: 首先,为集群中的不同节点配置不同的角色/属性 (e.g., data_hot, data_warm, data_cold)。
- ILM 策略定义: 创建 ILM 策略,在 Warm 和 Cold 阶段使用 allocate 动作,并指定 require 条件,如 {“data_tier”: “warm”} 或 {“data_tier”: “cold”}。
- 策略应用: 将 ILM 策略应用到索引模板 (Index Template),这样新创建的符合条件的索引会自动应用该策略。
- 自动迁移:
- 当索引达到进入 Warm 阶段的条件 (如 min_age: “7d”), ILM 会执行 allocate 动作。
- Elasticsearch 的分片分配器会查找具有 data_tier: warm 属性的节点。
- 索引分片会自动从 Hot 节点迁移到 Warm 节点。
- 同理,当进入 Cold 阶段时,会迁移到 Cold 节点或执行 searchable_snapshot。
- 效果: 最新、最热的数据保留在高性能节点,旧数据自动迁移到成本更低的节点,最终按策略删除。
四、实战演练:配置一个典型的日志 ILM 策略
- 场景假设: 系统日志,希望保留90天。
- 最近7天:Hot 阶段,快速写入和查询。
- 第8天 – 第30天:Warm 阶段,减少分片,强制合并,迁移到 Warm 节点。
- 第31天 – 第90天:Cold 阶段,迁移到 Cold 节点 (或使用可搜索快照)。
- 超过90天:Delete 阶段。
- 步骤:
配置节点角色/属性:
(示例 elasticsearch.yml 片段)
# Hot 节点
node.name: hot-node-1
node.roles: [ master, data_hot, ingest ]
# ...其他配置
# Warm 节点
node.name: warm-node-1
node.roles: [ data_warm ]
# ...其他配置
# Cold 节点
node.name: cold-node-1
node.roles: [ data_cold ]
# ...其他配置
创建 ILM 策略 (Kibana Dev Tools 或 API):
(示例 JSON 策略)
PUT _ilm/policy/my_log_policy
{
"policy": {
"phases": {
"hot": {
"min_age": "0ms",
"actions": {
"rollover": {
"max_age": "1d", // 或 max_size, max_docs
"max_primary_shard_size": "50gb"
},
"set_priority": {
"priority": 100
}
}
},
"warm": {
"min_age": "7d", // 7天后进入 warm
"actions": {
"set_priority": {
"priority": 50
},
"shrink": {
"number_of_shards": 1
},
"forcemerge": {
"max_num_segments": 1
},
"allocate": {
"number_of_replicas": 1, // 可选调整副本
"require": {
"data_tier": "warm"
}
},
"readonly": {}
}
},
"cold": {
"min_age": "30d", // Hot 7天 + Warm 23天 = 30天后进入 cold
"actions": {
"set_priority": {
"priority": 0
},
"allocate": {
"require": {
"data_tier": "cold"
}
}
// 或者使用 searchable_snapshot
// "searchable_snapshot": {
// "snapshot_repository": "my_s3_backup_repo"
// }
}
},
"delete": {
"min_age": "90d", // Hot 7天 + Warm 23天 + Cold 60天 = 90天后删除
"actions": {
"delete": {}
}
}
}
}
}
创建索引模板并关联 ILM 策略:
(示例 JSON 索引模板)
PUT _index_template/my_log_template
{
"index_patterns": ["mylogs-*"], // 匹配你的日志索引名称
"template": {
"settings": {
"number_of_shards": 3, // 初始主分片数
"number_of_replicas": 1,
"index.lifecycle.name": "my_log_policy", // 关联 ILM 策略
"index.lifecycle.rollover_alias": "mylogs-write" // 设置 rollover 别名
}
}
}
创建初始写入别名 (如果使用 rollover):
PUT mylogs-000001
{
"aliases": {
"mylogs-write": {
"is_write_index": true
}
}
}
之后,所有日志写入都应该指向 mylogs-write 这个别名。
五、为何以及何时选择配置 Warm 和 Cold 阶段?
- 回顾你的场景: 当前只用到 Hot 和 Delete (比如保留60天)。
- 何时需要 Warm/Cold:
- 延长数据保留期但控制成本: 想保留数据超过60天(如180天、1年),但不想所有数据都占用昂贵的 Hot 存储。
- Hot 存储压力大: 即使只保留60天,如果数据量巨大导致 Hot 节点成本过高或性能瓶颈。
- 查询需求分级: 近期数据需要秒级响应,历史数据查询频率低、可容忍较慢响应。
- 已有异构硬件: 集群中已经部署了不同性能/成本的硬件节点。
- 决策点: 综合考虑数据量、保留需求、查询模式、硬件成本和运维复杂度。如果当前 Hot -> Delete 策略简单有效且成本可接受,则无需立即引入 Warm/Cold。
六、总结与最佳实践
- ILM 和数据分层是 Elasticsearch 管理大规模时序数据的强大工具。
- 它们能显著优化性能、降低存储成本并自动化管理任务。
- 最佳实践:
- 从小处着手: 如果刚开始,可以先从简单的 Hot -> Delete 策略开始,逐步引入 Warm/Cold。
- 充分测试: 在非生产环境充分测试 ILM 策略。
- 监控 ILM: 使用 GET /<index_name>/_ilm/explain API 或 Kibana UI 监控 ILM 执行状态。
- 合理规划节点数量和容量: 确保每个 Tier 有足够的节点和存储空间来容纳数据迁移和峰值负载。
- 考虑 searchable_snapshot: 对于 Cold Tier,searchable_snapshot 是现代且非常经济的选择,特别是结合对象存储。
- 文档先行: 记录你的 ILM 策略和节点配置。