微吼云上線多路互動直播服務 加速多場景互動直播落地
932
2025-03-31
1.1 使用更快的硬件
查詢性能大部分場景下更多的在于IO能力,很多時候查詢速度受限于磁盤IO能力,使用SSD會比旋轉類存儲介質好得多。
如果查詢類型屬于計算比較多的,則可以考慮使用更快的CPU。
1.2 為文件系統cache預留足夠的內存
在一般情況下,讀寫都會被操作系統cache,cache保存在系統物理內存中。命中cache可以降低對磁盤的直接訪問頻率。查詢依賴對cache的命中,如果某個請求需要從磁盤讀取數據,則一定會產生相對較高的延遲。
應該至少為系統cache預留一半的可用物理內存,更大的內存有更高的cache命中率。
1.3 Mappings優化
請確認mappings設置是否合理。
1.???????? 對于只需要精確查詢的字段,例如時間戳,應該設置為keyword。
2.???????? 對需要進行全文檢索的字段設置合理的分詞器,不同的分詞器查詢效率相差較大。
1.4 強制段合并歷史索引
為不再更新的歷史索引執行force merge,講Lucene索引合并為單個分段,可以提高查詢速度。當一個Lucene索引存在多個分段時,每個分段會單獨執行查詢再講結果合并,將只讀索引強制合并成一個Lucene分段不僅可以優化查詢過程,對索引恢復速度也是有好處的。
curl -XPOST --tlsv1.2 --negotiate -k -u : 'https://ip:httpport/_all/_forcemerge?only_expunge_deletes=false&max_num_segments=1&flush=true&pretty'
1.5 過濾查詢(filter)
elasticsearch的查詢操作分為2種:查詢(query)和過濾(filter),查詢(query)默認會計算每個返回文檔的得分,然后根據得分排序;而過濾(filter)只會篩選出符合的文檔,并不計算得分,且可以緩存文檔。
對于非全文檢索的使用場景,如果不關心查詢結果和查詢條件的相關度,只是想查找目標數據,可以使用filter來提高查詢效率。
1.6 路由(routing)
elasticsearch寫入文檔時,文檔會通過一個公式路由到一個索引中的一個分片上。默認公式如下:
shard_num = hash(_routing) % num_primary_shards
_routing字段的取值,默認是_id字段,可以根據業務場景設置經常查詢的字段作為路由字段。例如可以考慮將用戶id、地區作為路由字段,查詢時可以過濾不必要的分片,加快查詢速度。
1.7 游標查詢(scroll)
Elasticsearch為了避免深分頁,不允許使用分頁(from&size)查詢10000條以后的數據,需要使用游標(scroll)查詢。
優化scroll:在一般場景下,scroll用來取得排序好的大量數據,但很多時候只需要返回數據,這時候可以對scroll進行優化。使用_doc去sort返回的結果不會有排序,此時執行效率最快。
1.8 避免使用wildcard模糊匹配查詢
Elasticsearch默認支持通過*?正則表達式來做模糊匹配,數據量級別達到TB+甚至更高之后,模糊匹配查詢通常會耗時比較長,甚至可能導致內存溢出,卡死乃至崩潰宕機的情況。所以數據量大的情況下,不要使用模糊匹配查詢。
1.9 調節查詢請求中的batched_reduce_size
該字段是查詢請求中的一個參數。默認情況下,聚合操作在協調節點需要等待所有的分片都取回結果后才執行,使用batched_reduce_size參數可以不等待全部分片返回結果,而是在指定數量的分片返回結果之后就可以先處理一部分(reduce)。這樣可以避免協調節點在等待全部結果的過程中占用大量內存,避免極端情況下可能導致OOM。該字段的默認值為512。
1.10 使用自適應副本選擇(ARS)
為了充分利用計算資源和負載均衡,協調節點將查詢請求輪詢轉發到分片的每個副本,輪詢策略是負載均衡過程中最簡單的策略。
Elasticsearch實現了可以評估出副本所在節點的壓力和健康程度,這就可以讓我們選出一個能夠更快返回搜索請求的節點??梢酝ㄟ^命令動態開啟:
cluster.routing.use_adaptive_replica_selection:true
1.11 聚合查詢優化
大多時候對單個字段的聚合查詢還是比較快的,但是當需要聚合多個字段時,就會產生大量的分組,最終結果就是占用Elasticsearch大量的內存,從而導致內存溢出的情況發生。盡量根據業務優化,減少聚合次數。
1.11.1 默認深度優先聚合改為廣度優先聚合
添加設置:"collect_mode": "breadth_first"。
depth_first? :直接進行子聚合的計算。
breadth_first? :先計算出當前聚合的結果,針對這個結果在對子聚合進行計算。
1.11.2 優化聚合執行方式
在每一層terms aggregation內部加一個 “execution_hint”: “map”。
添加設置:"execution_hint": "map"。
1.???????? 查詢結果直接放入到內存中構建map,在查詢結果集小的場景下,速度極快;
2.???????? 但如果查詢結果集合很大(百萬-億級別)的時候,傳統聚合方式會比map方式快。
1.11.3 預熱全局序號
全局序號是一種數據結構,用于在keyword字段上運行terms聚合。它用一個數值來代表字段中的字符串值,然后為每一個數值分配一個bucket。這需要一個對全局序號和bucket的構建過程。默認情況下,它們被延遲構建,因為Elasticsearch不知道哪些字段將用于terms聚合,哪些字段不會??梢酝ㄟ^配置mapping在refresh時告訴Elasticsearch預先加載全局序號:
"mappings":?{? ?"type":?{? ?"properties":?{? ?"foo":{? ?"type":?"keyword",? ?"esager_global_ordinals":true }? ?}? ?}? ?}
FusionInsight Elasticsearch EI企業智能
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。