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

2 分钟阅读
0

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

解决方法

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

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

索引的分片数 = k *(数据节点数量),其中 k 是每个节点的分片数量

例如,如果索引中有 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 -XPOST "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 -XPOST "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 _XGET "os-endpoint/index-name/_stats/flush?pretty"

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


相关信息

Amazon OpenSearch Service 最佳实践

AWS 官方
AWS 官方已更新 3 年前