为索引速度调优集群
与开箱即用体验相比,以下配置在运行仅索引工作负载时,吞吐量提高了约 60%。此工作负载不包括搜索或其他场景。机器上只运行了 OpenSearch 服务器进程,而基准测试客户端则托管在不同的节点上。
执行环境由 AWS 云中的 Intel EC2 实例(r7iz.2xlarge)组成,所使用的工作负载是 OpenSearch Benchmark 中提供的 StackOverflow 数据集。
Java 堆大小
更大的 Java 堆大小对于索引很有用。将 Java 最小和最大堆大小设置为 RAM 大小的 50%,可以在 EC2 实例上显示更好的索引性能。
刷新事务日志阈值
参数 flush_threshold_size
的默认值为 512 MB。这意味着当事务日志达到 512 MB 时会被刷新。索引负载的权重决定了事务日志的刷新频率。当您增加 index.translog.flush_threshold_size
时,节点执行事务日志操作的频率会降低。由于刷新是资源密集型操作,因此降低事务日志的刷新频率可以提高索引性能。通过增加刷新阈值大小,OpenSearch 集群还会创建更少的大段而不是多个小段。大段合并的频率较低,并且更多的线程用于索引而不是合并。
对于纯索引工作负载,可以考虑将 flush_threshold_size
增加到 Java 堆大小的 25%,例如,以提高索引性能。
增加 index.translog.flush_threshold_size
也会增加事务日志完成所需的时间。如果分片失败,由于事务日志更大,恢复将需要更长时间。
在增加 index.translog.flush_threshold_size
之前,调用以下 API 操作以获取当前刷新操作统计信息
GET /<index>/_stats/flush?pretty
在输出中,注意刷新的次数和总时间。以下示例输出显示有 124 次刷新,耗时 17,690 毫秒
{
"flush": {
"total": 124,
"total_time_in_millis": 17690
}
}
要增加刷新阈值大小,请调用以下 API 操作
PUT /<index>/_settings
{
"index":
{
"translog.flush_threshold_size" : "1024MB"
}
}
在此示例中,刷新阈值大小设置为 1024 MB,这对于内存超过 32 GB 的实例来说是理想的。
为您的集群选择合适的阈值大小。
再次运行 stats API 操作,查看刷新活动是否发生变化
GET /<index>/_stats/flush
最佳实践是仅为当前索引增加 index.translog.flush_threshold_size
。确认结果后,将更改应用于索引模板。
索引刷新间隔
默认情况下,OpenSearch 每秒刷新一次索引。OpenSearch 只刷新在过去 30 秒内至少收到一个搜索请求的索引。
当您增加刷新间隔时,数据节点会发出更少的 API 调用。为了防止 429 错误,最佳实践是增加刷新间隔。
如果您的应用程序可以容忍增加文档索引和可见之间的时间量,您可以将 index.refresh_interval
增加到一个更大的值,例如 30s
,或者在纯索引场景中甚至禁用它,以提高索引速度。
索引缓冲区大小
如果节点正在执行大量索引操作,请确保索引缓冲区大小足够大。您可以将索引缓冲区大小设置为 Java 堆大小的百分比或字节数。在大多数情况下,JVM 内存的默认值 10% 足以。您可以尝试将其增加到 25% 以进一步改进。
并发合并
并发合并的最大数量由 max_merge_count
指定。`concurrentMergeScheduler` 在需要时控制合并操作的执行。合并在单独的线程中运行,当达到最大线程数时,后续合并将等待直到合并线程可用。在索引限流成为问题的情况下,请考虑将合并线程的数量增加到超出默认值。
分片分布
为确保分片均匀分布到您正在摄入数据的索引的数据节点上,请使用以下公式确认分片是否均匀分布
索引分片数 = k * (数据节点数),其中 k 是每个节点的分片数
例如,如果索引中有 24 个分片,并且有 8 个数据节点,则 OpenSearch 会为每个节点分配 3 个分片。
将副本计数设置为零
如果您预计会有大量索引操作,请考虑将 index.number_of_replicas
值设置为 0
。每个副本都会重复索引过程。因此,禁用副本可以提高集群性能。在大量索引完成后,重新激活复制的索引。
如果在禁用副本时节点发生故障,您可能会丢失数据。仅当您能容忍短时间的数据丢失时才禁用副本。
实验以找到最佳批量请求大小
从 5 MiB 到 15 MiB 的批量请求大小开始。然后缓慢增加请求大小,直到索引性能停止提升。
使用具有 SSD 实例存储卷(如 I3)的实例类型
I3 实例提供快速的本地非易失性内存高速(NVMe)存储。I3 实例比使用通用型 SSD (gp2) Amazon Elastic Block Store (Amazon EBS) 卷的实例提供更好的数据摄入性能。有关更多信息,请参阅 Amazon OpenSearch Service 的 PB 级规模。
减小响应大小
为了减小 OpenSearch 响应的大小,请使用 filter_path
参数排除不必要的字段。请确保您没有过滤掉任何识别或重试失败请求所需的字段。这些字段可能因客户端而异。
在以下示例中,响应中排除了 index-name
、type-name
和 took
字段。
POST /_bulk?pretty&filter_path=-took,-items.index._index,-items.index._type
{ "index" : { "_index" : "test2", "_id" : "1" } }
{ "user" : "testuser" }
{ "update" : {"_id" : "1", "_index" : "test2"} }
{ "doc" : {"user" : "example"} }
压缩编解码器
在 OpenSearch 2.9 及更高版本中,新增了两种用于压缩的编解码器:zstd
和 zstd_no_dict
。您可以选择在 index.codec.compression_level
设置中为它们指定压缩级别,取值范围为 [1, 6]。基准测试数据显示,与 default
编解码器相比,zstd
提供了 7% 更好的写入吞吐量,zstd_no_dict
提供了 14% 更好的吞吐量,同时存储性能提高了 30%。有关压缩的更多信息,请参阅索引编解码器。