文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Elasticsearch7.6解决报错Connection reset by peer【刨根问底完美解决】

2024-12-13 15:26

关注

一、前言

小编最近在生产上遇到一个问题,解决完后立马总结一下分享给大家,希望可以帮助到大家哈!

事情是这样的,奇怪的现象,公司搭建的ElasticSearch,本来是用来提高检索效率的,最近出现报错了!

版本配置什么都没变,奇怪的很!

ElasticSearch版本为7.6

问题:每隔几个小时就会查询不到,与​ElasticSearch​连接不上,刷新后查询正常报错为:​java.io.IOException: Connection reset by peer

拿着条件去kibana是可以查询到的;

核心原因:

这个客户端是长链接,服务端过期后自动关闭链接,客户端继续用原来的链接导致错误的!

二、前因后果

下面我们来详细说一下报错原因和解决方案哈:

1、报错信息

java.io.IOException: Connection reset by peer
at org.elasticsearch.client.RestClient.extractAndWrapCause(RestClient.java:828)
at org.elasticsearch.client.RestClient.performRequest(RestClient.java:248)
at org.elasticsearch.client.RestClient.performRequest(RestClient.java:235)
at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1514)
at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1484)
at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:1454)
at org.elasticsearch.client.RestHighLevelClient.search(RestHighLevelClient.java:970)

2、原因与解决方案

上面也是说了原因,但是不太详细,下面详细说一下原因哈!

ES会设置一个策略来进行链接时间的控制,设置此连接的空闲持续时间!

我们可以看一下这个策略:

这个我们不配置会走这个策略,默认-1为长链接,可循环重复使用、

我们只需要把这个策略换成我们的即可

@Contract(threading = ThreadingBehavior.IMMUTABLE)
public class DefaultConnectionKeepAliveStrategy implements ConnectionKeepAliveStrategy {

public static final DefaultConnectionKeepAliveStrategy INSTANCE = new DefaultConnectionKeepAliveStrategy();

@Override
public long getKeepAliveDuration(final HttpResponse response, final HttpContext context) {
Args.notNull(response, "HTTP response");
final HeaderElementIterator it = new BasicHeaderElementIterator(
response.headerIterator(HTTP.CONN_KEEP_ALIVE));
while (it.hasNext()) {
final HeaderElement he = it.nextElement();
final String param = he.getName();
final String value = he.getValue();
if (value != null && param.equalsIgnoreCase("timeout")) {
try {
return Long.parseLong(value) * 1000;
} catch(final NumberFormatException ignore) {
}
}
}
return -1;
}

}

服务器的TCP时间,我们可以查看一下:

cat /proc/sys/net/ipv4/tcp_keepalive_time

这里就是12分钟,我们需要让客户端的链接时间小于服务器的keepalive时间!

这样客户端超过时间后就会重新获取新链接,确保不会报错哈!!

三、具体方案

编写ElasticsearchProperties ,获取nacos上的信息,方便修改!

@Data
@Component
@ConfigurationProperties(prefix = "spring.elasticsearch.rest")
public class ElasticsearchProperties {

private String uris;

private String username;

private String password;

}

编写RestHighLevelClient配置类,使用我们的策略,看到其他教学还是使用以前的连接方式,现在RestClientBuilder里的RestClientBuilder是自动构建连接的!

这里我们把RestClientBuilder注入,继续放里面放新策略即可!

由于我们重写RestHighLevelClient,它又依赖RestClientBuilder,原来RestClientBuilder会自动获取用户名密码、连接地址,现在我们需要把用户名密码重新赋值一下哈!这样就可以少一步输入地址的哈!

这里设置10分钟,没有超过12分钟!

@Configuration
public class ElasticsearchConfig {

@Autowired
private ElasticsearchProperties elasticsearchProperties;

@Autowired
private RestClientBuilder restClientBuilder;

@Bean
public RestHighLevelClient restHighLevelClient(){

CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(elasticsearchProperties.getUsername(), elasticsearchProperties.getPassword()));
return new RestHighLevelClient(restClientBuilder.setHttpClientConfigCallback(requestConfig ->{
requestConfig.setKeepAliveStrategy((response, context) -> TimeUnit.MINUTES.toMillis(10));
requestConfig.setDefaultCredentialsProvider(credentialsProvider);
return requestConfig;
}));
}

}

看一下配置文件:

方案二:

如果不介意的话可以把错误捕获起来,重新调用一下,第二次就会重新建立连接,这样就不会有问题了,不过这种不太建议!!

来源:小王博客基地内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯