ElasticSearch的search.max_buckets值1000限制问题
程序员文章站
2022-05-19 10:04:45
...
环境:ElasticSearch6.7
问题描述:
{ "error": { "root_cause": [], "type": "search_phase_execution_exception", "reason": "", "phase": "fetch", "grouped": true, "failed_shards": [], "caused_by": { "type": "too_many_buckets_exception", "reason": "Trying to create too many buckets. Must be less than or equal to: [10000] but was [10001]. This limit can be set by changing the [search.max_buckets] cluster level setting.", "max_buckets": 10000 } }, "status": 503 }
设置:这是6.x版本才有的特性,目的:限制大批量聚合操作,规避性能风险。
解决方案:setting里设置:search.max_buckets
问题分析:
这是因为查询结果在分片上找到的条目超过了限定的10000个,官网限制在10000是为了其性能考虑的。需要调大search.max_buckets这个参数。我们先来做如下一个测试:
测试
1、前提: search.max_buckets: 3
PUT /_cluster/settings
{"persistent": {"search.max_buckets": 3}}
2、插入了"A",“B”,“C”,“D” 4条数据
PUT /testBucket/_doc/1
{"term":"A"}
PUT /testBucket/_doc/2
{"term":"B"}
PUT /testBucket/_doc/3
{"term":"C"}
PUT /testBucket/_doc/4
{"term":"D"}
要分两种情况来说明:
2.1、 索引只有一个分片(分片可以自己在setting设置,)
这时候不管你设不设size,哪怕size=1都会报错!
原因就是上面说的那个,因为它在这个分片上找到的条目超过了限定的3个(实际有4个)
POST /testBucket/_search
{"aggs":{"term":{"terms":{"field":"term","size":2}}}
2.2、 如果这个索引有5个分片,数据分散在各个分片上面
index shard prirep state docs store ip node
a 1 p STARTED 1 3kb 127.0.0.1 es0
a 3 p STARTED 1 3kb 127.0.0.1 es0
a 4 p STARTED 1 3kb 127.0.0.1 es0
a 2 p STARTED 0 208b 127.0.0.1 es0
a 0 p STARTED 1 3kb 127.0.0.1 es0
这时如果你设size=2,就不会报错。
因为还没有等它找完全部分片,他就找到了你想要的2个,就返回了。
如果你不设size,或者设一个大值size=10,它就必须找完全部分片,
这时就会遇到限定3,就会报错
所以这和你的数据在分片上的分布有关,
解决办法还是加大search.max_buckets
所以最初问题的解决方法是:
PUT /_cluster/settings
{"persistent": {"search.max_buckets": 20000}}
如果还不够,你你把它调大到1000000000应该是可以了( ﹁ ﹁ ) ~→
官网地址:
https://www.elastic.co/guide/en/elasticsearch/reference/master/search-aggregations-bucket.html