一、问题现象
随着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表示持续连接
2、服务端的KeepAlive
虽然客户端保持了长链接,然而Linux服务器TCP的Keepalive却有着自己的超时时间,可通过命令查看,如下图
可以看到这台服务器被设置的是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防火墙白名单设置 - 诺尘の笔记
猜你喜欢
- 14天前(a级景区评定机构)全国A级旅游景区创建与提升培训班在敦煌市举办
- 14天前(从“见世面”到“内在需要”:在海南,追问旅行的意义)从“见世面”到“内在需要”:在海南,追问旅行的意义
- 14天前(哈弗h9优惠9万是真的吗)热浪来袭,哈弗H9超值补贴火热加码
- 14天前(万达酒店及度假村连续五年荣获“中国饭店集团60强”)万达酒店及度假村连续五年荣获“中国饭店集团60强”
- 14天前(甘肃文旅项目)甘肃省文旅产业链招商引资推介会在天水成功举办
- 14天前(花王伴你乐享五一好“趣”处)花王伴你乐享五一好“趣”处
- 14天前(071 圣安东尼奥)秋季 圣安东尼奥交出了私藏活动清单
- 14天前(星级饭店的发展困境)星级饭店转型之路:从市场逻辑到行业实践的深度探索
- 14天前(“三天跨两城”催生租车新需求,神州租车清明跨城订单同比增长416%)“三天跨两城”催生租车新需求,神州租车清明跨城订单同比增长416%
- 14天前(锦江 iu)锦江荟APP原生鸿蒙版正式上线打造全场景旅行服务新体验
网友评论
- 搜索
- 最新文章
- (2020广州车展哈弗)你的猛龙 独一无二 哈弗猛龙广州车展闪耀登场
- (哈弗新能源suv2019款)智能科技颠覆出行体验 哈弗重塑新能源越野SUV价值认知
- (2021款全新哈弗h5自动四驱报价)新哈弗H5再赴保障之旅,无惧冰雪护航哈弗全民电四驱挑战赛
- (海南航空现况怎样)用一场直播找到市场扩张新渠道,海南航空做对了什么?
- (visa jcb 日本)优惠面面俱到 JCB信用卡邀您畅玩日本冰雪季
- (第三届“堡里有年味·回村过大年”民俗花灯会活动)第三届“堡里有年味·回村过大年”民俗花灯会活动
- (展示非遗魅力 长安启源助力铜梁龙舞出征)展示非遗魅力 长安启源助力铜梁龙舞出征
- (阿斯塔纳航空公司)阿斯塔纳航空机队飞机数量增至50架
- (北京香港航班动态查询)香港快运航空北京大兴新航线今日首航
- (我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉)我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉
- 热门文章