Elasticsearch 緩存總結


一、Query Cache
Query Cache也稱為Filter Cache,顧名思義它的作用就是對一個查詢中包含的過濾器執行結果進行緩存。
比如我們常用的term,terms,range過濾器都會在滿足某種條件后被緩存,注意,這里的bool過濾器是不會被緩存的,但bool過濾器包含的子query clause會被緩存,我們可以用下面的命令來查詢Query Cache的情況。

http://192.168.0.109:9200/_stats/query_cache?pretty&human 

舉個栗子,看下面的查詢

{
  "from": 0,
  "size": 5,
  "query": {
    "bool": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "productID": "JODL-X-1937-#pV7"
              }
            },
            {
              "range": {
                "price": {
                  "from": 20,
                  "to": null,
                  "include_lower": true,
                  "include_upper": true
                }
              }
            }
          ]
        }
      }
    }
  }
}

1. Node Query Cache
根據名稱其實就能理解,這是屬於Node級別的緩存。主要用於緩存Filter中的Query結果,基於LRU策略,當緩存滿了的情況下,會自動去除一個最近最少被使用的Query Cache。
1.1. 緩存結構
緩存分為兩個級別,第一級是Query ,第二級是Segmemt,就像是Map<Query, Map<Segment, DocIdSet>>這種結構一樣。DocIdSet 使用的數據結構是Bitset。
1.2. 重要參數介紹
indices.queries.cache.size 集群中的每個節點都必須有的靜態配置,用來控制用來緩存的內存大小,默認是10%,支持兩種格式一種是百分數,代表占節點heap的百分比,另一種則是精確的值,比如512mb。
indices.queries.cache.count 在官方文檔並沒有寫,這是一個節點級別的配置,可以在elasticsearch.yml中配置,控制緩存的總數量。
indices.queries.cache.all_segments 用於是否在所有 Segment上啟用緩存,默認是false,不會對文檔數小於100000或者小於整個索引大小的3%的Segment進行緩存。
index.queries.cache.enabled 是屬於index級別的配置,用來控制是否啟用緩存,默認是開啟的。
1.3. 什么樣的Query會被緩存
對於TermQuery、MatchAllDocsQuery等這種查詢都不被緩存。當BooleanQuey的字節點為空時不會被緩存,當Dis Max Query的Disjuncts為空時不會被緩存。
對於歷史查詢次數有要求,對於消耗高昂的Query只需要2次就加入緩存,其他的默認是5次,對於BooleanQuery和DisjunctionMaxQuery次數為4次。默認的,這個歷史查詢的數量是256。
1.4. 什么樣的segment會被緩存
Segment中文檔數大於100000或者大於整個所以大小的3%。
請注意如果想要索引所有段,請設置indices.queries.cache.all_segments
1.5. 新索引的文檔,緩存會失效或者重新構建嗎
緩存不會失效,而是通過判斷文檔是否符合Query的條件,如果符合條件的話則會將文檔加入到Bitset中。
2. Field data Cache
主要用於sort以及aggs的字段。這會把字段的值加載到內存中,以便於快速訪問。field data cache的構建非常昂貴,因此最好能分配足夠的內存以保障它能長時間處於被加載的狀態。一定要注意數據建模,對於不合理的字段啟用field data cache代價非常大,而且性能特別差。indices.fielddata.cache.size用來控制緩存的大小,支持兩種格式,一種是百分數,代表占節點heap的百分比,另一種是精確值,如10gb,默認是無限。
3. Shard Request Cache
顧名思義,Shard級別的緩存。默認的主要用於緩存size=0的請求,aggs和suggestions,還有就是hits.total。需要注意,每當分片索引refresh的時候,如果數據發生了實際變化,那么緩存就會自動失效。所以呢,refresh時間越長,那么緩存的時間也就越長。緩存采用的也是LRU策略。緩存是以請求的JSON為Key來進行存儲的,那么也就是說,當同樣含義的不同形式的請求將無法識別緩存。

  • 3.1. 索引級別禁用緩存:index.requests.cache.enable這個參數用來控制是否啟用分片級別的緩存,默認是false
  • 3.2. 請求時禁用緩存:通過url傳參方式request_cache=true
  • 3.3. 主要的緩存配置:indices.requests.cache.size 用來控制緩存在heap中的大小,默認是1%。

4. Indexing Buffer
用於緩存新索引的數據,用於緩存新索引的數據,當空間填滿之后,會將數據寫到磁盤上成為一個新的段。


免責聲明!

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



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