加载中

Elasticsearch 中的索引滚动和路由分配

在处理日志或指标等时序数据时,无限期地写入单个索引会损害性能并影响资源使用。Elasticsearch 使用索引滚动 (rollover) 和路由分配来优化摄入、搜索和存储。滚动操作 (rollover action) 会在索引超过指定的大小、存活时间或文档数量时,用新索引替换当前的活动写入索引。这对于日志或指标等索引持续增长的时序数据特别有用。如果没有滚动,单个索引会持续增长,导致搜索性能下降,并增加集群的管理负担。

滚动功能是 索引生命周期管理 (ILM)数据流生命周期 (DLM) 工作方式的重要组成部分,用于保持索引的快速和可管理性。通过切换索引的写入目标,滚动操作带来了以下好处:

  • 生命周期 - 与生命周期管理 (ILM 或 DLM) 配合,使索引经历其生命周期阶段,并允许对保留周期进行细粒度控制
  • 优化性能 - 将分片大小保持在推荐限制(10-50 GB)内
  • 查询运行速度更快 - 提高搜索性能

可以使用 API、ILM 或 DLM 来触发滚动。

提示

以下教程可帮助您针对三种不同场景配置索引的滚动:

有关这些教程的概述,请参阅 ILM 自动化教程

您可以在索引生命周期策略的热阶段 (hot phase) 中定义滚动操作。当满足任何配置的条件且写入索引至少包含一个文档时,它就会运行。您可以配置以下滚动条件:

  • 大小 - 当分片达到设定大小(例如 50 GB)时,索引将滚动。
  • 存活时间 (Age) - 当索引达到一定存活时间(例如 7 天)时,索引将滚动。
  • 文档计数 - 当分片包含一定数量的文档(例如 200 万)时,索引将滚动。
提示

基于大小、文档计数或存活时间滚动到新索引,要优于基于时间的滚动。在任意时间点进行滚动通常会导致产生许多小索引,这对性能和资源使用会产生负面影响。

滚动后,索引会经历其他已配置的索引生命周期阶段:温阶段 (warm)、冷阶段 (cold)、冻结阶段 (frozen) 和删除阶段 (delete)。滚动会创建一个新的写入索引,而之前的索引则继续经历生命周期阶段。

特殊规则

  • 即使为空的写入索引设置了可能会触发滚动的 max_age,其滚动也会被跳过。如果您在滚动条件中设置了 min_docs: 0,策略可以覆盖此行为。如果将 indices.lifecycle.rollover.only_if_has_documents 设置为 false,也可以在集群范围内禁用此限制。
  • 如果任何分片达到 2 亿个文档,将发生强制滚动。通常,分片在达到 2 亿个文档之前很久就会达到 50 GB,但对于空间利用率高的数据集,情况并非如此。

根据您的用例和需求决定索引轮转的方法。

用例 推荐方法 设置的好处和限制
日志、指标 数据流 使用生命周期管理配置滚动,最小化设置,控制滚动时机 1
旧版索引设置 基于别名的滚动 使用生命周期管理配置滚动,高级设置,控制滚动时机
小型、静态数据集 不滚动 更简单的管理

1 在 Elasticsearch Serverless 项目中,数据流的滚动是自动处理的。

提示

对于新项目,请使用数据流。与别名不同,它们更易于管理,因为可以在不进行额外滚动配置的情况下定义生命周期操作。

我们建议使用 数据流 来管理时序数据。当设置为使用包含滚动的 ILM 策略时,数据流无需额外配置即可管理索引的轮转。当针对数据流操作时,每当当前的写入索引达到指定的存活时间或大小时,就会生成一个新的后端索引(带有递增的数字和时间戳),并成为数据流的写入索引。

每个数据流都需要一个 索引模板,其中包含以下内容:

  • 数据流的名称或通配符 (*) 模式。
  • 指示该模式下的索引用于数据流的配置。
  • 可选:创建每个后端索引时应用的映射和设置。

有关此方法的更多信息,请参阅使用数据流管理时序数据教程。

提示

数据流专为仅追加 (append-only) 数据设计,其中数据流名称可用作操作(读取、写入、滚动、收缩等)的目标。如果您的用例需要就地更新数据,您可以直接对后端索引执行更新或删除操作

数据流命名模式
Elasticsearch 对数据流的后端索引使用结构化的命名约定,遵循此模式:

.ds-<DATA-STREAM-NAME>-<yyyy.MM.dd>-<GENERATION>
		

有关数据流命名模式的更多信息,请参阅数据流页面中的生成 (Generation) 部分。

使用别名轮转索引需要额外的配置步骤,包括引导初始索引。有关此方法的更多详细信息,请参阅在没有数据流的情况下管理时序数据教程。

重要提示

使用别名进行滚动需要满足特定条件。在应用此方法之前,请查看这些注意事项:

  • 索引名称必须符合 <INDEX_NAME>-<INDEX_NUMBER> 模式,例如 my-index-000001
  • 必须配置 index.lifecycle.rollover_alias 作为要滚动的别名。
  • 索引必须是该别名的写入索引
注意

当别名或数据流滚动时,会存储前一个写入索引的滚动时间。在索引生命周期管理 min_age 阶段计算中,使用的是此日期,而不是索引的 creation_date了解更多

基于别名的命名模式
配置正确后,新创建的写入索引名称与已滚动的索引名称相似,但六位数的零填充后缀会递增。例如,滚动前写入索引名为 my-index-000001,滚动后新创建的索引名为 my-index-000002,并成为新的写入索引。别名通常共享基础名称,在本例中为 my-index

© . This website operates independently and is not affiliated with or endorsed by Elasticsearch B.V. All brand names, logos, and trademarks are the property of their respective owners.