大规模使用转换编辑

转换将现有的 Elasticsearch 索引转换为汇总索引,这为新的洞察力和分析提供了机会。转换执行的搜索和索引操作使用标准的 Elasticsearch 功能,因此与大规模使用 Elasticsearch 类似的注意事项通常也适用于转换。如果遇到性能问题,请先确定瓶颈区域(搜索、索引、处理或存储),然后查看本指南中的相关注意事项以提高性能。了解转换的工作原理也很有帮助,因为不同的注意事项适用于转换是在连续模式下运行还是在批处理模式下运行。

在本指南中,您将学习如何

  • 了解配置选项对转换性能的影响。

先决条件

这些指南假设您有一个要调整的转换,并且您已经熟悉

以下注意事项并非按顺序排列 - 这些数字有助于在列表项之间导航;您可以按任何顺序对其中一项或多项采取行动。大多数建议适用于连续转换和批处理转换。如果列表项仅适用于一种转换类型,则会在描述中突出显示此例外情况。

每个建议标题末尾括号中的关键字表示可以通过遵循给定建议改进的瓶颈区域。

衡量转换性能编辑

为了优化转换性能,首先要确定工作量最大的区域。Kibana 中“转换”页面上的“统计信息”界面包含涵盖三个主要领域的信息:索引、搜索和处理时间(或者,您可以使用转换统计信息 API)。例如,如果结果显示大部分时间都花在了搜索上,那么请优先优化转换的搜索查询。转换还提供Rally 支持,可以在需要时对转换配置运行性能检查。如果您优化了关键因素但仍然遇到性能问题,您可能还需要考虑改进硬件。

1. 优化 frequency(索引)编辑

在连续转换中,frequency 配置选项设置检查源索引更改的时间间隔。如果检测到更改,则会搜索源数据,并将更改应用于目标索引。根据您的用例,您可能希望降低应用更改的频率。通过将 frequency 设置为更大的值(最大值为一小时),可以以数据更新速度较慢为代价,将工作负载分散到一段时间内。

2. 增加目标索引的分片数(索引)编辑

根据目标索引的大小,您可以考虑增加其分片数。默认情况下,转换在创建目标索引时使用一个分片。要覆盖索引设置,请在开始转换之前创建目标索引。有关分片数如何影响可扩展性和弹性的更多信息,请参阅可扩展性和弹性

使用预览转换来检查转换将用于创建目标索引的设置。您可以复制并调整这些设置,以便在开始转换之前创建目标索引。

3. 分析和优化您的搜索查询(搜索)编辑

如果您定义了转换源索引 query,请确保它尽可能高效。使用 Kibana 中“开发工具”下的“搜索分析器”来获取有关搜索请求中各个组件执行时间的详细信息。或者,您可以使用分析。结果可以让您深入了解搜索请求是如何在底层执行的,以便您了解为什么某些请求速度很慢,并采取措施改进它们。

转换执行标准的 Elasticsearch 搜索请求。编写 Elasticsearch 查询的方法有很多种,其中一些方法比其他方法更有效。请参阅_调整搜索速度_,以了解更多有关 Elasticsearch 性能调整的信息。

4. 限制源查询的范围(搜索)编辑

假设您的连续转换配置为按 IP 分组并计算 bytes_sent 的总和。对于每个检查点,连续转换都会检测自上一个检查点以来源数据中的更改,识别已为其提取新数据的 IP。然后,它会执行第二次搜索,过滤此 IP 组,以便计算总的 bytes_sent。如果第二次搜索匹配了许多分片,那么这可能会占用大量资源。请考虑限制源索引模式和查询将匹配的范围。

要限制访问哪些历史索引,请排除某些层(例如 "must_not": { "terms": { "_tier": [ "data_frozen", "data_cold" ] } })和/或在源查询中使用绝对时间值作为日期范围过滤器(例如,大于 2024-01-01T00:00:00)。如果使用相对时间值(例如,gte now-30d/d),则请确保应用日期舍入以利用查询缓存,并确保相对时间远大于 frequencytime.sync.delay 或日期直方图桶中的最大值,否则可能会丢失数据。不要使用小于日期值的日期过滤器(例如,lt:小于或 lte:小于或等于),因为这与每个检查点执行时应用的逻辑冲突,并且可能会丢失数据。

请考虑在索引名称中使用日期数学,以减少查询中需要解析的索引数量。在索引名称中添加日期模式(例如,yyyy-MM-dd),并使用它将查询限制在特定日期。下面的示例仅查询昨天和今天的索引

  "source": {
    "index": [
        "<mydata-{now/d-1d{yyyy-MM-dd}}*>",
        "<mydata-{now/d{yyyy-MM-dd}}*>"
    ]
  },

5. 优化源索引的分片策略(搜索)编辑

没有万能的分片策略。在一个环境中有效的策略在另一个环境中可能无法扩展。良好的分片策略必须考虑您的基础设施、用例和性能预期。

分片太少可能意味着无法实现分配工作负载的好处;但是,分片太多可能会影响集群的健康状况。要了解有关确定分片大小的更多信息,请阅读本指南

6. 调整 max_page_search_size(搜索)编辑

max_page_search_size 转换配置选项定义了每个搜索请求返回的桶数。默认值为 500。如果增加此值,您将获得更高的吞吐量,但会增加延迟和内存使用量。

此参数的理想值很大程度上取决于您的用例。如果您的转换执行内存密集型聚合(例如,基数或百分位数),那么增加 max_page_search_size 需要更多可用内存。如果超过内存限制,则会发生断路器异常。

7. 在源索引中使用索引字段(搜索)编辑

运行时字段和脚本字段不是索引字段;它们的值仅在搜索时提取或计算。虽然这些字段为如何访问数据提供了灵活性,但它们会增加搜索时的性能成本。如果使用运行时字段或脚本字段的转换性能是一个问题,您可能需要考虑改用索引字段。出于性能原因,我们不建议使用运行时字段作为同步连续转换的时间字段。

8. 使用索引排序(搜索、处理)编辑

索引排序允许您按特定顺序将文档存储在磁盘上,这可以提高查询效率。理想的排序逻辑取决于您的用例,但经验法则是按降序(基数从高到低)对字段进行排序,从基于时间的字段开始。索引排序只能在索引创建时定义一次。如果您要使用的源索引上还没有索引排序,请考虑将其重新索引到一个新的、已排序的索引。

9. 在目标索引上禁用 _source 字段(存储)编辑

_source 字段包含在索引时传递的原始 JSON 文档正文。_source 字段本身未编入索引(因此不可搜索),但仍存储在索引中并会产生存储开销。如果您的目标索引很大,请考虑禁用 _source 以节省存储空间。禁用 _source 只能在索引创建期间进行。

禁用 _source 字段后,将不支持许多功能。在禁用 _source 字段之前,请参阅禁用 _source 字段以了解后果。

延伸阅读编辑