写点什么

记一次 ElasticSearch 线上异常排查

作者:李爽
  • 2024-04-24
    上海
  • 本文字数:1897 字

    阅读完需:约 6 分钟

现象

最近在无版本变动等的情况下,后台日志突然报相关异常

ex=[es/search] failed: [search_phase_execution_exception] all shards failed

基金查询相关业务服务受到影响


排查过程


第一轮排查尝试

分析思考

1、由于线上 ElasticSearch 集群所在服务器部署有其他服务,之前曾经发生过资源不足导致 ElasticSearch 宕掉的现象,笔者的第一反应是 ElasticSearch 进程挂掉,于是登录相关服务器,但发现 ElasticSearch 进程运行正常,服务器资源充足, 开始思考下一问题的可能原因。


2、笔者进一步思考,由于之前曾经监控过同一集群其他索引的,相关监控并未发现预警,所以笔者认为可能是该索引的构建出了问题,导致改索引存在问题(该索引每天凌晨重新构建),其他同事重新构建相关服务后人,相关报错任然存在。同时笔者登陆 Kibana 查看索引状态,发现索引状态为 green,并未像异常描述的那样 " all shards failed "


GET _cat/indices/fund_data?v&format=json
复制代码


[  {    "health" : "green",    "status" : "open",    "index" : "fund_data_2",    "uuid" : "vibS0AznRlO1di0n03xfSA",    "pri" : "1",    "rep" : "1",    "docs.count" : "221570",    "docs.deleted" : "1",    "store.size" : "253.2mb",    "pri.store.size" : "127mb"  }]
复制代码

到此地步,问题似乎陷入僵局。


第二轮排查


1、笔者在搜索引擎上搜索相关异常,发现可能并非索引状态存在问题,而可能是查询语句存在问题,或者索引字段与查询语句不相匹配导致的


咨询负责该索引构建的同事发现: 出问题索引的 Mapping 并非在索引构建前设定,而是使用 ElasticSearch 自动生成索引 Mapping 的机制(动态映射,dynamic mapping ),于是笔者高度怀疑随着数据的变化,以及每天索引的构建,很可能导致索引字段的某一字段类型发送了变化,从而使得查询语句失效引发问题,但如何定位相关问题呢?


笔者对比了测试环境该索引的 Maping 和生产环境该索引的 Maping ,发现并无太太问题,只不过部分字段名称有所差异(后续发现这其实是个问题)。 于是笔者怀疑是 DSL 查询语句出了问题(但也觉得概率比较小,因为最近并无版本发布)


2、为了精确定位问题,笔者在后台日志中输出了 相关查询的 DSL 语句


POST /fund_data/_search?typed_keys=true {  "from": 0,  "size": 10,  "sort": [    {      "totalAsset": {        "order": "desc"      }    }  ],  "track_total_hits": true}
复制代码

在 Kibana 中执行后报错


{  "error" : {    "root_cause" : [      {        "type" : "query_shard_exception",        "reason" : "No mapping found for [totalAsset] in order to sort on",        "index_uuid" : "vibS0AznRlO1di0n03xfSA",        "index" : "fund_data_2"      }    ],    "type" : "search_phase_execution_exception",    "reason" : "all shards failed",    "phase" : "query",    "grouped" : true,    "failed_shards" : [      {        "shard" : 0,        "index" : "fund_data_2",        "node" : "q0NEejnUR-aH6BaBd7dwFA",        "reason" : {          "type" : "query_shard_exception",          "reason" : "No mapping found for [totalAsset] in order to sort on",          "index_uuid" : "vibS0AznRlO1di0n03xfSA",          "index" : "fund_data_2"        }      }    ]  },  "status" : 400}
复制代码


自此,定位了相关问题,原来因为换季的原因,上游业务逻辑未生成基金的相关 totalAsset,导致该字段的数据全部为空,在索引构建时,就缺失个该字段,从而引发相关问题,上游业务调整后,确保 totalAsset 字段不再为空,该问题迎刃而解。


思考总结


1、遇到问题要冷静,先清晰思考:


笔者凭既往经验首先怀疑 ES 集群出了相关问题,其实大可不必,因为相关监控并未报出 ES 报错,对其他索引的监控也未显示集群存在问题,所以第一轮排查过程本无必要,应该思考后将问题框定在该索引及其查询语句的问题范围内。


2、正确认知 ES 的异常

Kibana 执行 DSL 语句相关异常

 "reason" : {          "type" : "query_shard_exception",          "reason" : "No mapping found for [totalAsset] in order to sort on",          "index_uuid" : "vibS0AznRlO1di0n03xfSA",          "index" : "fund_data_2"        }
复制代码

日志输出的是

ex=[es/search] failed: [search_phase_execution_exception] all shards failed

这一日志导致导致无法及时定位问题。


3、后续经验:


对于类似问题,可以参考以下步骤


  • 查看索引状态 : GET _cat/indices/fund_data?v&format=json

  • 输出 DSL 语句

  • 在 Kibana 中执行相关语句,查看更明确的异常。


发布于: 刚刚阅读数: 4
用户头像

李爽

关注

还未添加个人签名 2018-08-11 加入

还未添加个人简介

评论

发布
暂无评论
记一次ElasticSearch线上异常排查_elasticsearch_李爽_InfoQ写作社区