背景:
生产环境有一个api 产品使用到Elasticsearch,根据需求,需要上线一个新功能,当新上线的代码从预发布切换到生产环境后,日志显示Elasticsearch操作异常,具体错误信息:
ElasticsearchTimeoutException[java.util.concurrent.TimeoutException: Timeout waiting for task.]; nested: TimeoutException[Timeout waiting for task.];
at org.elasticsearch.action.support.AdapterActionFuture.actionGet(AdapterActionFuture.java:71)
at org.elasticsearch.action.support.AdapterActionFuture.actionGet(AdapterActionFuture.java:63)
at org.elasticsearch.action.ActionRequestBuilder.get(ActionRequestBuilder.java:69)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.util.concurrent.TimeoutException: Timeout waiting for task.
at org.elasticsearch.common.util.concurrent.BaseFuture$Sync.get(BaseFuture.java:232)
at org.elasticsearch.common.util.concurrent.BaseFuture.get(BaseFuture.java:67)
at org.elasticsearch.action.support.AdapterActionFuture.actionGet(AdapterActionFuture.java:69)
引发报错的操作:
Update Es 中一个index1 中的一条记录。
排查过程:
1.因为是上线一个新功能,初步怀疑是代码问题,但代码中ES工具类没有做改动,排除
2.查看生产日志,发现报错elasticsearch EsRejectedExecutionException[rejected execution (queue capacity 1000),怀疑是队列数满了引起的等待超时,因为是update 操作,调整ES bulk 的queue大小,设置为1000,重新发布,未能解决,还是超时。
3.查看es日志,没有发现ERROR级别日志,排除。
4.代码屏蔽,把报错的index 相关操作的代码屏蔽掉,上线功能,还是报错。。。无语了。。。
5.呼叫外援,冲天开始定位问题。查看es日志,发现
[2019-03-05T21:28:41,220][INFO ][o.e.c.m.MetaDataMappingService] [node-3] [partneruser/ANfhxm12Qp61cApLZigiow] update_mapping [13281]
[2019-03-05T21:28:58,299][INFO ][o.e.c.m.MetaDataMappingService] [node-3] [partneruser/ANfhxm12Qp61cApLZigiow] update_mapping [14901]
Es master节点存在mapping 操作,耗时很久。重新查看代码,发现网es插入的信息中新增了一些字段,mapping 文件中并没有手动创建过这些字段,造成Es 在自动mapping。继续查看时间点,生产日志报错时间和es mapping 时间吻合。定位问题。
解决方案:
1。新增加的字段不写入Es.
总结:
生产环境es 配置建议
1.关闭自动mapping 功能,方便定位问题。
2.调整bulk queue大小,一般改成1000 基本够用
网友评论