日志分析
日志显示核心错误是 Redisson 加锁时发生 StacklessClosedChannelException,表明 Redis
客户端(Redisson)与 Redis 服务器的连接通道已关闭,但客户端仍尝试写入数据(加锁操作),导致加锁失败。
错误原因分析
StacklessClosedChannelException 是 Netty(Redisson 底层依赖的网络框架)抛出的异常,通常意味着:
- 客户端与 Redis 服务器的 TCP 连接已被意外关闭(可能是 Redis 服务端主动断开,或网络中断)。
- 客户端未检测到连接关闭,仍尝试通过已关闭的通道发送命令(如 tryLock 加锁命令)。
结合之前的背景,可能的诱因包括:
- Redis 服务端不稳定:因 AOF 权限问题反复报错,导致 Redis 进程频繁重启或连接被强制关闭。
- 连接超时或闲置时间过长:Redisson 配置的连接超时、闲置时间过短,Redis 主动断开闲置连接。
- 网络波动:Kubernetes 集群内网络不稳定,Pod 间通信偶尔中断。
- Redis 资源不足:内存、CPU 占用过高,导致无法处理新连接。
排查步骤
检查 Redis 服务端状态(优先确认)
确保 Redis 服务器本身运行稳定,无频繁重启或资源瓶颈:
# 查看 Redis Pod 状态(是否频繁重启)
kubectl get pods -n dcrm-system | grep redis-new
# 若 RESTARTS 次数不为 0,说明频繁重启,需查看原因
# 查看 Redis 服务器日志(是否有崩溃、连接拒绝等错误)
kubectl logs -f <redis-pod-name> -n dcrm-system
# 重点关注是否有 OOM(内存溢出)、权限错误导致的进程退出
# 检查 Redis 资源使用情况(是否内存/CPU 不足)
kubectl top pod <redis-pod-name> -n dcrm-system
- 若 Redis 频繁重启:需先解决之前的 AOF 权限问题(彻底修复写入权限,避免进程因错误退出)。
- 若资源不足:在 Deployment 中增加 Redis 的资源限制(resources.limits)。
检查 Redisson 客户端配置(连接参数)
Redisson 连接配置不当(如超时时间过短、连接池设置不合理)会导致连接不稳定。需检查应用的 Redisson 配置(通常在
application.yml 或 redisson.yml 中):
spring:
redis:
redisson:
config: |
singleServerConfig:
address: "redis://redis-new.dcrm-system.svc.cluster.local:6379" # 使用 Kubernetes Service 域名(稳定)
connectionMinimumIdleSize: 5 # 最小空闲连接数(避免频繁创建连接)
connectionPoolSize: 10 # 连接池大小(根据并发调整)
idleConnectionTimeout: 30000 # 闲置连接超时(30秒,超过则关闭)
connectTimeout: 10000 # 连接超时(10秒,避免快速失败)
timeout: 3000 # 命令执行超时(3秒)
retryAttempts: 3 # 失败重试次数
retryInterval: 1000 # 重试间隔(1秒)
- 使用 Service 域名:避免直接使用 Pod IP(可能因重启变化),通过 redis-new.dcrm-system.svc.cluster.local 访问(Kubernetes 内部 DNS 解析)。
- 调大超时参数:idleConnectionTimeout、connectTimeout 过小会导致连接被过早关闭,建议根据实际网络情况调整。
总结
当前问题是 Redis 连接不稳定(频繁断开) 导致的 Redisson 加锁失败,而连接不稳定很可能是之前 Redis
权限问题未彻底解决(导致 Redis 进程重启或连接被拒)的后续影响。解决优先级:
- 彻底修复 Redis AOF 写入权限问题(确保 Redis 进程稳定运行,无频繁重启)。
- 优化 Redisson 连接配置(调大超时参数、使用 Service 域名)。
1211

被折叠的 条评论
为什么被折叠?



