我想在 Amazon OpenSearch Service 中最佳化索引操作,以獲得最大的擷取輸送量。該如何進行?
解決方案
確保碎片均勻分佈在您要擷取的目的地索引的資料節點上
使用下列公式來確認碎片均勻分佈:
索引的碎片數 = k * (資料節點的數量),其中 k 是每個節點的碎片數
例如,如果索引中有 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 -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。這表示當其達到 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 -XPOST "os-endpoint/index-name/_stats/flush?pretty"
將 os-endpoint 和 index-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 _XGET "os-endpoint/index-name/_stats/flush?pretty"
**注意:**最佳實務是僅增加目前索引的 index.translog.flush_threshold_size。確認結果之後,請將變更套用至索引範本。
相關資訊
Amazon OpenSearch Service 的最佳實務