不使用数据流管理时序数据
尽管 数据流 是扩展和管理时序数据的便捷方式,但它们被设计为仅追加模式。我们认识到,可能存在需要原地更新或删除数据的用例,而数据流不支持直接的删除和更新请求,因此需要直接在数据流的后端索引上使用索引 API。在这些情况下,我们仍然建议使用数据流。
如果您经常使用相同的 _id 发送多个文档并期望“最后写入者胜”(last-write-wins),则可以使用索引别名而不是数据流来管理包含时序数据的索引,并定期滚动(roll over)到新索引。
要使用索引别名通过 ILM 自动化管理时序索引的滚动和维护,您需要
- 创建生命周期策略,定义相应的阶段和操作。
- 创建索引模板,将策略应用于每个新索引。
- 引导(Bootstrap)一个索引作为初始写入索引。
- 验证索引是否按预期在生命周期阶段中流转。
生命周期策略指定了索引生命周期中的各个阶段以及在每个阶段执行的操作。生命周期最多可以包含五个阶段:hot(热)、warm(温)、cold(冷)、frozen(冻结)和 delete(删除)。
例如,您可以定义一个名为 timeseries_policy 的策略,它包含以下两个阶段
- 一个
hot阶段,定义了一个滚动(rollover)操作,指定当索引达到 50 GB 的max_primary_shard_size或 30 天的max_age时进行滚动。 - 一个
delete阶段,设置min_age以在滚动 90 天后删除索引。
min_age 值是相对于滚动时间而言的,而不是索引创建时间。了解更多。
您可以在 Kibana 中或使用 创建或更新策略 API 来创建策略。
要从 Kibana 创建策略
- 使用导航菜单或全局搜索字段转到 Index Lifecycle Policies 管理页面。
- 点击 Create policy。
默认情况下,仅启用了热(hot)索引生命周期阶段。启用您需要的每个附加生命周期阶段。
使用 创建或更新策略 API 将 ILM 策略添加到 Elasticsearch 集群中
PUT _ilm/policy/timeseries_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_primary_shard_size": "50GB",
"max_age": "30d"
}
}
},
"delete": {
"min_age": "90d",
"actions": {
"delete": {}
}
}
}
}
}
min_age默认为0ms,因此新索引会立即进入hot阶段。- 当满足任一条件时,触发
rollover操作。 - 在滚动 90 天后将索引移入
delete阶段。 - 当索引进入删除阶段时,触发
delete操作。
请注意,对于 hot 阶段之后的每个阶段,您可以选择在经过一段时间后将数据移动到下一个阶段。此持续时间是从索引滚动时间开始计算的,而不是从索引创建时间开始计算的。
有关默认 ILM 策略设置的更多详细信息,请参阅 创建生命周期策略。
要在滚动时自动将生命周期策略应用于新的写入索引,请在用于创建新索引的索引模板中指定该策略。
例如,您可以创建一个 timeseries_template,它应用于名称匹配 timeseries-* 索引模式的新索引。
要启用自动滚动,该模板需配置两个 ILM 设置
index.lifecycle.name指定要应用于匹配该索引模式的新索引的生命周期策略名称。index.lifecycle.rollover_alias指定当为索引触发滚动操作时要滚动的索引别名。
要使用 Kibana 的“创建模板”向导来添加模板
- 使用导航菜单或全局搜索字段转到 Index Management 页面。
- 在“索引模板”(Index Templates)选项卡中,点击“创建模板”(Create template)。

有关您可以指定的可用索引模板选项的更多信息,请参阅 创建索引模板以应用生命周期策略。
示例模板的创建模板请求如下所示
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"
}
}
}
- 如果新索引名称以
timeseries-开头,则应用此模板。 - 要应用于每个新索引的生命周期策略名称。
- 用于引用这些索引的别名名称。对于使用滚动操作的策略是必需的。
为了开始使用,您需要引导(Bootstrap)一个初始索引,并将其指定为索引模板中指定的滚动别名的写入索引。此索引的名称必须匹配模板的索引模式并以数字结尾。在滚动时,此数字会递增以生成新索引的名称。
例如,以下请求会创建一个名为 timeseries-000001 的索引,并将其设为 timeseries 别名的写入索引。
PUT timeseries-000001
{
"aliases": {
"timeseries": {
"is_write_index": true
}
}
}
当满足滚动条件时,rollover 操作会
- 创建一个名为
timeseries-000002的新索引。它匹配timeseries-*模式,因此timeseries_template中的设置会应用于新索引。 - 将新索引指定为写入索引,并使引导索引变为只读。
每次满足滚动条件时,此过程都会重复。您可以使用 timeseries 别名搜索由 timeseries_policy 管理的所有索引。写入操作应发送到该别名,别名会将它们路由到其当前的写入索引。
获取受管索引的状态信息与使用数据流管理时序数据的情况非常相似,唯一的区别是索引命名空间。运行以下 API 请求以获取生命周期进度
GET timeseries-*/_ilm/explain
有关更多信息,请参阅 检查生命周期进度。