如何改善 Amazon OpenSearch Service 叢集的索引效能?

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

我想在 Amazon OpenSearch Service (Amazon Elasticsearch 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) 磁碟區的執行個體提供更好的擷取效能。如需詳細資訊,請參閱使用 I3 執行個體在 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。確認結果之後,請將變更套用至索引範本。


此文章是否有幫助?


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