重新刷新你对Redis集群的理解

Spring Boot集成Redis集群:Lettuce动态拓扑刷新实现高可用 在分布式系统中,缓存是提升性能的关键组件,而Redis作为高性能键值数据库,其集群模式是实现高可用与扩展性的核心方案。其原理基于哈希槽分片与主从复制,确保数据分布与故障转移。要实现真正的客户端高可用,技术关键在于集群拓扑的动态感知与更新。Lettuce客户端通过定期刷新与自适应刷新机制,能够在节点故障或数据迁移时实时更新连接信息,其技术价值在于保障应用在集群拓扑变更期间的连续性与稳定性,避免因连接信息陈旧导致的请求失败。这一机制在电商大促、金融交易、实时通讯等高并发、高可用的应用场景中尤为重要。本文聚焦于S 阅读详情

Redis集群

Redis 集群通过 分片 来进行数据共享,并提供复制和故障转移功能。

1. 节点

1.1 节点的握手

Redis 集群中各个节点使用 CLUSTER MEET 命令进行连接。

CLUSTER MEET <ip> <port>

向一个节点 node 发送 CLUSTER MEET 命令,可以让 node 节点与 ip 和 port 的指定节点进行 握手 。握手成功后,node 节点会将目标节点添加到 node 节点所在的集群中。

重复这个操作,可以让多个节点处于同一集群。

1.2 集群数据结构

  • clusterNode 结构 保存了一个节点的当前状态,包括节点创建时间、节点名字、节点配置纪元、节点 IP 地址和端口号等等。
  • clusterLink 结构 是 clusterNode 的一个属性,保存了连接节点所需的有关信息,比如套接字描述符、输入缓冲区和输出缓冲区等等。
  • clusterState 结构 被每个节点所保存,记录了当前节点视角下集群所处状态,例如集群是在线还是下线,集群包含多少个节点,集群当前的配置纪元等等。

1.3 CLUSTER MEET命令实现

收到命令的节点 A 将与目标节点 B 进行 握手 。

2. 槽指派

2.1 Redis中的槽

Redis 集群通过分片来保存数据库中的键值对,集群的整个数据库被分为 16384 个槽,数据库中的每个键都属于这 16384 个槽中的一个,集群中的每个节点可以处理 0 个或最多 16384 个槽。

当数据库中的 16384 个槽都有节点在处理,集群处于 上线状态 。如果有任何一个槽没有节点处理,那么集群处于 下线状态 。

通过向节点发送 CLUSTER ADDSLOTS 命令,我们可以将一个或多个槽指派给节点负责。例如以下命令可以将槽 0~5000 指派给节点 7000 负责:

127.0.0.1:7000> CLUSTER ADDSLOTS 0 1 2 3 4 ... 5000

2.2 记录节点的槽指派信息

clusterNode 结构的 slots 属性和 numslot 属性记录了节点负责处理哪些槽。

slotsnumslots

2.3 传播节点的槽指派信息

节点会将自己的 slots 数组通过消息发送给集群中的其他节点,告诉他们自己目前负责处理哪些槽。

当节点 A 通过消息从节点 B 那里接收到节点 B 的 slots 数组时,会在自己的 clusterState.nodes 字典中查找节点 B 对应的 clusterNode 结构,并进行更新。

3. 在集群中执行命令

上线状态的集群可以执行命令。

当客户端向节点发送命令时,接受命令的节点会检查命令要处理的数据库键属于哪个槽,并检查这个槽是否指派给了自己。

MOVED

3.1 计算键属于哪个槽

redis使用如下算法来计算给定的 key 属于哪个槽

def slot_number(key):return CRC16(key) & 16383

CRC16(key) 语句计算出 key 的 CRC-16 校验和,而 & 16383 计算出一个介于 0 和 16383 之间的整数作为key的槽号。

CLUSTER KEYSLOT 命令是根据上面的槽分配算法来实现的。

3.2 判断槽是否由当前节点负责

检查自己的 slots 数组中的对应位置即可。

3.3 MOVED错误

MOVED 错误的格式为:

MOVED <slot> <ip>:<port>

客户端可以根据 MOVED 错误,转向正确的节点。

3.4 节点数据库的实现

除了将键值对保存在数据里面外,节点还会用 clusterState 结构中的 slots_to_keys 跳跃表来保存槽和键之间的关系。

该跳表的每个节点的分值都是一个槽号。而每个节点的成员都是一个数据库键。

使用这个跳表,可以方便地对属于某些槽的所有数据库键进行批量操作。

4. 重新分片

4.1 重新分片流程

Redis 集群的重新分片操作可以令分派给某个槽的节点重新分派给另一个节点。重新分片可以在线进行,过程中集群不需要下线,且可以正常处理命令请求。

重新分片由 Redis 集群管理软件 redis-trib 负责执行。

重新分片流程如上图。如果要分片的槽属于多个节点,就要对多个节点发送命令。

4.2 ASK错误

重新分片期间可能出现一种情况:属于被迁移槽的一部分键值对保存在源节点里面,另一部分键值对保存在目标节点里面。

此时当客户端向源节点发送一个命令,并且要求处理的数据库键恰好正在被迁移:

  • 源节点现在自己的数据找,找到就直接发送命令。
  • 没找到就向客户端返回 ASK 错误,指引客户端转向目标节点执行命令。

一个 ASK 错误如下图所示:

收到 ASK 错误的客户端会根据错误提供的 IP 地址和端口号,转向目标节点,先向目标节点发送一个 ASKING 命令,之后再重新发送原本要执行的命令。

ASKING 命令可以打开发送该命令的客户端的 REDIS_ASKING 标识。这在服务端接收到后面的命令时有用。

正在进行重新分片的服务端判断发送请求的客户端的 ASKING 标识是否打开

  • 如果打开,该客户端的请求是一个槽分派时的重定向请求,正常执行。
  • 如果没打开,该客户端的请求是一个普通的寻址错误的命令请求,返回 MOVED 错误。

5. 复制和故障转移

Redis 集群中的主节点用于处理槽,从节点用于复制某个主节点,并且在被复制的主节点下线时接替它。

假如某个场景下服务器间的状态如下:

假如主服务器 7000 下线,那么剩余的主服务器即 7001、7002、7003 会从 7000 的两个从服务器 7004、7005 选择一个接管 7000 负责的槽。另一个从服务器会变成新主服务器的从服务器。

如果后续 7000 重新上线,它会变成 7004 的新主节点。

5.1 故障检测

集群中每个节点会定时向集群中的其它节点发送 PING 消息,以此检测对方是否下线。如果接收 PING 的节点没有在规定时间内返回 PONG 消息,就会被标记为 疑似下线 。

集群中的节点在别的节点的视角下有三种状态: 在线、疑似下线、已下线。

当一个主节点 A 通过消息得知主节点 B 认为主节点 C 进入疑似下线时,主节点 A 会在自己的 clusterState.nodes 字典中找到主节点 C 对应的 clusterNode 结构,并将主节点 B 的下线报告添加到 clusterNode 结构的 fail_reports 链表中。

如果在集群中,有一个主节点发现半数以上的主节点都将某个主节点 x 标记为意思下线,那么他将把这个主节点标记为已下线,并向其他所有节点广播 FAIL 消息。

5.2 故障转移

当一个从节点发现自己正在复制的主节点进入已下线状态时,从节点将开始对下线主节点进行故障转移操作:

  1. 第一个发现问题的主节点举行一个选举,要求自己称为新的主节点。选举的规则和 Sentinel 中选举领头 Sentinel 非常相似,他们都基于 Raft 算法的领头选举方法。
  2. 成功则称为新主节点
  3. 失败则等待下一个从节点提出选举。
  4. 被选中的从节点执行 SLAVEOF no one 命令,成为新的主节点。
  5. 新的主节点接管已下线主节点的全部槽指派。
  6. 新主节点广播 PONG 消息,让别的节点知道自己已经成为主节点。
  7. 新主节点开始行使主节点职责
ArcMap安装与配置全攻略:从下载到实战应用 本文提供了ArcMap 10.4.1从系统准备、详细安装到破解激活的完整指南,并包含首次启动的界面介绍与一个实战GIS分析项目。针对初学者,文章强调了在ArcGIS Pro成为趋势的当下,学习经典ArcMap对于理解核心概念和兼容现有工作流仍有重要价值,帮助用户避开安装常见陷阱,快速上手实战应用。 阅读详情

相关推荐

VSCode终端打不开?3分钟搞定Windows下Terminal配置(附最新JSON设置方法)

本文针对Windows系统下VSCode终端无法启动的常见问题,提供了详细的诊断与解决方案。核心在于更新已弃用的旧配置,采用最新的JSON设置方法,通过定义`terminal.integrated.profiles.windows`和指定`terminal.integrated.defaultProfile.windows`,快速修复并优化终端配置,实现三分钟内恢复正常使用。

flower的专栏 744

redis-cluster搭建及拓扑刷新java测试

redis集群模式拓扑刷新测试

诸葛小猿 2215

告别有线:用PVE直通无线网卡,打造一台真正的‘无线’Win10软路由/测试机

本文详细介绍了如何通过PVE直通无线网卡技术,构建全无线Win10软路由或测试机。从硬件选型、PVE环境配置到PCIe和USB双模直通技术,逐步指导实现Wi-Fi AP和蓝牙连接功能,为家庭实验室和小型办公环境提供灵活高效的网络解决方案。

weixin_28683689的博客 588

springboot集成redis集群实现集群拓扑动态刷新

一个redis-cluster的三主三从集群,在其中一个master节点挂了之后,springboot集成redis集群配置信息没有及时刷新,出现读取操作报错。下面聊聊如何实现springboot集成redis集群实现集群拓扑动态刷新。

ldcaws的专栏 8049

金融波动预测:GARCH模型实战解析与ARIMA对比

本文深入解析GARCH模型在金融波动预测中的实战应用,并与传统ARIMA模型进行对比。通过沪深300指数日收益率数据的案例分析,展示GARCH模型如何有效捕捉波动聚集效应,提升极端波动预测准确率。文章包含Python代码实现、参数解读及模型选择指南,为量化交易者提供实用的波动率建模解决方案。

weixin_29098367的博客 191

Visual Studio报错TRK0005找不到CL.exe?三步彻底解决环境变量问题

本文详细解析了Visual Studio报错TRK0005找不到CL.exe的根本原因,并提供了三步彻底解决环境变量问题的方案。从验证安装完整性到配置永久环境变量,再到注册表级修复,帮助开发者建立健壮的开发环境配置体系,确保编译链稳定运行。

weixin_30839881的博客 459

Spring Boot集成redis集群拓扑动态刷新

可以很方便的基于它来实现自己的对象池,比如 DBCP 和 Jedis 他们的内部对象池的实现就是依赖于 commons-pool2。springboot2.0-2.3版本默认使用lettuce,默认不支持属性配置集群拓扑刷新。使用lettuce,需要增加配置类,需要手动开启刷新。springboot2.3之后版本默认使用lettuce,默认支持属性配置开启集群拓扑刷新,其解决方案:属性配置开启即可。springboot1.x之前版本默认使用jedis,无需手动开启动态刷新。

涛哥是个大帅比 3757

家长必看!用RouterOS轻松屏蔽不良网站,保护孩子上网安全

本文为家长提供了一份详细的RouterOS路由器配置指南,旨在通过技术手段保护儿童上网安全。文章核心介绍了如何利用RouterOS的DNS静态条目功能,轻松实现禁止访问特定不良网站,并结合防火墙时间规则,为孩子构建一个纯净、可控的家庭网络环境,操作简单,无需专业背景。

weixin_28363123的博客 1269

Spring Boot集成redis集群拓扑

Spring Boot可以使用Spring Data Redis来集成Redis集群,支持动态刷新拓扑。在Redis集群中,节点的IP和端口可能会发生变化,因此需要动态刷新拓扑以保持连接。以上就是在Spring Boot中集成Redis集群并支持动态刷新拓扑的步骤。通过定时任务实现了定期刷新Redis集群的拓扑,保证了连接的可靠性。

wgq2020的博客 368

SAP 创建PO时提示“不能确定任何组件”

SAP 创建委外加工的PO时提示“不能确定任何组件” 而如果BOM已经创建了,但还是提示该错误保存。 解决办法:1. BOM selection 未配置好; 2. 由于Purchasing prosessing time的设置,如果PO中的delivery time - Purchasing prosessing time是过去的日期,那么会找不到BOM,BOM的有效期需早 于PO审批的有效期。 3. BOM未...

willieyuan的博客 6122

2024年游戏策划最新面试题及答案

1. **游戏策划**:负责游戏设计和开发的创意和技术过程。2. **主要职责**:设计游戏玩法、故事、角色、世界等。4. **游戏机制**:定义玩家如何与游戏世界互动的规则。13. **引人入胜的角色**:深入的背景故事、个性特征。3. **游戏平衡**:确保游戏公平、有趣且具有挑战性。7. **RPG特点**:角色发展、故事驱动、玩家选择。12. **关卡设计技巧**:挑战性、流动性、视觉引导。11. **游戏关卡设计**:创建游戏世界的不同阶段。5. **游戏循环**:玩家在游戏中重复的行为模式。

guo162308的博客 2321

springboot+redis集群实现集群拓扑动态刷新温故

springboot项目,并集成redis集群,当redis集群节点宕掉后又恢复了,但springboot调用redis集群服务报错,下面对springboot集成redis集群实现集群拓扑动态刷新进行温习和巩固。redis集群需要搭建3主3从,在搭建用于公司生产环境的集群时,搭建3主6从,这样不会一个节点宕机导致全部宕机,可靠性更高,会搭3主3从就会搭3主6从。springboot2.3 以后加上下面配置可自动刷新拓扑,某节点挂掉后,会有新的主从关系,如果不配置,调用接口时程序会报错。

ldcaws的专栏 1744

【超详细】MIT 液态神经网络(LNNs)——深度学习新动向

输入可以是任何形式的时间序列数据,其中表示时间。例如传感器读数、金融市场数据、语音信号等。

allein_STR的博客 2613

Linux系统搭建Redis集群(redis-cluster)

工具准备 Linux图形化工具为Xftp,shell工具为Xshell 1. Redis集群相关概念 redis-cluster架构图 redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护 redis 集群中内置了 16384 个哈希槽,当需要在 redis 集群中放置一个 key-value 时,redis 先对 key 使用 c...

FantasticPan的博客 2325

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

redis集群搭建及遇到的问题

首先看之前笔记安装redis(可以不安装,去redis的github上copy源码编译)。 Redis群集配置参数 我们即将创建一个示例集群部署。在继续之前,让我们介绍Redis Cluster在redis.conf文件中引入的配置参数。有些人会很明显,有些人会在你继续阅读时更清楚。 cluster-enabled<yes/no>:如果是,则在特定Redis实例中启用Redis群...

霓虹深处 5365

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【黑马点评日记02】Redis解决Tomcat集群Session共享问题

本文探讨了高并发环境下Tomcat集群的Session共享问题及解决方案。传统Session存储在单机Tomcat内存中,导致集群环境下用户需重复登录。通过引入Redis作为分布式Session存储,实现了多台Tomcat间的Session共享。文章详细对比了单机Session和分布式Session架构的区别,分析了Token架构的优势及适用场景,并提供了黑马点评项目从Session架构改造为Token架构的具体实现方案,包括登录校验接口改造、拦截器调整和前端配合改动等核心步骤。改造后的Token架构具备无

任岁月风干理想再也找不回真的我 1731

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Redis 集群模式

一、集群模式介绍 Redis Cluster 是 Redis 官方提供的分布式实现,在 Redis 3.0 版本正式推出,通过集群模式可以扩展单机的性能瓶颈,同时也可以通过横向扩展来实现扩容。此外,Redis 集群模式还提供了副本迁移机制,用于保证数据的安全和提高集群的容错能力,从而实现高可用。 1.1 数据分区 Redis Cluster 采用虚拟槽进行分区,槽是集群内数据管理和迁移的基本单位。...

黑白影的博客 641
上一篇: 困扰我的问题,我用 SpringBoot+Redis 解决了!
下一篇: 还记得我们一起优化的SQL吗?
Java_ttcd
博客等级 码龄4年 198粉丝 190原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值