Elasticsearch Connection reset by peer错误解决方案

发布时间 2023-06-14 14:53:10作者: 每天进步一点点点点点

背景

之前应用和ES同在阿里云,连es没有任何问题
最近因需将应用从阿里云迁移到其他云,ES暂时保留在阿里云
迁移之后发现应用连阿里云ES偶发connection reset by peer问题

分析

遇到这种问题首先想到的是通过抓包分析
在客户端抓包
image
只看到请求就被reset了
服务端因为用的是阿里云的es云服务,所以没法抓包

解决

因为从抓包分析和日志告警来看基本每隔十几分钟会有被reset情况,而我们又不能从阿里云的es抓包,不太清楚具体整个链路是哪个环节主动断开了,既然这样,我们就在应用层来设置keepalive时间,这里设置了3分钟。具体代码如下:
将修改后的代码发布后,reset问题得到解决。

        RestClientBuilder builder = RestClient.builder(httpHosts.toArray(new HttpHost[0]));

        // 超时时间
        builder.setRequestConfigCallback(
                new RestClientBuilder.RequestConfigCallback() {
                    @Override
                    public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
                        return requestConfigBuilder.setConnectTimeout(elasticsearchProperties.getConnectTimeout())
                                .setSocketTimeout(elasticsearchProperties.getSocketTimeout());
                    }
                });
        //
        builder.setHttpClientConfigCallback(requestConfig -> requestConfig.setKeepAliveStrategy(
                (response, context) -> TimeUnit.MINUTES.toMillis(3)));
        RestHighLevelClient client = new RestHighLevelClient(builder);