如何改善 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 秒內接收一或多個搜尋請求的索引,預設的重新整理間隔為一秒。如需更新預設間隔的詳細資訊,請參閱 Elastisearch 網站上的 _refresh API 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) 磁碟區的執行個體提供更好的擷取效能。如需詳細資訊,請參閱 Amazon OpenSearch Service 的 PB 級

減少回應大小

若要減少 OpenSearch Service 回應的大小,請使用 filter_path 參數排除不必要的欄位。請確定您未篩選出識別或重試失敗請求所需的任何欄位。這些欄位可能會依客戶而有所不同。

在下列範例中,index-name、type-name took 欄位被排除在回應中:

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。這表示當其達到 512 MB 時,會排清 translog。索引負載的權重決定了 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 次排清,花費了 17,690 毫秒:

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

若要增加排清閾值大小,請呼叫下列 API 操作:

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

在此範例中,排清閾值大小設定為 1024 MB,對於具有超過 32 GB 記憶體的執行個體來說是理想的選擇。

注意:為您的 OpenSearch Service 網域選擇適當的閾值大小。

再次執行 _stats API 操作,以查看排清活動是否變更:

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

注意:最佳實務是僅增加目前索引的 index.translog.flush_threshold_size。確認結果之後,請將變更套用至索引範本。

Amazon OpenSearch Service 是 Amazon Elasticsearch Service 的後繼者。


此文章是否有幫助?


您是否需要帳單或技術支援?