天天看點

Elasticsearch搜尋引擎之緩存:Request Cache

1、什麼是 request cache:

Request Cache,全稱是 Shard Request Cache,即分片級請求緩存。當對一個或多個索引發送搜尋請求時,搜尋請求首先會發送到ES叢集中的某個節點,稱之為協調節點;協調節點會把該搜尋請求分發給其他節點并在相應分片上執行搜尋操作,我們把分片上的執行結果稱為“本地結果集”,之後,分片再将執行結果傳回給協調節點;協調節點獲得所有分片的本地結果集之後,合并成最終的結果并傳回給用戶端。

By default, the requests cache will only cache the results of search requests where size=0, so it will not cache hits, but it will cache hits.total, aggregations, and suggestions.Most queries that use now (see Date Mathedit) cannot be cached.

Request Cache 在每個分片上緩存了本地結果集,這使得頻繁使用的搜尋請求幾乎立即傳回結果。預設情況下隻會緩存查詢中參數 size=0 的搜尋請求的結果,是以将不會緩存hits,但會緩存 hits.total,aggregations(聚合) 和 suggestions。是以,request cache 分片請求緩存非常适合日志用例場景,在這種情況下,資料不會在舊索引上更新,并且可以将正常聚合保留在高速緩存中以供重用。

2、request cache 緩存的失效:

ES 能夠保證在使用與不使用 Request Cache 情況下的搜尋結果一緻,那 ES 是如何保證的呢?這就要通過 Request Cache 的失效機制來了解啦。

Request Cache 緩存失效是自動的,當索引 refresh 時就會失效,也就是說在預設情況下, Request Cache 是每1秒鐘失效一次,但需要注意的是,隻有在分片的資料實際上發生了變化時,重新整理分片緩存才會失效。也就是說當一個文檔被索引 到 該文檔變成Searchable的這段時間内,不管是否有請求命中緩存該文檔都不會被傳回。

是以我們可以通過 index.refresh_interval 參數來設定 refresh 的重新整理時間間隔,重新整理間隔越長,緩存的資料越多,當緩存不夠的時候,将使用LRU最近最少使用政策删除資料。

當然,我們也可以手動設定參數 indices.request.cache.expire 指定失效時間(機關為分鐘),但是基本上我們沒必要去這樣做,因為緩存在每次索引 refresh 時都會自動失效。

最後,我們也可以通過 API 手動清除 Request Cache,使用方式如下:

curl -XPOST '索引的IP:端口/索引名/_cache/clear?request_cache=true'

3、request cache 的使用與設定:

3.1、request cache 的使用:

預設情況下,Request Cache 是關閉的,我們可以在建立新的索引時啟用,例如:

curl -XPUT 伺服器IP:端口/索引名 -d
'{
  "settings": {
    "index.requests.cache.enable": true
  }
}'
           

也可以通過動态參數配置來進行設定:

curl -XPUT 伺服器IP:端口/索引名/_settings -d 
'{ 
    "index.requests.cache.enable": true 
}'
           

開啟緩存後,需要在搜尋請求中加上 request_cache=true 參數,才能使查詢請求被緩存,比如:

curl -XGET '伺服器IP:端口/索引名/_search?request_cache=true&pretty' -H 'Content-Type: application/json' -d
'{
  "size": 0,
  "aggs": {
    "popular_colors": {
      "terms": {
        "field": "colors"
      }
    }
  }
}'
           

兩個注意事項:

(1)第一:參數 size:0 必須強制指定才能被緩存,否則請求是不會緩存的,即使手動的設定request_cache=true

(2)第二:在使用 script 腳本執行查詢時,由于腳本的執行結果是不确定的(比如使用 random 函數或使用了目前時間作為參數),一定要指定 request_cache=false 禁用 Request Cache 緩存。

3.2、request cache 的設定:

Request Cache 作用域為 Node,在 Node 中的 Shard 共享這個Cache空間。預設最大大小為 JVM堆記憶體的1%。可以使用以下指令在 config / elasticsearch.yml 檔案中進行更改:

indices.requests.cache.size: 1%

Request Cache 是以查詢的整個DSL語句做為key的,是以如果要命中緩存,那麼查詢生成的DSL一定要一樣,即使修改了一個字元或者條件順序,都不能利用緩存,需要重新生成Cache。

3.3、request cache 大小的檢視方式:

GET /_stats/request_cache?human

GET /_nodes/stats/indices/request_cache?human

參考文章:https://blog.csdn.net/chennanymy/article/details/52504386

繼續閱讀