Redisson 3.18.0版本解决failover相关问题

2024-02-28 19:36

本文主要是介绍Redisson 3.18.0版本解决failover相关问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

Redisson 在历史多个版本都出现了failover期间报错的问题并且目前没有一个版本可以完全解决这个问题,所以在当前使用版本3.18.0基础上做了二次开发,达到降低业务由于redis遇到问题导致不可用。

背景

Redisson 作为业务线使用的Redis 客户端,在处理 Redis 高可用架构中的故障转移(failover)时面临着特定的挑战。

特别是当 Redis 新的 slave 节点启动并加载数据集到内存中时,客户端可能会遇到 LOADING 错误,从而导致读取操作失败。

这种情况通常出现在 Redis 服务器启动或数据重新加载时,服务器在加载数据集期间,会返回 LOADING 错误,表示暂时无法处理命令。

Redisson 在接收到这一错误后,会抛出 RedisLoadingException 异常,表明 Redis 服务器目前不可用。

优化方案

为了优化 Redisson 在 failover 过程中的行为,以提高读取操作的成功率和系统的整体稳定性,我们提出以下优化策略:

  1. 故障转移时间记录与主节点读取路由

    • 目标:确保在故障转移窗口期间,所有的读取操作都被路由到主节点,以避免由于 slave 节点数据未完全同步而引发的读取错误。
    • 实施策略
      • 在 Redisson 客户端中,增加一个机制来记录每个分片的最后一次故障转移的时间(updateLastFailoverTime)。
      • 当检测到故障转移事件时,更新该时间戳,并在接下来的一段时间内(例如,故障转移窗口期),将所有读取请求强制路由到主节点。
  2. 新 Slave 节点加入时间记录与读取路由控制

    • 目标:避免在新 slave 节点数据未完全加载完成时,将读取请求路由到该节点,减少因数据不一致或加载状态导致的读取失败。
    • 实施策略
      • 在 Redisson 客户端中,对于每个 Redis 分片的 slave 节点,记录其加入集群的时间(addSlaveJoinTime)。
      • 当有新的 slave 节点加入时,更新该节点的加入时间。在节点数据加载期间,避免将读取请求路由到该新 slave 节点。
实现细节
  • 对于 Redisson 客户端的修改,需要在其内部维护故障转移时间和新 slave 节点加入时间的状态信息。这涉及到对 Redisson 的连接管理器(ClusterConnectionManager)进行扩展,以便它能够处理额外的逻辑判断。
  • 对于读取操作的路由逻辑,可以在执行命令之前进行检查,根据当前时间与记录的故障转移时间或新 slave 节点的加入时间进行比较,决定是否将请求路由到主节点或现有的 slave 节点。

代码变更:

redisson配置:更短的超时时间增加检测敏感度

spring:redis:redisson:config: |clusterServersConfig:masterConnectionMinimumIdleSize: 8slaveConnectionMinimumIdleSize: 8idleConnectionTimeout: 10000connectTimeout: 3000timeout: 1000retryAttempts: 3retryInterval: 500failedSlaveReconnectionInterval: 30000failedSlaveCheckInterval: 60000

这篇关于Redisson 3.18.0版本解决failover相关问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/756409

相关文章

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

idea npm install很慢问题及解决(nodejs)

《ideanpminstall很慢问题及解决(nodejs)》npm安装速度慢可通过配置国内镜像源(如淘宝)、清理缓存及切换工具解决,建议设置全局镜像(npmconfigsetregistryht... 目录idea npm install很慢(nodejs)配置国内镜像源清理缓存总结idea npm in

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

idea突然报错Malformed \uxxxx encoding问题及解决

《idea突然报错Malformeduxxxxencoding问题及解决》Maven项目在切换Git分支时报错,提示project元素为描述符根元素,解决方法:删除Maven仓库中的resolv... 目www.chinasem.cn录问题解决方式总结问题idea 上的 maven China编程项目突然报错,是

在Ubuntu上打不开GitHub的完整解决方法

《在Ubuntu上打不开GitHub的完整解决方法》当你满心欢喜打开Ubuntu准备推送代码时,突然发现终端里的gitpush卡成狗,浏览器里的GitHub页面直接变成Whoathere!警告页面... 目录一、那些年我们遇到的"红色惊叹号"二、三大症状快速诊断症状1:浏览器直接无法访问症状2:终端操作异常

mybatis直接执行完整sql及踩坑解决

《mybatis直接执行完整sql及踩坑解决》MyBatis可通过select标签执行动态SQL,DQL用ListLinkedHashMap接收结果,DML用int处理,注意防御SQL注入,优先使用#... 目录myBATiFBNZQs直接执行完整sql及踩坑select语句采用count、insert、u

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型: