Elasticsearch 查询504

379 阅读2分钟

前提

团队做基于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条,我估计这个执行语句执行后桶大概都有几十万个...还排序分页展示.....无力吐槽...