You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Redisson客户端连接AWS Redis集群时出现间歇性连接拒绝错误

间歇性连接AWS Redis集群被拒绝的排查与解决

问题背景

Spring Boot 2.5.5 + Java 1.8 + Redisson 3.17.5部署在Kubernetes Pod中,首次启动可正常建立24个连接至AWS Redis集群,但Pod重启时偶尔触发Connection refused错误。AWS侧确认Redis集群无异常,升级io.netty至4.1.79-Final后问题仍存在。

连接初始化代码:

Config config = new Config(); 
config.useSingleServer() 
    .setAddress(<Redis URL>) 
    .setTimeout(30 * 1000); // 超时30秒
Redisson.create(config);

核心报错片段:

org.redisson.client.RedisConnectionException: Unable to connect to Redis server: <Redis URL>
...
Caused by: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: <Redis URL>
Caused by: java.net.ConnectException: Connection refused

排查方向与解决方案

1. 优化Redisson连接池初始化策略

Redisson默认连接池逻辑可能在Pod重启时瞬间发起大量连接请求,触发Redis限流或Pod网络限制。可通过以下配置调整:

  • 匹配首次成功的连接池大小,保留最小空闲连接减少重启时的连接创建量
  • 增加连接重试次数与间隔,降低单次连接失败的影响
  • 单独设置连接超时,避免整体阻塞

修改后配置示例:

Config config = new Config(); 
config.useSingleServer() 
    .setAddress(<Redis URL>) 
    .setTimeout(30 * 1000)
    .setConnectionPoolSize(24) // 与首次成功连接数一致
    .setConnectionMinimumIdleSize(8) // 保留部分空闲连接
    .setRetryAttempts(5) // 增加重试次数
    .setRetryInterval(1000) // 重试间隔1秒
    .setConnectTimeout(10 * 1000); // 单个连接建立超时
Redisson.create(config);

2. 处理Kubernetes Pod网络初始化延迟

Pod重启时网络接口可能未完全就绪,应用就发起连接请求。可通过两种方式规避:

  • 在Deployment中配置readinessProbe和livenessProbe,确保Pod网络就绪后再启动应用
  • 给应用添加启动延迟,或在代码中增加连接前的网络可达性检测

示例Probe配置:

readinessProbe:
  tcpSocket:
    host: <Redis URL主机部分>
    port: <Redis端口>
  initialDelaySeconds: 10
  periodSeconds: 5
livenessProbe:
  tcpSocket:
    host: <Redis URL主机部分>
    port: <Redis端口>
  initialDelaySeconds: 30
  periodSeconds: 10

3. 验证AWS Redis网络配置

即使AWS确认集群无异常,仍需检查:

  • Pod所在VPC与Redis集群VPC的路由表是否存在更新延迟
  • Redis安全组是否允许Pod所在CIDR段的连接(重启后Pod IP可能变化,避免用固定IP配置安全组)
  • Redis的maxclients参数是否足够,重启时的连接峰值是否触发上限

4. 升级Redisson版本

Redisson 3.17.5存在部分连接池相关的已知问题,升级到3.21.x等稳定新版本可能修复此类间歇性问题。注意:Redisson自带适配的Netty版本,手动升级Netty可能引发兼容性问题,建议依赖Redisson自带的Netty包。

5. 开启Redisson连接日志

启用DEBUG级别的连接日志,便于定位问题触发时机:

config.setLogger(Logger.SLF4J);

同时在日志配置文件(如logback.xml)中添加:

<logger name="org.redisson" level="DEBUG"/>

内容的提问来源于stack exchange,提问作者user5338376

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 19:50:17