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

http://nicethemes.cn/news/txtlist_i28391v.html

这次来分享一下ES报错:java.io.IOException: Connection reset by peer 的解决经历

问题描述

本人最近负责了定时获取Prometheus Metrics并发送到ES做持久化存储的任务。然而在Metrics采集粒度从3分钟变为1小时后(这里使用的是Springboot的定时采集组件Scheduler),报了如下的错误:

java.io.IOException: Connection reset by peerat org.elasticsearch.client.RestClient.extractAndWrapCause(RestClient.java:793) ~[elasticsearch-rest-client-7.4.0.jar!/:7.4.0]at org.elasticsearch.client.RestClient.performRequest(RestClient.java:218) ~[elasticsearch-rest-client-7.4.0.jar!/:7.4.0]at org.elasticsearch.client.RestClient.performRequest(RestClient.java:205) ~[elasticsearch-rest-client-7.4.0.jar!/:7.4.0]at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1454) ~[elasticsearch-rest-high-level-client-7.4.0.jar!/:7.4.0]at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1439) ~[elasticsearch-rest-high-level-client-7.4.0.jar!/:7.4.0]at org.elasticsearch.client.IndicesClient.exists(IndicesClient.java:785) ~[elasticsearch-rest-high-level-client-7.4.0.jar!/:7.4.0]at com.free4inno.scheduler.adapter.service.elasticsearch.GenericEsService.isIndexExists(GenericEsService.java:60) ~[classes!/:0.0.1-SNAPSHOT]at com.free4inno.scheduler.adapter.service.elasticsearch.MetricsToEsService.getTodayIndex(MetricsToEsService.java:56) ~[classes!/:0.0.1-SNAPSHOT]at com.free4inno.scheduler.adapter.service.elasticsearch.MetricsToEsService.insert(MetricsToEsService.java:49) ~[classes!/:0.0.1-SNAPSHOT]at com.free4inno.scheduler.adapter.service.Scheduler.sendMetrics(Scheduler.java:64) [classes!/:0.0.1-SNAPSHOT]at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_261]at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_261]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_261]at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_261]at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) [spring-context-5.2.8.RELEASE.jar!/:5.2.8.RELEASE]at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) [spring-context-5.2.8.RELEASE.jar!/:5.2.8.RELEASE]at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93) [spring-context-5.2.8.RELEASE.jar!/:5.2.8.RELEASE]at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_261]at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_261]at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_261]at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [?:1.8.0_261]at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_261]at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_261]at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261]
Caused by: java.io.IOException: Connection reset by peerat sun.nio.ch.FileDispatcherImpl.read0(Native Method) ~[?:1.8.0_261]at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39) ~[?:1.8.0_261]at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223) ~[?:1.8.0_261]at sun.nio.ch.IOUtil.read(IOUtil.java:197) ~[?:1.8.0_261]at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:378) ~[?:1.8.0_261]at org.apache.http.impl.nio.reactor.SessionInputBufferImpl.fill(SessionInputBufferImpl.java:231) ~[httpcore-nio-4.4.13.jar!/:4.4.13]at org.apache.http.impl.nio.codecs.AbstractMessageParser.fillBuffer(AbstractMessageParser.java:136) ~[httpcore-nio-4.4.13.jar!/:4.4.13]at org.apache.http.impl.nio.DefaultNHttpClientConnection.consumeInput(DefaultNHttpClientConnection.java:241) ~[httpcore-nio-4.4.13.jar!/:4.4.13]at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:81) ~[httpasyncclient-4.1.4.jar!/:4.1.4]at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:39) ~[httpasyncclient-4.1.4.jar!/:4.1.4]at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:114) ~[httpcore-nio-4.4.13.jar!/:4.4.13]at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:162) ~[httpcore-nio-4.4.13.jar!/:4.4.13]at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:337) ~[httpcore-nio-4.4.13.jar!/:4.4.13]at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315) ~[httpcore-nio-4.4.13.jar!/:4.4.13]at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276) ~[httpcore-nio-4.4.13.jar!/:4.4.13]at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104) ~[httpcore-nio-4.4.13.jar!/:4.4.13]at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:591) ~[httpcore-nio-4.4.13.jar!/:4.4.13]... 1 more

更令人费解的是,在采集Metrics发送至ES的过程中,在单数的整点写入ES是正常的,然而一到双数的整点就不正常了,例如0:00开始发送是可以发送到ES的,1:00就发送不到报错,2:00就重新恢复正常了…
后面经过调研,是因为esClient自动设置的KeepAlive时间为-1,也就是持续连接,然而这回受到外界的影响比如Firewall,会将TCP连接单方面断开,从而会导致Connection reset by peer的报错。

解决方案

在设置RestHighLevelClient的时候手动设置一下setKeepAliveStrategy的方法,在这里设置的是3分钟的时间(不要太长)

@Beanpublic RestHighLevelClient restHighLevelClient(@Autowired RestClientBuilder restClientBuilder){return new RestHighLevelClient(restClientBuilder.setHttpClientConfigCallback(requestConfig ->requestConfig.setKeepAliveStrategy((response, context) -> TimeUnit.MINUTES.toMillis(3))));}

或者也可以使用心跳,隔一段时间就去获取一次es的连接状态,以此来保持连接的活跃,个人认为这是下策,这里就没有进行尝试。

https://blog.csdn.net/qq_33999844/article/details/113843845

Elasticsearch出现Connection reset by peer分析

1.异常:

Caused by: java.io.IOException: Connection reset by peer
at org.elasticsearch.client.RestClient.extractAndWrapCause(RestClient.java:793)
at org.elasticsearch.client.RestClient.performRequest(RestClient.java:218)
at org.elasticsearch.client.RestClient.performRequest(RestClient.java:205)
at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1454)
at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1424)
2.分析

RestHighLevelClient客户端,使用的是apache httpclient,版本为4.x,keepAlive默认为-1(客户端会一直保持session);

当服务端因为超时或者其他原因关闭session,客户端仍然认为长连接存在,抛出异常;

注:当ES服务端的keepAlive短于ES客户端的keepAlive,也会导致:服务端已经关闭了连接,客户端继续复用该连接,抛出异常。

3.解决

手动设置KeepAliveStrategy来配置keepAlive,保证客户端keepAlive小于服务端keepAlive,让客户端先于服务端关闭连接
————————————————
版权声明:本文为CSDN博主「夜-NULL(zmc)」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33999844/article/details/113843845

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327013.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云计算设计模式(一)缓存预留模式

云带来的改变是显而易见的,云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问, 进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务&am…

Thread.currentThread().getContextClassLoader() 和 Class.getClassLoader()区别

转载自 Thread.currentThread().getContextClassLoader() 和 Class.getClassLoader()区别 查了一些资料也不是太明白两个的区别,但是前者是最安全的用法 打个简单的比方,你一个WEB程序,发布到Tomcat里面运行。 首先是执行Tomcat org.apache.c…

批量删除文件

git bash 运行 rm -rf *.class 删除当前文件夹下所有的.class文件

稀疏数组与二维数组相互转化

图示 二维数组转稀疏数组的思路 遍历 原始的二维数组,得到有效数据的个数 sum根据sum 就可以创建 稀疏数组 sparseArr int[sum 1] [3]将二维数组的有效数据数据存入到 稀疏数组 稀疏数组转原始的二维数组的思路 先读取稀疏数组的第一行,根据第一行的…

云计算设计模式(二)——断路器模式

云带来的改变是显而易见的,云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问, 进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务&am…

Class.forName()和ClassLoader.getSystemClassLoader().loadClass()区别

转载自 Class.forName()和ClassLoader.getSystemClassLoader().loadClass()区别 class A {static {System.out.println("Class A is Loading now");}public A(){System.out.println("A new Class A instance is cr…

excel打开csv 出现乱码怎么解决 逗号分隔

excel打开csv 出现乱码怎么解决 https://jingyan.baidu.com/article/ac6a9a5e4c681b2b653eacf1.html CSV是逗号分隔值的英文缩写,通常都是纯文本文件。CSV格式是分隔的数据格式,有字段/列分隔的逗号字符和记录/行分隔换行符。通常CSV文件可以用EXCEL正常…

mybatis报错:java.lang.IllegalArgumentException: Mapped Statements collection does not contain

在做mybatis案例的时候发现了一个问题,报错如下: org.apache.ibatis.exceptions.PersistenceException:### Error querying database. Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for org.dao.…

在ASP.NET Core下使用SignalR技术

一、前言 上次我们讲到过如何在ASP.NET Core中使用WebSocket,没有阅读过的朋友请参考 WebSocket in ASP.NET Core 文章 。这次的主角是SignalR它为我们提供了简化操作WebSocket的框架。 ASP .NET SignalR 是一个ASP.NET 下的类库,可以在ASP.NET 的Web项目中实现实时…

ClassLoader 详解及用途

转载自 ClassLoader 详解及用途 ClassLoader主要对类的请求提供服务,当JVM需要某类时,它根据名称向ClassLoader要求这个类,然后由ClassLoader返回这个类的class对象。 1.1 几个相关概念ClassLoader负责载入系统的所有Resources(…

mybatis简单案例源码详细【注释全面】——前期准备

mybatis 是个什么东西,这里就不必说了,大家去网上搜搜看就行了,在这里我主要是分享一下最基本的增删改查案例以及配置信息,测试信息。 首先我们创建个数据库: /* SQLyog 企业版 - MySQL GUI v8.14 MySQL - 5.5.40 : …

用数组模拟队列的实现

package com.atguigu.queue;import jdk.nashorn.internal.ir.ReturnNode;import java.util.Scanner;/*** 创建人 wdl* 创建时间 2021/3/17* 描述*/ public class ArrayQueueDemo {public static void main(String[] args) {//测试一把//创建一个队列ArrayQueue queue new Arra…

时间格式转换2020-04-09T23:00:00.000+08:00

时间格式转换2020-04-09T23:00:00.00008:00 /*** 日期格式转换yyyy-MM-ddTHH:mm:ss.SSSXXX (yyyy-MM-ddTHH:mm:ss.SSSZ) TO yyyy-MM-dd HH:mm:ss* 2020-04-09T23:00:00.00008:00 TO 2020-04-09 23:00:00* throws ParseException*/public static String dealDateFormat(String…

云计算设计模式(三)——补偿交易模式

撤消由一系列步骤,它们共同限定了最终一致性操作中,如果一个或多个步骤失败执行的工作。按照最终一致性模型,业务实现复杂的业务流程和工作流的云托管的应用程序中很常见。 背景和问题 在云中运行的应用程序频繁修改数据。此数据可跨在各种地…

java反射 修改静态方法的值 setAccessible

转载自 java反射 修改静态方法的值 setAccessible 这几天闲来无事。在网上看了一个题目,相信大家都知道这个题目 static void change(String str){str"welcome";}public static void main(String[] args) {String str "123";change(str);Syste…

mybatis简单案例源码详细【注释全面】——实体层(User.java)

/** * Title: Users.java * Package org.entity * Description: TODO该方法的主要作用: * author A18ccms A18ccms_gmail_com * date 2017-10-5 下午6:53:06 * version V1.0 */ package org.entity;import java.util.Date;/** * * 项目名称:s…

API网关Ocelot 使用Polly 处理部分失败问题

在实现API Gateway过程中,另外一个需要考虑的问题就是部分失败。这个问题发生在分布式系统中当一个服务调用另外一个服务超时或者不可用的情况。API Gateway不应该被阻断并处于无限期等待下游服务的状态。但是,如何处理这种失败依赖于特定的场景和具体服…

数组模拟环形队列

思路分析 代码实现 package com.atguigu.queue;import java.util.Calendar; import java.util.Scanner;/*** 创建人 wdl* 创建时间 2021/3/17* 描述*/ public class CircleArrayQueueDemo {public static void main(String[] args) {//测试一把System.out.println("测试数…

Error:(1, 10) java: 需要class, interface或enum

https://blog.csdn.net/zf18234031156/article/details/103047649 反复做这一步,30多个文件一个一个弄,有乱码用txt打开,黏贴覆盖, 目录 1.前言 2.原因(UTF-8BOM造成) 3.如何解决 3.11使用Notepad,选择“格式--以…