前提
团队做基于ES服务的稳定性测试,对某个索引插入了5kw数据,在问题暴露之前做过聚合,查询。后面对该索引查询,直接出现 504
{
"statusCode": 504,
"error": "Gateway Time-out",
"message": "Client request timeout"
}
排查
我当时接到问题,第一时间看集群是不是出问题了,结果显示集群还处理正常(绿)
然后查分片,看是不是有未配的,结果也全都正常
难搞的是我还不知道是哪条查询语句导致的问题.... 测试早已经跑完了,研发过了半天才说ES查询504
不过在ES的日志里面发现如下错误
No search context found for id [987]
unable to find any unassigned shards to explain [ClusterAllocationExplainRequest[useAnyUnassignedShard=true,includeYesDecisions?=false
All shards failed for phase: [dfs]
Failed to execute query phase
这些错误去网上查,但是跟我都不太匹配
然后上 GET /_cluster/allocation/explain 命令,结果这回不太好用,忘记当时把输出保留了
网上查询资料,找到几个API, 用户查询查询被拒绝情况
GET _cat/thread_pool/bulk?s=queue:desc&v
GET _cat/thread_pool/search?s=queue:desc&v
确认后,确实发现确实存在查询被拒的情况,但是又不知道如何继续了
然后去群里获取帮助,得到查询热线程的API,一查,结果发现一直有聚合的线程在运行,但是CPU并没有飙的很高 点击可查看更多 热线程资料
GET /_nodes/hot_threads
GET _cat/nodes?v&s=cpu:desc
GET _nodes/{node_ip}/hot_threads
这个聚合的线程而且还能跟我在日志里看到的另一部分贴合
This aggregation creates too many buckets (10001) and will throw an error in future versions. You should update the [search.max_buckets] cluster setting or use the [composite] aggregation to paginate all buckets in multiple requests
然后我去找了相关资料,我 max_buckets 修改大了, 修改语句
PUT _cluster/settings
{
"persistent": {
"search": {
"max_buckets": 35000
}
}
}
修改完后,结果一会查询拒绝的情况就好了,ES也能正常提供查询了
在我还在继续跟进原因时,同事说又出问题了,这回倒是给了一个执行语句
GET ***_record/_search
{
"size": 0,
"query": {
"term": {
"isOverWeight": {
"value": "true"
}
}
},
"aggs": {
"groupByTruckNo": {
"terms": {
"field": "truckNo",
"min_doc_count": 1,
"size": 10000
},
"aggs": {
"page": {
"bucket_sort": {
"sort": [],
"from": 10,
"size": 30
}
},
"fetch_source": {
"top_hits": {
"size": 1,
"_source": [
"truckColor",
"truckNo",
"detectTime"
],
"sort": [
{
"detectTime": {
"order": "desc"
}
}
]
}
}
}
}
}
}
我一看到 聚合桶里面 size 是10000时,我突然恍然大悟....没这么干的啊,而且啥需求只要有一个记录就返回一个桶。然后马上找相关研发反馈,让他们跟产品去聊。
因为我看了下,过滤出来的数据700w条,最大的桶才16条,我估计这个执行语句执行后桶大概都有几十万个...还排序分页展示.....无力吐槽...