问题现象

程序隔一段时间不操作后,再请求es就会报错Connection reset by peer,之后连续几次操作都正常

问题原因

报这个错的原因是 因为服务端已经关闭了链接,但是客户端还在使用这个链接

那为什么会出现这个问题?

有以下两个问题组成

1. 为什么服务端会关闭链接?

服务器会有TCP的Keepalive 经过一段时间如果没有操作就会自动断开连接功能,而ES默认就是取服务器的时长配置

linux查看超时时间默认为两小时

# 查看超时时间(单位秒)
cat /proc/sys/net/ipv4/tcp_keepalive_time

windows默认也是两小时

2. 客户端为什么一直持有?

因为默认配置为-1,就是不过期

解决方法

修改客户端的keepalive时间,将以下代码复制进项目即可

    @BeanRestHighLevelClient restHighLevelClient(RestClientBuilder builder, ElasticsearchRestClientProperties elasticsearchRestClientProperties) {builder.setHttpClientConfigCallback(httpClientBuilder -> {// 配置用户身份凭据提供httpClientBuilder.setDefaultCredentialsProvider(new PropertiesCredentialsProvider(elasticsearchRestClientProperties));// 1分钟httpClientBuilder.setKeepAliveStrategy((response, context) -> 1000 * 60);return httpClientBuilder;});return new RestHighLevelClient(builder);}/*** 凭证提供器*/private static class PropertiesCredentialsProvider extends BasicCredentialsProvider {PropertiesCredentialsProvider(ElasticsearchRestClientProperties properties) {if (StringUtils.hasText(properties.getUsername())) {Credentials credentials = new UsernamePasswordCredentials(properties.getUsername(),properties.getPassword());setCredentials(AuthScope.ANY, credentials);}properties.getUris().stream().map(this::toUri).filter(this::hasUserInfo).forEach(this::addUserInfoCredentials);}private URI toUri(String uri) {try {return URI.create(uri);} catch (IllegalArgumentException ex) {return null;}}private boolean hasUserInfo(URI uri) {return uri != null && StringUtils.hasLength(uri.getUserInfo());}private void addUserInfoCredentials(URI uri) {AuthScope authScope = new AuthScope(uri.getHost(), uri.getPort());Credentials credentials = createUserInfoCredentials(uri.getUserInfo());setCredentials(authScope, credentials);}private Credentials createUserInfoCredentials(String userInfo) {int delimiter = userInfo.indexOf(":");if (delimiter == -1) {return new UsernamePasswordCredentials(userInfo, null);}String username = userInfo.substring(0, delimiter);String password = userInfo.substring(delimiter + 1);return new UsernamePasswordCredentials(username, password);}}

application.yml的配置

以上代码的PropertiesCredentialsProvider类直接从SpringBoot自动配置源码里摘过来的

因为RestClientBuilder类未提供httpClientConfigCallback字段的get方法,如果直接调用setHttpClientConfigCallback配置 setKeepAliveStrategy 的话会覆盖掉SpringBoot进行的配置

(其中就包括 用户身份验证就无法使用了,项目启动会报es 401错误)

我翻了半天源码,没有更简便的写法了,就只能将用户身份代码复制出来,进行重新配置

org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration

为SpringBoot自动配置类

经过上线后一段时间的测试,问题已经没有再出现了

ES ElasticSearch Connection reset by peer问题解决相关推荐

  1. ElasticSearch(ES) Connection reset by peer解决方案

    最近使用ElasticSearch遇到一个坑,每天早上第一次使用ES的时候会报错,后面就正常了,去网上查了下资料,发现是因为ES底层用的HttpClient,它的keepalive设置成-1也就是用不 ...

  2. 【es】ES RestHighLevelClient 请求报错:Connection reset by peer

    1.概述 转载 源码解读 相似问题:[Elasticsearch]解决Elasticsearch HTTP方式查询报SocketTimeoutException的问题 Connection reset ...

  3. ES报错:Connection reset by peer 解决经历

    http://nicethemes.cn/news/txtlist_i28391v.html 这次来分享一下ES报错:java.io.IOException: Connection reset by ...

  4. 【Elasticsearch】解决Elasticsearch HTTP方式查询报SocketTimeoutException的问题 Connection reset by peer

    1.概述 转载:解决Elasticsearch HTTP方式查询报SocketTimeoutException的问题(待验证) 这个问题,和这个问题很像.参考 [es]ES RestHighLevel ...

  5. Redis远程连接失败-“Connection reset by peer”的解决方式(Win10以及Ubuntu)

    每篇一句: The business of life is the acquisition of memories. In the end that's all there is. 问题出现: 今天在 ...

  6. Recv failure: Connection reset by peer 报错解决

    前提: 安装好CentOS 后配置了阿里的源,在公司的网络内安装软件总是报错 [Errno 14] curl#56 - "Recv failure: Connection reset by ...

  7. c语言read()返回-1,errno:Connection reset by peer

    问题描述:服务器端执行完send()后调用close()关闭socket,然后exit()正常退出.客户端read()函数返回-1,errno104 :   Connection reset by p ...

  8. Io 异常: Connection reset;Io 异常: Got minus one from a read call;IO 错误: Connection reset by peer, Authe

    报错信息: 1. IO 错误: Connection reset by peer, Authentication lapse 0 ms. 搜索网上有些回答说 是JVM随机数造成的延迟问题. 看下ket ...

  9. JDBC Connection Fails With SEVERE: IO Error: Connection Reset By Peer解决方法

    问题描述: 2021.10.20 研发同事反馈一个关于JDBC Connection错误的问题,具体情况如下: JDBC connection with TCPS from Orcle Enterpr ...

最新文章

  1. 阿里某员工发飙:给我一点陪家人的时间行吗?真的想走了!
  2. java jpcap 抓包并分析_java利用Jpcap实现抓包
  3. 数据库常用操作(未完待续)
  4. python打开文件_用Python(in PsychoPy)打开SPSS数据文件
  5. python replace替换多个字符_关于python:使用string.replace(x,y)替换所有
  6. 工程数学(数值分析)第一讲:误差
  7. web.xml不同版本的头文件配置
  8. 按一定条件筛选df1,返回结果中df1的索引取df2的数据
  9. 默认smtp虚拟服务器,轻松架设自己的SMTP服务器
  10. 计算机四级题库百度云,四级题库免费
  11. 解决XeLaTex编译后中文出现乱码的问题
  12. 使用cmd结束进程的3种方法
  13. python cv2 利用掩膜将图片透明背景
  14. 入侵检测技术框架总论
  15. ISA TEST黑客过关小游戏第二关解密
  16. 沪牌软件操作开发说明
  17. 虚拟机Linux忘记root用户密码的修复方法
  18. 百位数,十位数,个位数的求法
  19. 2020省赛总结与反思
  20. 小智直播配置安装-配置录播,回放

热门文章

  1. oracle 升级 32升级64 utlirp,oracle11g 32bit 升级至64bit
  2. flv.js实现直播功能
  3. 5V 电源向 3.3V 系统供电
  4. 4.3-3D包容盒子
  5. 执行mvn test命令后报:Cannot find class in classpath
  6. 阻止window.onbeforeunload事件的弹出框 或 自定义弹出框
  7. 2023最新互联网公司时长排行榜出炉!
  8. 数据库(DB)和数据仓库(DW)的区别
  9. 甘肃省计算机二级考试试题,2013甘肃省计算机等级考试试题 二级ACCESS最新考试试题库(完整版)...
  10. Microsoft SQL Server 2019 安装服务没有及时响应启动或控制请求。