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

上次更新时间:2020 年 8 月 10 日

我想要优化 Amazon Elasticsearch Service (Amazon ES) 中的索引操作,以便获得最大的提取吞吐量。我该如何操作?

解决方法

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

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

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

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

将 refresh_interval 提高到 60 秒或以上

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

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

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

将副本数量更改为零

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

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

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

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

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

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

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

缩小响应大小

要缩小 Amazon ES 响应的大小,请使用 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 操作的频率较低。由于 Amazon ES 刷新是资源密集型操作,因此,降低 translog 的频率可以提高索引性能。通过提高刷新阈值大小,Elasticsearch 集群还将会创建一些大型分段(而不是多个大型分段)。大型分段的合并频率较低,因此,更多的线程将用于索引而不是合并。

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

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

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

es-endpoint index-name 替换为相应的变量。

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

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

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

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

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

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

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

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

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


这篇文章对您有帮助吗?


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