es查詢性能優化


  1. filesystem cache

  2. 數據預熱

  3. 冷熱分離

  4. document 模型設計

  5. 分頁性能優化

1、filesystem cache

往 es 里寫的數據,實際上都寫到磁盤文件里去了,**查詢的時候**,操作系統會將磁盤文件里的數據自動緩存到 `filesystem cache` 里面去

es 的搜索引擎嚴重依賴於底層的 `filesystem cache`,你如果給 `filesystem cache` 更多的內存,盡量讓內存可以容納所有的 `idx segment file ` 索引數據文件,那么你搜索的時候就基本都是走內存的,性能會非常高。

歸根結底,要讓 es 性能要好,最佳的情況下,就是你的機器的內存,至少可以容納你的總數據量的一半。

比如說現在有一行數據。`id,name,age ....` 30 個字段。但是現在搜索,只需要根據 `id,name,age` 三個字段來搜索。僅僅寫入 es 中要用來檢索的**少數幾個字段**就可以了,比如說就寫入 es `id,name,age` 三個字段,然后你可以把其他的字段數據存在 mysql/hbase 里,一般是建議用 `es + hbase` 這么一個架構。

hbase 的特點是**適用於海量數據的在線存儲**,就是對 hbase 可以寫入海量數據,但是不要做復雜的搜索,做很簡單的一些根據 id 或者范圍進行查詢的這么一個操作就可以了。從 es 中根據 name 和 age 去搜索,拿到的結果可能就 20 個 `doc id`,然后根據 `doc id` 到 hbase 里去查詢每個 `doc id` 對應的**完整的數據**,給查出來,再返回給前端。

寫入 es 的數據最好小於等於,或者是略微大於 es 的 filesystem cache 的內存容量。然后你從 es 檢索可能就花費 20ms,然后再根據 es 返回的 id 去 hbase 里查詢,查 20 條數據,可能也就耗費個 30ms

 

2、數據預熱

假如說,哪怕是你就按照上述的方案去做了,es 集群中每個機器寫入的數據量還是超過了 `filesystem cache` 一倍,比如說你寫入一台機器 60G 數據,結果 `filesystem cache` 就 30G,還是有 30G 數據留在了磁盤上。

其實可以做**數據預熱**。

可以將平時查看最多的一些商品,比如說 iphone 8,熱數據提前后台搞個程序,每隔 1 分鍾自己主動訪問一次,刷到 `filesystem cache` 里去。

對於那些你覺得比較熱的、經常會有人訪問的數據,最好**做一個專門的緩存預熱子系統**,就是對熱數據每隔一段時間,就提前訪問一下,讓數據進入 `filesystem cache` 里面去。這樣下次別人訪問的時候,性能一定會好很多。

 

冷熱分離

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM