Posted at

Elasticsearchへのクエリが突然Failし始めた時の対処(fielddata cacheがデフォルト無限で泣いた話)

More than 3 years have passed since last update.

Elasticsearchにクエリ投げても突然応答しなくなるという事象が発生し、調査してみたので内容をシェア。


出たエラー

突然Elasticsearchのクエリがfailし始めて、Kibanaのグラフが応答しなくなったという話が上がる。。

1__tmux.jpg

ログ見てると、下記の用語が怪しいので調査


うちの環境だと、HEAP_SIZEを18gにしていたので、まさにこのエラーは、[indices.breaker.fielddata.limit]でひっかかっている。(18g*60%=10.8g...)

用語
内容

CircuitBreaker
OOM(OutOfMemory)を制御する為の機構
デフォルト値は下記
[indices.breaker.fielddata.limit]
The fielddata circuit breaker limits the size of fielddata to 60% of the heap, by default.
[indices.breaker.request.limit]
The request circuit breaker estimates the size of structures required to complete other parts of a request, such as creating aggregation buckets, and limits them to 40% of the heap, by default.
[indices.breaker.total.limit]
The total circuit breaker wraps the request and fielddata circuit breakers to ensure that the combination of the two doesn’t use more than 70% of the heap by default.

FielddataCache
Elasticsearchのクエリキャッシュ機構
デフォルト制限なし&削除(期限)なし


対処方法


暫定対応

APIでキャッシュをクリアする。

※クリア直後からElasticsearchへのクエリが反応しはじめる

$ curl -XPOST 'http://localhost:9200/_cache/clear' -d '{ "fielddata": "true" }'

{"_shards":{"total":1430,"successful":715,"failed":0}}


恒久対応

elasticsearch.ymlに下記設定を追加しサービス再起動


最適な値は正直わかっていないので、運用しながら要チューニング

indices.fielddata.cache.expire: 60m #default -1

indices.fielddata.cache.size: 30% #default 無限


現状のFielddataCacheサイズを知る


  • _allが全体

  • fielddata.memory_size_in_bytesが該当のサイズ

  • インデックス毎のサイズも見れる

#index毎

curl -XGET 'http://localhost:9200/_stats/fielddata/?fields=field1,field2&pretty'


所感

時系列データ突っ込んでいる場合は、結構あたる問題だと思うので、expireくらいはデフォルトでつけてもいいような気が、、

突然の事で辛かった。。


参照

https://www.elastic.co/guide/en/elasticsearch/guide/current/_limiting_memory_usage.html#circuit-breaker

http://igor.kupczynski.info/2015/04/06/fielddata.html

https://www.elastic.co/guide/en/elasticsearch/reference/1.5/cluster-nodes-stats.html