Elasticsearch 最佳化查詢中獲取欄位內容的方式,效能提升5倍!

大資料技術前線發表於2023-12-05

來源:銘毅天下Elasticsearch

1、背景

叢集配置為:8 個 node 節點,16 核 32G,索引 4 分片 1 副本。應用程式的查詢邏輯是按經緯度排序後找前 200 條文件。

  • 1、應用對查詢要求比較高,search 沒有慢查詢的狀態。
Elasticsearch 最佳化查詢中獲取欄位內容的方式,效能提升5倍!
  • 2、叢集壓測效能不能上去,cpu 使用未打滿,查詢的 qps 上不去,且有佇列堆積。
Elasticsearch 最佳化查詢中獲取欄位內容的方式,效能提升5倍!
Elasticsearch 最佳化查詢中獲取欄位內容的方式,效能提升5倍!
Elasticsearch 最佳化查詢中獲取欄位內容的方式,效能提升5倍!

2、最佳化方法

透過雲廠商核心組的同學抓取火焰圖發現,主要消耗在 fetch phrase 階段。

Elasticsearch 最佳化查詢中獲取欄位內容的方式,效能提升5倍!

ES 預設從_source 取,每次查詢都會讀取一行資料,並需要做解壓,如果對查詢耗時要求比較高,應當在查詢時關閉 store fields ,查詢語句 指定“stored_fields”: [“none”], 砍掉後設資料欄位,同時用 “docvalue_fields”: [“video_fact_id”], 指定只拉取需要的欄位,降低序列化跟網路傳輸開銷。約能提升40% 效能。

推薦DSL如下:
















GET /your_index/_search
{
 "query": {
   "match_all": {} // 或者是其他符合你需求的查詢
 },
 "stored_fields": ["none"], // 不獲取任何儲存的欄位
 "docvalue_fields": ["field1", "field2"] // 只獲取需要的doc value欄位
}

3、最佳化後效率

3.1 查詢耗時有進一步的提升

Elasticsearch 最佳化查詢中獲取欄位內容的方式,效能提升5倍!

3.2 壓測時cpu使用率和qps也有了明顯的上升

Elasticsearch 最佳化查詢中獲取欄位內容的方式,效能提升5倍!
Elasticsearch 最佳化查詢中獲取欄位內容的方式,效能提升5倍!

壓測最終的指標:最佳化前1800qps,最佳化後9200qps

4、最佳化根因分析

在最佳化前,由於Elasticsearch預設從_source欄位讀取資料,這導致每次查詢都需要讀取整行資料並進行解壓。這個過程不僅耗費CPU資源,還會增加響應時間,特別是當文件內容龐大時。

解壓操作是CPU密集型的,而在高負載情況下,這可能成為系統瓶頸,從而限制了查詢效能和吞吐量。

最佳化後,透過指定“stored_fields": ["none"],我們有效地排除了_source欄位的讀取和解壓過程,這顯著減少了每個查詢的CPU負載。

而使用“docvalue_fields”指定從列存中獲取欄位內容,沒有壓縮的轉換,進一步減少了資料處理的開銷。這種方法不僅降低了CPU的使用率,同時只提取必要的欄位也減少了了網路傳輸的負擔。

最終,透過這些最佳化措施,查詢的QPS(每秒查詢數)得到了顯著提升,從1800qps提高到9200qps,這在高效能應用場景中是一個巨大的飛躍。

更高的QPS意味著系統能夠更快地處理更多的查詢請求,提高了整體的吞吐量和效能。

5、小結

總結來說,透過精細地調整查詢策略和減少不必要的資料處理,我們可以顯著提升Elasticsearch的效能,這在處理大規模資料和高併發查詢的環境下尤為重要。

6、官方文件

5、作者介紹

金多安,Elastic 認證專家,Elastic資深運維工程師,死磕Elasticsearch知識星球嘉賓,星球Top活躍技術專家,搜尋客社群日報責任編輯

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70027827/viewspace-2998733/,如需轉載,請註明出處,否則將追究法律責任。