Elasticsearch Connection reset by peer错误解决方案
背景
之前应用和ES同在阿里云,连es没有任何问题
最近因需将应用从阿里云迁移到其他云,ES暂时保留在阿里云
迁移之后发现应用连阿里云ES偶发connection reset by peer问题
分析
遇到这种问题首先想到的是通过抓包分析
在客户端抓包
只看到请求就被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);