索引生命周期管理(Index Lifecycle Management, ILM)是 Elasticsearch 提供的一个强大功能,用于自动化管理索引从创建到删除的整个生命周期。合理使用 ILM 可以帮助我们节约存储成本、提高搜索性能,并确保数据合规性。
本文将通过一个实操案例,演示如何配置一个包含 Hot(热)、Warm(温)和 Delete(删除)三个阶段的 ILM 策略,并将其应用到索引模板上。
1. 理解 ILM 阶段
ILM 策略通常包含以下几个阶段:
| 阶段 | 描述 | 主要操作 |
|---|---|---|
| Hot (热) | 索引正在积极写入和读取。性能要求最高。 | 写入数据、Rollover(索引轮转)。 |
| Warm (温) | 索引不再写入,但仍频繁读取。 | 设为只读、降低副本数。 |
| Cold (冷) | 索引极少访问,但需保留。 | 迁移到廉价存储、强制合并段。 |
| Delete (删除) | 数据已过期或不再需要。 | 彻底删除索引。 |
2. 步骤实操
我们以一个日志索引为例,要求数据写入 1 分钟后轮转,10 分钟后进入 Warm 阶段,20 分钟后删除。
步骤 2.1:创建 ILM 策略
我们创建一个名为 log_data_ilm_policy 的策略。为了方便测试轮转(Rollover),我们将 Hot 阶段的轮转条件设置为:索引大小达到 50MB 或 包含至少 1 个文档 或 经过 1 分钟。
PUT _ilm/policy/log_data_ilm_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_age": "1m",
"max_size": "50mb",
"max_docs": 1
}
}
},
"warm": {
"min_age": "10m",
"actions": {
"set_priority": {
"priority": 0
},
"readonly": {}
}
},
"delete": {
"min_age": "20m",
"actions": {
"delete": {}
}
}
}
}
}
步骤 2.2:创建索引模板
接下来,我们需要创建一个索引模板,将该策略应用于所有匹配 logs-*** 模式的新索引。同时,我们需要定义一个 **rollover_alias,这是 ILM 自动轮转的关键。
PUT _index_template/log_data_template
{
"index_patterns": ["logs-*"],
"template": {
"settings": {
"index.lifecycle.name": "log_data_ilm_policy",
"index.lifecycle.rollover_alias": "logs_write",
"index.number_of_shards": 1,
"index.number_of_replicas": 1
}
},
"priority": 500
}
核心要点: index.lifecycle.name 指定了 ILM 策略,index.lifecycle.rollover_alias 定义了写入别名。
步骤 2.3:创建初始索引(Bootstrap Index)
索引模板并不会自动创建索引。我们需要手动创建一个起始索引,并将其命名为别名加上起始数字后缀 000001。
PUT logs-000001
{
"aliases": {
"logs_write": {
"is_write_index": true
}
}
}
核心要点: logs_write 是写入别名,is_write_index: true 告诉 Elasticsearch 当前索引是该别名下唯一接受写入的索引。
步骤 2.4:写入数据验证 Rollover
现在,所有数据都应该通过别名 logs_write 写入。
我们写入一个文档,由于我们在 Hot 阶段设置了 “max_docs”: 1,索引应该在极短时间内触发轮转。
# 写入一个文档到别名
POST logs_write/_doc
{
"timestamp": "2023-10-27T10:00:00Z",
"message": "Test document for ILM rollover"
}
# 稍等片刻(大约 30 秒到 1 分钟)
# 查看索引列表,可以看到新的索引已经创建
GET _cat/indices/logs-*
预期结果: 当 ILM 触发后,logs-000001 索引会被关闭写入,并创建一个新的索引 logs-000002。别名 logs_write 会自动指向 logs-000002 进行写入。
步骤 2.5:监控生命周期
你可以使用以下 API 来检查索引当前处于哪个 ILM 阶段,以及何时会进入下一个阶段:
GET logs-*/_ilm/explain
观察结果,logs-000001 索引在 Rollover 后,将进入 Hot 阶段的 Post-Rollover 状态,等待达到 10 分钟后自动进入 Warm 阶段,并在 20 分钟后被删除,实现了完全的自动化管理。
汤不热吧