lettuce连接哨兵redis,主从切换异常,如何解决??

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

问题描述

工作中开发项目使用到了spring-boot-starter-data-redis,底层使用lettuce客户端连接redis,在配置文件中配置哨兵相关信息,默认使用redistemplate。在连接哨兵redis时,手动在redis主从节点执行slaveof no one 和slaveof ip port,进行主从切换,哨兵后续也有感知,发送了+switch-master,但是我的客户端未正常感知,连接还是旧节点,对从节点进行了写操作出现了ReadOnly异常,debug看到连接的还是旧节点,但是在哨兵节点执行sentinel failover masterid 客户端却可以重新连接到新的主节点,进行正常的key set、get命令操作,两种方式在哨兵log中都有看到向+switch-master发送了新的主节点信息,该怎么解决这个问题呢?

lettuce:6.1.4.RELEASE

springboot:2.3.7.RELEASE

1主1从3哨兵redis

解决方案

如下是上述问题的解决方案,仅供参考:

在使用Lettuce连接Redis哨兵时,遇到主从切换异常的问题,通常是由于客户端未能正确感知哨兵的主从切换,导致连接仍指向旧的主节点。你已经描述了具体场景,包括手动切换主从时客户端未能感知新主节点的问题,以及在强制failover时客户端可以正常切换。以下是一些可能的解决方案和调试建议:

1. 确保哨兵配置正确

  • 确保Redis哨兵配置文件中的down-after-millisecondsfailover-timeout等参数设置合理,以便哨兵能够快速感知并进行主从切换。
  • 检查哨兵配置中的quorum值,确保当主节点出现问题时,哨兵可以快速达成一致并进行切换。

2. 使用正确的Lettuce和Spring Boot配置

确保Spring Boot和Lettuce的配置文件正确。特别是确保以下配置项:

yaml 复制代码
spring:
  redis:
    sentinel:
      master: your-master-name
      nodes: host1:26379,host2:26379,host3:26379
    lettuce:
      pool:
        max-active: 8
        max-wait: -1ms
        max-idle: 8
        min-idle: 0

3. 升级Lettuce和Spring Boot版本

  • 尝试升级到最新版本的Lettuce和Spring Boot,因为新版本中可能修复了相关的Bug。对于你的版本(Lettuce 6.1.4 和 Spring Boot 2.3.7),虽然这些版本相对较新,但仍然建议检查并使用最新的稳定版本。

4. 调试与监控连接

  • 使用Lettuce的CommandListener或者EventBus监听器监控客户端与Redis的交互,特别是与哨兵的交互。当哨兵进行主从切换时,查看客户端是否接收到相应的事件。
  • 添加日志监控Lettuce的连接情况,可以在application.propertiesapplication.yml文件中增加日志级别:
properties 复制代码
logging.level.io.lettuce.core=DEBUG

5. Lettuce Redis Sentinel Connection Configuration

配置Lettuce的ClientResourcesSocketOptions,以确保客户端能够快速感知网络变动并重连:

java 复制代码
ClientResources clientResources = DefaultClientResources.builder()
    .commandLatencyPublisherOptions(CommandLatencyPublisherOptions.disabled())
    .build();

SocketOptions socketOptions = SocketOptions.builder()
    .connectTimeout(Duration.ofSeconds(10))
    .keepAlive(true)
    .build();

RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
    .master("your-master-name")
    .sentinel("host1", 26379)
    .sentinel("host2", 26379)
    .sentinel("host3", 26379);

LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(sentinelConfig, lettuceClientConfiguration);
lettuceConnectionFactory.setShareNativeConnection(false);
lettuceConnectionFactory.afterPropertiesSet();

确保lettuceConnectionFactory.setShareNativeConnection(false);,避免Lettuce客户端复用连接。

6. 哨兵故障切换与客户端刷新

  • 强制刷新连接池:当你发现主从切换后客户端未更新时,可以手动刷新Lettuce连接池:
java 复制代码
lettuceConnectionFactory.resetConnection();

7. 哨兵配置与故障恢复机制

  • 检查哨兵的min-slaves-to-writemin-slaves-max-lag配置,确保在主从切换后系统能够正常写操作,并快速恢复。

8. 其他可能的调试点

  • 使用INFO replication命令查看当前的主从状态,确认哨兵感知的主从信息与客户端一致。
  • 监控哨兵日志,查看是否有异常事件,尤其是连接或感知相关的异常。

如果上述方法依然无法解决问题,可以考虑使用Spring Boot的其他Redis客户端(如Jedis),或者在Redis的侧重新配置参数来确保主从切换的可靠性。

希望如上措施及解决方案能够帮到有需要的你。

PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。

若有对当前Bug有与如下提供的方法不一致,有个不情之请,希望你能把你的新思路或新方法分享到评论区,一起学习,目的就是帮助更多所需要的同学,正所谓「赠人玫瑰,手留余香」。

☀️写在最后

如上问题有的来自我自身项目开发,有的收集网站,有的来自读者...如有侵权,立马删除。再者,针对此专栏中部分问题及其问题的解答思路或步骤等,存在少部分搜集于全网社区及人工智能问答等渠道,若最后实在是没能帮助到你,还望见谅!并非所有的解答都能解决每个人的问题,在此希望屏幕前的你能够给予宝贵的理解,而不是立刻指责或者抱怨!如果你有更优解,那建议你出教程写方案,一同学习!共同进步。

ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏《CSDN问答解惑-专业版》,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。

码字不易,如果这篇文章对你有所帮助,帮忙给 bug菌 来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。
同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!

📣关于我

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。


相关推荐
薛晓刚31 分钟前
当MySQL的int不够用了
数据库
SelectDB技术团队1 小时前
Apache Doris 在菜鸟的大规模湖仓业务场景落地实践
数据库·数据仓库·数据分析·apache doris·菜鸟技术
星空下的曙光1 小时前
mysql 命令语法操作篇 数据库约束有哪些 怎么使用
数据库·mysql
小楓12011 小时前
MySQL數據庫開發教學(一) 基本架構
数据库·后端·mysql
白仑色1 小时前
Spring Boot 全局异常处理
java·spring boot·后端·全局异常处理·统一返回格式
染落林间色1 小时前
达梦数据库-实时主备集群部署详解(附图文)手工搭建一主一备数据守护集群DW
数据库·sql
Monly212 小时前
RabbitMQ:SpringAMQP 入门案例
spring boot·rabbitmq·java-rabbitmq
Monly212 小时前
RabbitMQ:SpringAMQP Fanout Exchange(扇型交换机)
spring boot·rabbitmq·java-rabbitmq
每天学习一丢丢2 小时前
Spring Boot + Vue 项目用宝塔面板部署指南
vue.js·spring boot·后端
颜颜yan_2 小时前
企业级时序数据库选型指南:从传统架构向智能时序数据管理的转型之路
数据库·架构·时序数据库