lettuce偶现Connection reset by peer异常排查

2024-01-01 10:38

本文主要是介绍lettuce偶现Connection reset by peer异常排查,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

问题描述:

服务的异常日志中偶现查询超时1min

 

服务异常日志偶现连接断开

 

排查过程:

问:

这个明显网络超时,按照lettuce的默认超时配置,我这边看完lettuce的配置源码逻辑告诉你
另外需要以下几个信息:
1.是不是只有这一台服务节点有异常,所有的服务节点都有异常报错吗?
2.出现异常时的redis命令和参数,发生时所连接的redis node的ip
3.redis服务端监控没有异常(例如:网络,磁盘,慢日志)

答:

1.目前2个都有出现

2.。。。

3.保密

线索:

1.两台服务节点都有异常日志
2.不是频发,是偶现
3.redis服务监控看是没有异常
4.redis服务端慢日志是10ms与服务的异常对不上

lettuce keep alive原理分析:

redis4 SDK的保活逻辑

保活逻辑如下:
1.默认开启:autoReconnect参数
https://github.com/lettuce-io/lettuce-core/wiki/Client-Options


2.保活机制:断开连接的时候会尝试重连,断开连接之后并不是立即重连,而是根据一个延时重连的策略来延迟执行重连任务。
https://github.com/lettuce-io/lettuce-core/search?q=ConnectionWatchdog&type=code

3.重试时间间隔:0ms、1ms、2ms、4ms、16ms、指数递增最大Long.MAX_VALUE

https://github.com/lettuce-io/lettuce-core/blob/d3d50549dab9a22460e39946659dfa28738c7a25/src/main/java/io/lettuce/core/resource/ExponentialDelay.java

差异解释:

redis4使用的lettuce和之前的SDK的保活逻辑不一样
之前的jedis是发送ping来保活
lettuce是当连接断开触发reconnect
https://github.com/lettuce-io/lettuce-core/issues/861
这个issue有作者的解释意图
留个问题:其中有一个点不解断开连接的时候channelInactive会被调用,这个断开连接是netty怎么触发的??????

结论:

 

按照lettuce的逻辑,有以下case

1.网络连接通过防火墙,而防火墙有一定的超时机制,在网络连接长时间不传输数据时,会导致这个tcp连接被关闭

2.redis服务的链接数达到上限,会将最新的链接给关闭

3.redis服务宕机、重启

4.tcp数据长度不一致

5.没有设置keepalive

6.timeout时间设置太短

解决方案就是优化redis.conf的一些配置项:

timeout

tcp-keepalive

tcp-backlog

maxclients

 

至于第一个图片中的超时问题,是根据业务的场景需要配置超时时间,默认的60s不满足业务需求

默认配置:https://github.com/lettuce-io/lettuce-core/blob/34476f5cbe/src/main/java/io/lettuce/core/RedisURI.java

这篇关于lettuce偶现Connection reset by peer异常排查的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/558996

相关文章

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

Java异常架构Exception(异常)详解

《Java异常架构Exception(异常)详解》:本文主要介绍Java异常架构Exception(异常),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. Exception 类的概述Exception的分类2. 受检异常(Checked Exception)

Java报NoClassDefFoundError异常的原因及解决

《Java报NoClassDefFoundError异常的原因及解决》在Java开发过程中,java.lang.NoClassDefFoundError是一个令人头疼的运行时错误,本文将深入探讨这一问... 目录一、问题分析二、报错原因三、解决思路四、常见场景及原因五、深入解决思路六、预http://www

一文带你深入了解Python中的GeneratorExit异常处理

《一文带你深入了解Python中的GeneratorExit异常处理》GeneratorExit是Python内置的异常,当生成器或协程被强制关闭时,Python解释器会向其发送这个异常,下面我们来看... 目录GeneratorExit:协程世界的死亡通知书什么是GeneratorExit实际中的问题案例

Java程序运行时出现乱码问题的排查与解决方法

《Java程序运行时出现乱码问题的排查与解决方法》本文主要介绍了Java程序运行时出现乱码问题的排查与解决方法,包括检查Java源文件编码、检查编译时的编码设置、检查运行时的编码设置、检查命令提示符的... 目录一、检查 Java 源文件编码二、检查编译时的编码设置三、检查运行时的编码设置四、检查命令提示符

Java捕获ThreadPoolExecutor内部线程异常的四种方法

《Java捕获ThreadPoolExecutor内部线程异常的四种方法》这篇文章主要为大家详细介绍了Java捕获ThreadPoolExecutor内部线程异常的四种方法,文中的示例代码讲解详细,感... 目录方案 1方案 2方案 3方案 4结论方案 1使用 execute + try-catch 记录

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

MySql死锁怎么排查的方法实现

《MySql死锁怎么排查的方法实现》本文主要介绍了MySql死锁怎么排查的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言一、死锁排查方法1. 查看死锁日志方法 1:启用死锁日志输出方法 2:检查 mysql 错误