ElasticSearch 查询时内存溢出导致Eurake客户端不停重启

一天晚上,生产环境升级,升级的主要内容是将用户服务折分出去,并用户数据从mongo中复制到ES中助力查询。在测试环境和预发环境都测试通过, 然后在生产环境, 一次后台查询导致整个系统崩溃。

后来查找到原来是很早以前的一段代码,将所有用户都查询出来然后进行分析,导致用户服务直接挂掉,ES不能正常服务(对外服务断断续续),所有服务连接ES都是断断续续的,导致使用ES的服务(Eurake客户端)不停的重启, 状态从UP或DOWN之间不停的更换(Saw local status change event StatusChangeEvent [timestamp=1506004119798, current=DOWN, previous=UP]),致使整系统不能正常提供服务。

事件过程:
在测试环境查询用户列表超1W行以后的数据时,ES报错: Result window is too large, from + size must be less than or equal to: [10000] but was [10020]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter
这是因为ES提示结果窗口太大了,目前最大值为10000,而我们却请求查找到10020行。并提示我们使用scroll api这种更有效率的方式进行查询。或者修改index.max_result_window,但是ES不建议这样做,因为会消耗更多内存(从这次经历来看,也会导致ES不能提供正常的服务)。
由于没有时间去研究scroll api,所以我们修改了index.max_result_window,由于测试环境数据量相对生产环境来说算小的,所以测试环境抗下来了,而生产环境就直接挂了。

关于这次升级故障后对系统进行优化的方案,以后再发表吧。
另外提一下,scroll api是ES推荐的用于深度分页的方式.

你可能感兴趣的:(微服务)