记一次 ElasticSearch 线上异常排查
现象
最近在无版本变动等的情况下,后台日志突然报相关异常
ex=[es/search] failed: [search_phase_execution_exception] all shards failed
基金查询相关业务服务受到影响
排查过程
第一轮排查尝试
分析思考
1、由于线上 ElasticSearch 集群所在服务器部署有其他服务,之前曾经发生过资源不足导致 ElasticSearch 宕掉的现象,笔者的第一反应是 ElasticSearch 进程挂掉,于是登录相关服务器,但发现 ElasticSearch 进程运行正常,服务器资源充足, 开始思考下一问题的可能原因。
2、笔者进一步思考,由于之前曾经监控过同一集群其他索引的,相关监控并未发现预警,所以笔者认为可能是该索引的构建出了问题,导致改索引存在问题(该索引每天凌晨重新构建),其他同事重新构建相关服务后人,相关报错任然存在。同时笔者登陆 Kibana 查看索引状态,发现索引状态为 green,并未像异常描述的那样 " all shards failed "
到此地步,问题似乎陷入僵局。
第二轮排查
1、笔者在搜索引擎上搜索相关异常,发现可能并非索引状态存在问题,而可能是查询语句存在问题,或者索引字段与查询语句不相匹配导致的。
咨询负责该索引构建的同事发现: 出问题索引的 Mapping 并非在索引构建前设定,而是使用 ElasticSearch 自动生成索引 Mapping 的机制(动态映射,dynamic mapping ),于是笔者高度怀疑随着数据的变化,以及每天索引的构建,很可能导致索引字段的某一字段类型发送了变化,从而使得查询语句失效引发问题,但如何定位相关问题呢?
笔者对比了测试环境该索引的 Maping 和生产环境该索引的 Maping ,发现并无太太问题,只不过部分字段名称有所差异(后续发现这其实是个问题)。 于是笔者怀疑是 DSL 查询语句出了问题(但也觉得概率比较小,因为最近并无版本发布)
2、为了精确定位问题,笔者在后台日志中输出了 相关查询的 DSL 语句
在 Kibana 中执行后报错
自此,定位了相关问题,原来因为换季的原因,上游业务逻辑未生成基金的相关 totalAsset,导致该字段的数据全部为空,在索引构建时,就缺失个该字段,从而引发相关问题,上游业务调整后,确保 totalAsset 字段不再为空,该问题迎刃而解。
思考总结
1、遇到问题要冷静,先清晰思考:
笔者凭既往经验首先怀疑 ES 集群出了相关问题,其实大可不必,因为相关监控并未报出 ES 报错,对其他索引的监控也未显示集群存在问题,所以第一轮排查过程本无必要,应该思考后将问题框定在该索引及其查询语句的问题范围内。
2、正确认知 ES 的异常
Kibana 执行 DSL 语句相关异常
日志输出的是
ex=[es/search] failed: [search_phase_execution_exception] all shards failed
这一日志导致导致无法及时定位问题。
3、后续经验:
对于类似问题,可以参考以下步骤
查看索引状态 : GET _cat/indices/fund_data?v&format=json
输出 DSL 语句
在 Kibana 中执行相关语句,查看更明确的异常。
版权声明: 本文为 InfoQ 作者【李爽】的原创文章。
原文链接:【http://xie.infoq.cn/article/a7c7a222cd6838fed5a8d44ce】。文章转载请联系作者。
评论