解决Elasticsearch Connection reset by peer异常

这篇具有很好参考价值的文章主要介绍了解决Elasticsearch Connection reset by peer异常。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、问题现象

随着ES的密集使用,线上环境,不同应用最近几天陆续有报java.io.IOException: Connection reset by peer异常,感觉不太正常。直接影响就是用户查询或者变更ES数据失败。

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:251)
	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.bulk(RestHighLevelClient.java:497)

二、问题分析

1、客户端的KeepAlive

首先网上查了一番并结合源码分析,与Es的RestHighLevelClient的KeepAlive(最小空闲时间)有关,KeepAlive默认值是-1,长连接,表示连接永不过期,可循环重复使用。下图就是设置KeepAlive的时候获取的默认时间策略,不设置默认-1表示持续连接

elasticsearch connection reset by peer,ElasticSearch,elasticsearch,大数据

2、服务端的KeepAlive

虽然客户端保持了长链接,然而Linux服务器TCP的Keepalive却有着自己的超时时间,可通过命令查看,如下图

elasticsearch connection reset by peer,ElasticSearch,elasticsearch,大数据

可以看到这台服务器被设置的是600秒,也就是10分钟。若超过这个时间,且中间客户端没有操作,也即没有与服务端发生一个TCP数据交换,服务器就发送一个心跳包,探测下当前链接是否有效,正常情况下会收到对方的包,表示这个连接可用。不正常情况下,收不到客户端相应,服务端会多次尝试后发送,之后依然收不到客户端响应(因为网络抖动等原因),就会断开并清除TCP连接。而此时客户端还依然认为自己持有的连接是有效的,如果此时正好有涉及ES操作的请求来到,带着自认为有效但实际已经失效的连接的去请求服务端的时候就会报抛出此异常。

基于以上分析,我遇到的错误有了眉目,之前那么长时间没有收到这个错误,只有最近几天才有,自然想到这几天公司安排的机房断网演练,网路波动一阵子,导致客户端多次收不到服务器的心跳,可能与此有关

因此一种解决方案就是设置KeepAlive-最小空闲时间,这个时间要小于服务器的Keepalive时间,超过这个最小时间客户端主动便释放掉这个连接,下次新请求来到从连接池中重新获取,而不是让服务端主动断开连接。

三、解决方案

方案一

在客户端连接中构造中设置setKeepAliveStrategy((response, context) -> 180 * 1000),如设置最小空闲时间180秒,超过这个时间,客户端主动释放掉连接,新请求来到重新获取。

完整代码如下:

final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
        RestClientBuilder builder = RestClient.builder(new HttpHost(host, 9200, "http"))
                .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                    @Override
                    public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) {
                        return httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider).setKeepAliveStrategy((response, context) -> 180 * 1000);
                    }
                });
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder);

方案二

因为这个异常不是那么频繁,因此也可以在代码中获取客户端的时候try catch  IOException后,就重新获取客户端连接1-3次左右,超过设定次数就失败,这个也是比较保险的

      RestHighLevelClient client = null;
	  try {
				client = esConf.getClient();
		  } catch (IOException e) {
				log.error("IOException", e);
				client = esConf.getClient();
	      }

最后,我按照方法一改了一个应用,上线观察一周,没有再发现此错误。然而,客户端没有改动倜然保持长链接的应用,也没有再报这个异常。推测很大概率是网络波动导致的此问题


参考:

ES两个小时没连接竟然会出现bug,为此老板给我夹了个鸡腿。。。-六虎

ElasticSearch的网络错误与Linux防火墙白名单设置 - 诺尘の笔记文章来源地址https://www.toymoban.com/news/detail-822522.html

到了这里,关于解决Elasticsearch Connection reset by peer异常的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决ssh_exchange_identification:read connection reset by peer 原因

    服务器改了密码,试过密码多次后出现: 1 ssh_exchange_identification: read: Connection reset by peer 可以通过ssh -v查看连接时详情 OpenSSH_6.6.1, OpenSSL 1.0.1k-fips 8 Jan 2015 debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config line 56: Applying options for * debug1: Connecting to xxx [xx] port 22. de

    2024年01月20日
    浏览(36)
  • curl: (56) Recv failure: Connection reset by peer问题汇总和解决方案

    这两天正在学习用docker制作tomcat镜像,有一个问题困扰了我3天,可能大家在学习时也会遇到,于是我就单独发一篇文章来解决这个问题。 解决办法我在上一篇文章 Docker进阶篇之DockerFile制作Tomcat镜像,教你如何发布镜像到DockerHub和阿里云 已经详细说明了,这里再说明一次。

    2024年02月01日
    浏览(57)
  • HTTP接口调用时报错 java.io.IOException: Connection reset by peer解决办法

    在接口调用时,遇到如下报错: Caused by: java.io.IOException: Connection reset by peer         at sun.nio.ch.FileDispatcherImpl.write0(Native Method) ~[?:1.8.0_241]         at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47) ~[?:1.8.0_241]         at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93) ~[?:1.8.0_241]  

    2024年04月26日
    浏览(68)
  • 解决kali虚拟机连接github问题,git/‘: Recv failure: Connection reset by peer

    直接使用ssh连接方式,以下终端全部为kali虚拟机的终端 1、在终端中执行以下命令,将你的电子邮件地址替换为GitHub帐户关联的电子邮件地址。          ssh-keygen -t ed25519 -C \\\"youremail@example.com\\\"         这会在默认目录(通常是 ~/.ssh/ )中生成一个新的SSH密钥对 遇到输入

    2024年01月17日
    浏览(55)
  • reset Offset 与connection reset by peer

    某次生产线上,从KafkaManager监控页面,发现还剩几十万未消费数据量,过了几分钟之后,监控页面发现未消费数据量达到了几千万。 定位生产日志,发现消费端 出现日志 reset offset , 结合上下文日志,发现在切换broker leader之后,提交的偏移量在新leader上面找不到,之后根据消

    2024年02月16日
    浏览(45)
  • 关于无法使用SSH连接远程服务器“Connection reset by peer Connection reset by ip”

    刚开始辗转反侧在各个国内搜索引擎处,处理方法均是打开端口,关闭防火墙,但是毕竟华为云是一台新的服务器,按道理应该什么都没有,所以不可能存在防火墙的问题,而且自己在服务器的安全配置入口都打开了各个端口,在本地mac端发现也可以ping通,但是死活就是无法

    2024年02月16日
    浏览(39)
  • connection-reset-by-peer问题定位

    有同事报客户端请求某核心服务出现大量connection reset by peer。线上故障,赶紧高优定位处理。 no.1 及时止损 看现象是个别实例集中出现,不是全部实例出现,那就和运行环境、流量、或者某个资源有关系。按照及时止损的原则,首先验证重启能否恢复,验证重启可以恢复,联

    2024年02月05日
    浏览(36)
  • github Recv failure: Connection reset by peer

    晚上敲着代码准备提交,执行 git pull ,报错 Recv failure: Connection reset by peer 。看着这报错我陷入了沉思,这个报错在我的理解中被被人拒绝了。查了一下资料,发现这个报错是 http 系列的问题,于是我有了想法。。 没啥问题 也没啥问题 没错,是 http 的。那我把他改成 git 会咋

    2024年02月13日
    浏览(41)
  • java.io.IOException: Connection reset by peer

    接口返回的时候报错,java.io.IOException: Connection reset by peer,具体报错信息如下: 原因: 接口返回的数据量太大报错, 解决办法: 修改nginx缓存配置信息。 nginx原配置信息: nginx修改后信息: 注意: \\\"proxy_busy_buffers_size\\\"必须等于或大于\\\"proxy_buffer_size\\\"的最大值。

    2024年02月16日
    浏览(47)
  • docker (56) Recv failure: Connection reset by peer

    docker 运行一个spring boot的api接口项目,在虚拟机上测试: curl 127.0.0.1:9997/doc.html   报错:(56) Recv failure: Connection reset by peer 在网上搜了很多包括: systemctl status firewalld  检查防火墙状态 systemctl disable firewalld  永久关闭防火墙 输入命令:sysctl net.ipv4.ip_forward 如果返回为“net.i

    2024年02月22日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包