当前位置: 首页 > article >正文

解决Redisson在Kubernetes中连接旧Redis主节点的问题

问题背景

在Kubernetes集群中部署了Redis哨兵模式,版本为7.0.12。Java微服务使用Redisson客户端连接Redis集群,Redisson版本为3.17.5。当Redis发生主备切换后,Redisson仍然连接到旧的主节点IP,导致以下报错信息:

Unable to unfreeze entry: [freeSubscribeConnectionsAmount=0, freeSubscribeConnectionsCounter=value:133527:queue:0, freeConnectionsAmount=0, freeConnectionsCounter=value:267154:queue:0, freezeReason=SYSTEM, client=[addr=redis://0.0.0.0:6379], nodeType=MASTER, firstFail=0]

解决方案

升级Redisson版本

经过排查和测试,发现将Redisson版本从3.17.5升级到3.32.0可以解决问题。新版本的Redisson能够正确处理Redis主备切换,并自动更新连接到新的主节点。

进一步升级遇到的问题

为了确保使用最新的稳定版本,尝试将Redisson升级到3.44.0。然而,在启动应用时遇到了新的错误:

Factory method 'getRedissonClient' threw exception; nested exception is java.lang.NoClassDefFoundError: io/netty/channel/unix/DomainSocketAddress

分析与解决

该错误是由于Netty库版本不兼容引起的。io.netty.channel.unix.DomainSocketAddress类是在Netty 4.1.58.Final及以上版本中引入的。因此,需要确保项目的依赖项中包含正确的Netty版本。

模拟主备切换

为了验证Redisson在主备切换时的行为,可以手动触发Redis主备切换并观察Redisson的响应。以下是模拟主备切换的步骤:

关闭当前主节点: 在Redis主节点的Pod中执行以下命令以关闭Redis服务:

kubectl exec -it <redis-master-pod-name> -- redis-cli shutdown

手动触发主备切换: 如果需要手动触发主备切换,可以在哨兵Pod中执行以下命令:

kubectl exec -it <redis-sentinel-pod-name> -- redis-cli -p <sentinel-port> sentinel failover <master-name>

其中<sentinel-port>是哨兵监听的端口(默认为26379),<master-name>是Redis主节点的名称。

kubectl exec -it <redis-sentinel-pod-name> -- redis-cli -p <sentinel-port> sentinel get-master-addr-by-name <master-name>

该命令将返回新的主节点的IP地址和端口。

总结

本次问题的根本原因在于Redisson版本过低,无法正确处理Redis主备切换。升级Redisson版本后,虽然遇到了新的依赖问题,但通过调整Netty版本得以解决。建议在选择第三方库时,尽量使用最新稳定版本以避免潜在的兼容性问题。通过模拟主备切换,可以更好地验证Redisson在实际环境中的表现。


http://www.kler.cn/a/539422.html

相关文章:

  • Json-RPC框架项目(一)
  • 【MQ】Spring3 中 RabbitMQ 的使用与常见场景
  • 在 Open WebUI+Ollama 上运行 DeepSeek-R1-70B 实现调用
  • 01_Machine Vision_LSI及傅立叶变换
  • 全国路网矢量shp数据(分不同类型分省份)
  • 1.2 变革里程碑:Transformer 的崛起
  • Vue3 进阶-自定义事件用法全解析 ✨
  • 大语言模型需要的可观测性数据的关联方式
  • LeetCode热题100-最大子数组和【JavaScript讲解】
  • webpack配置之---output.filename
  • 【DeepSeek】私有化本地部署图文(Win+Mac)
  • Windows编程:在 VS2010 里面,打开一个项目
  • #渗透测试#批量漏洞挖掘#WookTeam searchinfo SQL注入漏洞
  • Vue 3 中的 reactive 和 ref 有什么区别?
  • IDEA关联Tomcat,部署JavaWeb项目
  • kafka服务端之延时操作实现原理
  • NLP论文速读(ICLR 2025)|在实时机器翻译中对齐人类偏好
  • 基于spring boot的餐厅点餐管理系统设计与实现(LW+源码+讲解)
  • 设计模式
  • 所以尼!什么是边缘计算?这和云计算有什么关系?
  • 移动电视盒MGV2000刷安卓及Armbian笔记
  • vue 中 props 的使用,保姆教程
  • 火语言RPA--网址/图片地址获取
  • 生成式聊天机器人 -- 基于Pytorch + Global Attention + 双向 GRU 实现的SeqToSeq模型 -- 上
  • CodeReview-checkList-Java版
  • GOland的context的使用