如何在Elasticsearch中使用索引生命周期管理(ILM)自动化滚动操作(rollover)的教程。
---
Elasticsearch教程:使用ILM自动化滚动操作
在Elasticsearch中,索引生命周期管理(ILM)是一种强大的工具,用于自动化管理时间序列数据的索引滚动操作。通过ILM,你可以根据预定义的策略自动滚动索引,优化存储成本,提高查询性能,并实施数据保留策略。本教程将详细介绍如何使用ILM自动化滚动操作,包括使用数据流(data streams)和索引别名(index aliases)两种方式。
1.使用数据流(Data Streams)管理时间序列数据
数据流是Elasticsearch中用于处理时间序列数据的一种高级抽象,适用于追加写入的场景。数据流可以自动滚动到新的后端索引,并通过生命周期策略管理这些索引。
1.1 创建生命周期策略
生命周期策略定义了索引在不同阶段的行为和操作。一个完整的生命周期可以包含以下阶段:
• 热(Hot):索引处于活跃状态,用于写入和查询。
• 温(Warm):索引不再写入,但仍然可以查询。
• 冷(Cold):索引被移动到低成本存储,查询性能较低。
• 冻结(Frozen):索引被冻结,查询性能最低。
• 删除(Delete):索引被删除。
例如,以下策略定义了`hot`和`delete`两个阶段:
```json
PUT _ilm/policy/timeseries_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_primary_shard_size": "50GB", // 当主分片大小达到50GB时滚动
"max_age": "30d" // 或索引年龄达到30天时滚动
}
}
},
"delete": {
"min_age": "90d", // 在滚动后90天删除索引
"actions": {
"delete": {}
}
}
}
}
}
```
1.2 创建索引模板
索引模板用于定义数据流的初始设置和生命周期策略。创建索引模板时,需要指定`index.lifecycle.name`,以便将生命周期策略应用于数据流。
```json
PUT _index_template/timeseries_template
{
"index_patterns": ["timeseries"],
"data_stream": {},
"template": {
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"index.lifecycle.name": "timeseries_policy"
}
}
}
```
1.3 创建数据流
创建数据流的最简单方式是通过索引文档。Elasticsearch会自动根据索引模板创建数据流及其第一个后端索引。
```json
POST timeseries/_doc
{
"message": "logged the request",
"@timestamp": "1591890611"
}
```
当滚动条件满足时,ILM会自动创建新的后端索引,并将写入操作切换到新索引。
1.4 检查生命周期进度
使用ILM的`explain`API可以查看索引的生命周期状态,包括当前阶段、操作和进度。
```json
GET .ds-timeseries-*/_ilm/explain
```
2.不使用数据流管理时间序列数据
数据流虽然强大,但它是追加写入的,不支持直接更新或删除数据。如果你需要频繁更新或删除数据,可以使用索引别名来管理时间序列数据。
2.1 创建生命周期策略
生命周期策略的创建方式与数据流相同。例如:
```json
PUT _ilm/policy/timeseries_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_primary_shard_size": "50GB",
"max_age": "30d"
}
}
},
"delete": {
"min_age": "90d",
"actions": {
"delete": {}
}
}
}
}
}
```
2.2 创建索引模板
索引模板需要指定`index.lifecycle.rollover_alias`,以便在滚动时更新别名。
```json
PUT _index_template/timeseries_template
{
"index_patterns": ["timeseries-*"],
"template": {
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"index.lifecycle.name": "timeseries_policy",
"index.lifecycle.rollover_alias": "timeseries"
}
}
}
```
2.3 启动初始索引
创建初始索引,并将其指定为别名的写入索引。
```json
PUT timeseries-000001
{
"aliases": {
"timeseries": {
"is_write_index": true
}
}
}
```
2.4 检查生命周期进度
与数据流类似,使用`explain`API查看索引的生命周期状态。
```json
GET timeseries-*/_ilm/explain
```
---
总结
通过ILM,Elasticsearch提供了强大的工具来自动化时间序列数据的索引滚动操作。无论是通过数据流还是索引别名,你都可以根据需求选择合适的方式:
• 数据流:适用于追加写入的场景,提供自动滚动和生命周期管理。
• 索引别名:适用于需要更新或删除数据的场景,提供了更大的灵活性。
在Elasticsearch中,索引别名(Index Aliases)适用于需要更新或删除数据的场景,主要原因如下:
1. 数据流的追加写入限制
数据流(Data Streams)是为追加写入设计的,主要用于处理时间序列数据,如日志、事件或度量数据。它们不支持直接更新或删除已存在的数据。如果需要频繁更新或删除数据,使用数据流可能会导致复杂性增加,因为这些操作需要通过额外的API(如`update_by_query`或`delete_by_query`)来实现。
2. 索引别名的灵活性
索引别名提供了一种更灵活的方式来管理索引。你可以将别名指向一个或多个索引,并在需要时动态更新别名的指向。例如,你可以创建一个写入索引(write index),并将别名指向该索引。当需要滚动到新索引时,只需更新别名的指向即可。这种方式特别适合需要频繁更新或删除数据的场景,因为它允许直接对底层索引进行操作,而不会受到数据流的追加写入限制。
3. 零停机时间的索引切换
索引别名支持原子性操作,这意味着在切换索引时不会出现停机时间。例如,当需要滚动到新索引时,可以先创建一个新索引,然后将别名从旧索引切换到新索引。这种无缝切换确保了应用的连续可用性。
4. 支持更新和删除操作
索引别名允许直接对底层索引进行更新或删除操作。这使得在处理需要频繁修改数据的场景时更加高效。例如,如果你需要根据某些条件删除旧数据或更新现有数据,可以直接在别名指向的索引上执行这些操作。
总结
索引别名适用于需要更新或删除数据的场景,因为它提供了更高的灵活性和直接操作底层索引的能力。相比之下,数据流更适合追加写入的场景,因为它们不支持直接更新或删除数据。如果你的应用场景需要频繁更新或删除数据,建议使用索引别名而不是数据流。
通过创建生命周期策略和索引模板,你可以轻松地管理索引的生命周期,优化存储成本和查询性能,同时满足数据保留策略的要求。
如果你有任何疑问或需要进一步的帮助,请随时联系。