如何提高我的 Amazon OpenSearch Service 集群上的索引性能?

上次更新日期: 2021 年 7 月 30 日

我想要优化 Amazon OpenSearch Service 中的索引操作,以便获得最大的摄入吞吐量。我该如何操作?

解决方法

确保您正在提取的索引的分区均匀分布在各数据节点中。

使用以下公式来确认分区是否均匀分布:

Number of shards for index = k * (number of data nodes), where k is the number of shards per node

例如,如果索引中有 24 个分区且有八个数据节点,则 OpenSearch Service 将会为每个节点分配三个分区。有关更多信息,请参阅开始使用 Amazon OpenSearch Service:我需要多少个分区?

将 refresh_interval 提高到 60 秒或以上

刷新 OpenSearch Service 索引,使您的文档可用于搜索。请注意,刷新索引需要的资源与索引线程使用的资源相同。

默认刷新间隔为一秒。当您提高刷新间隔时,数据节点会进行较少的 API 调用。您可以缩短或延长刷新间隔,具体取决于刷新间隔的长度。要防止出现 429 错误,最佳实践是延长刷新间隔。

注意:对于在最近 30 秒内收到一个或多个搜索请求的索引,默认刷新间隔为一秒。有关更新的默认间隔的更多信息,请参阅 Elasticsearch 网站上的 _refresh API version 7.x

将副本数量更改为零

如果您预测有繁重索引,请考虑将 index.number_of_replicas 值设置为“0”。 每个副本将重复索引过程。因此,禁用副本将会提高您的集群性能。繁重索引完成之后,请重新激活重复的索引。

重要提示:如果某个节点在副本被禁用时发生故障,您可能会失去数据。仅当您可以容忍短时间数据丢失时才禁用副本。

找到最佳批量请求大小的实验

从批量请求大小为 5MiB 到 15MiB。然后,缓慢增加请求大小,直到索引性能停止改进。有关更多信息,请参阅 Elasticsearch 网站上的使用并调整批量请求大小

注意:有些实例类型将批量请求限制为 10MiB。有关更多信息,请参阅网络限制

使用具有 SSD 实例存储卷(如 I3)的实例类型

I3 实例可提供本地快速存储标准 (NVMe) 存储。I3 实例提供的摄入性能高于使用通用型 SSD (gp2) Amazon Elastic Block Store (Amazon EBS) 卷的实例。有关更多信息,请参阅适用于 Amazon OpenSearch Service 的 PB 级

缩小响应大小

要缩小 OpenSearch Service 响应的大小,请使用 filter_path 参数以排除不必要的字段。请确保您没有筛选掉任何识别或重试失败请求所需的字段。这些字段可能因客户端不同而不同。

在以下示例中,index-nametype-nametook 字段被排除在响应之外:

curl -X POST "es-endpoint/index-name/type-name/_bulk?pretty&filter_path=-took,-items.index._index,-items.index._type" -H 'Content-Type: application/json' -d'
{ "index" : { "_index" : "test2", "_id" : "1" } }
{ "user" : "testuser" }
{ "update" : {"_id" : "1", "_index" : "test2"} }
{ "doc" : {"user" : "example"} }

有关更多信息,请参阅缩小响应大小

提高 index.translog.flush_threshold_size 的值

默认情况下,index.translog.flush_threshold_size 被设置为 512 MB。这表示当 translog 达到 512 MB 时会被刷新。索引负载的重要决定 translog 的频率。当您提高 index.translog.flush_threshold_size 时,节点执行 translog 操作的频率较低。由于 OpenSearch Service 刷新是资源密集型操作,因此,降低 translog 的频率可以提高索引性能。通过提高刷新阈值大小,OpenSearch Service 集群还将会创建少数大分段(而不是多个小分段)。大分段的合并频率较低,因此会将更多的线程将用于索引而不是合并。

注意:index.translog.flush_threshold_size 的提高还可能会延长完成一次 translog 的时间。如果某个分区失败,由于 translog 较大,恢复需要的时间更长。

提高 index.translog.flush_threshold_size 之前,调用以下 API 操作来获取当前刷新操作的统计数据:

$ curl 'os-endpoint/index-name/_stats/flush?pretty'

os-endpointindex-name 替换为相应的变量。

在输出中,记下刷新次数和总时间。以下示例输出显示进行了 124 次刷新,耗费时间 17690 毫秒:

"flush" { "total" : 124, "total_time_in_millis" : 17690 }

要增加刷新阈值大小,请调用以下 API 操作:

$ curl -XPUT 'os-endpoint/index-name/_settings?pretty' -d '{"index":{"translog.flush_threshold_size" : "1024MB"}}'

在此示例中,刷新阈值大小设置为 1024MB,这非常适合内存超过 32GB 的实例。

注意:请为 OpenSearch Service 域选择适当的阈值大小。

再次运行 _stats API 操作以查看刷新活动是否变化:

$ curl 'os-endpoint/index-name/_stats/flush?pretty'

注意:最佳实践是只增加当前索引的 index.translog.flush_threshold_size。确认结果之后,再将更改应用至索引模板。

Amazon OpenSearch Service 是 Amazon Elasticsearch Service 的后继者。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?