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捕获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 错误

MySQL的cpu使用率100%的问题排查流程

《MySQL的cpu使用率100%的问题排查流程》线上mysql服务器经常性出现cpu使用率100%的告警,因此本文整理一下排查该问题的常规流程,文中通过代码示例讲解的非常详细,对大家的学习或工作有一... 目录1. 确认CPU占用来源2. 实时分析mysql活动3. 分析慢查询与执行计划4. 检查索引与表

MYSQL事务死锁问题排查及解决方案

《MYSQL事务死锁问题排查及解决方案》:本文主要介绍Java服务报错日志的情况,并通过一系列排查和优化措施,最终发现并解决了服务假死的问题,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录问题现象推测 1 - 客户端无错误重试配置推测 2 - 客户端超时时间过短推测 3 - mysql 版本问

Spring Boot统一异常拦截实践指南(最新推荐)

《SpringBoot统一异常拦截实践指南(最新推荐)》本文介绍了SpringBoot中统一异常处理的重要性及实现方案,包括使用`@ControllerAdvice`和`@ExceptionHand... 目录Spring Boot统一异常拦截实践指南一、为什么需要统一异常处理二、核心实现方案1. 基础组件

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

golang1.23版本之前 Timer Reset方法无法正确使用

《golang1.23版本之前TimerReset方法无法正确使用》在Go1.23之前,使用`time.Reset`函数时需要先调用`Stop`并明确从timer的channel中抽取出东西,以避... 目录golang1.23 之前 Reset ​到底有什么问题golang1.23 之前到底应该如何正确的

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

Python中异常类型ValueError使用方法与场景

《Python中异常类型ValueError使用方法与场景》:本文主要介绍Python中的ValueError异常类型,它在处理不合适的值时抛出,并提供如何有效使用ValueError的建议,文中... 目录前言什么是 ValueError?什么时候会用到 ValueError?场景 1: 转换数据类型场景