重新刷新你对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 属性记录了节点负责处理哪些槽。

slots
numslots

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. 新主节点开始行使主节点职责
wxComboBox类的使用方法及示例代码 其中,parent表示该控件的父窗口,ID_COMBOBOX是该控件的ID,用于在事件处理函数中区分不同的控件,"默认选项"是下拉列表框的默认选项,options是wxArrayString类型的数组,用于存储下拉列表框中的选项,style可以指定wxComboBox的样式。wxComboBox是wxWidgets中的一个常用控件,它可以被用来显示一组在下拉列表框中的选项,并允许用户从中选择一个选项。上述就是wxComboBox类的基本使用方法,使用这个控件可以方便地实现下拉列表框的功能。 阅读详情

相关推荐

DMR对讲机的基本概念理解

刚刚入手DMR对讲机,尚未成功联通。国内互联网上能找到的资料很少,大多数也都是一些DMR协议介绍之类的玩意,对实际操作没有指导意义。以下全部是这几天在网上研究各种资料得出的个人思考,如有错误请斧正。 相比与模拟通讯系统,DMR将语音信号转换为包的形式进行收发。将DMR对比成TCP/IP系统会更容易理解。 一般DMR对讲机都支持模数双通,说明DMR应该使用了跟FM同样的无线AP组件,只在解码上有区别。对讲机先使用DMR进行数字解码,解码成功则说明是数字信号,不成功则使用模拟方式再次进行解码。可以对等理解为

1万+

redis cluster

redis cluster

SO_zxn的博客 1839

PHY6252开发实战:从零构建BLE串口透传应用

本文详细介绍了PHY6252开发板在BLE串口透传应用中的实战经验,包括开发环境搭建、BLE串口透传例程解析、AT指令集实现与扩展、数据透传机制优化以及常见问题排查指南。通过智能家居遥控器项目案例,展示了PHY6252在低功耗物联网设备开发中的实际应用。

weixin_29183637的博客 314

Redis集群

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 Redis集群 Redis 集群通过分片来进行数据共享,并提供复制和故障转移功能。 1. 节点 1.1 节点的握手 Redis 集群中各个节点使用 CLUSTER MEET 命令进行连接。 CLUSTER MEET <ip> <port> 向一个节点

www_xuhss_com的博客 199

嵌入式模拟电路面试题大全及参考答案(持续更新)

高输入阻抗:由于晶体管的基极-发射极(BJT)或栅极-源极(MOSFET)电压很低,跨导放大器具有很高的输入阻抗。低输出阻抗:晶体管的集电极-发射极或漏极-源极电阻较低,提供较低的输出阻抗。电压控制:输入信号控制晶体管的跨导,从而控制输出电流。晶体管:作为放大器的核心,可以是BJT或MOSFET。偏置电路:为晶体管提供稳定的工作点,确保其在放大区域内工作。负载电阻:与晶体管的集电极或漏极连接,将电流转换为电压。晶体管的选择:根据所需的增益、速度和功率消耗选择合适的晶体管。偏置稳定性。

大模型大数据攻城狮的专栏 989

OpenClaw实战系列·进阶特辑02:多智能体协同——打造企业级AI中台

**企业级AI中台面临多Agent协同的挑战,本文提出基于多智能体协同的解决方案。通过分析单Agent的局限性(上下文溢出、专业度稀释等)和多Agent的核心优势(任务专注度、故障隔离等),提出三种协作架构模式(指挥型、联邦型、点对点型),并强调人格化设计的重要性。文章详细介绍Agent间通讯机制(同步/异步会话、文件系统协作)和"身脑分离"的解耦架构设计,提供可落地的企业级AI中台实施方案。

PeterPan的博客 495

redisson 重连失败问题分析

1 问题背景 本司在技术框架使用的spring cloud,redis client为redisson,部署在腾讯云上,通过专线连接的本地redis。 问题原因:因为未知原因,腾讯云专线断了不少时间,期间使用VPN进行连接,发现了有发送redis失败的情况,在中午的时候专线好了,但是redisson没有进行重连;理论上,redisson是有重连机制的,并且在日常开发测试中,是遇到过这种情况的...

weixin_43830816的博客 1万+

智能硬件产品:做好一款电子硬件产品,工具必不可少

上到战略规划,中至运营策略,下至人性洞察,。最初做产品时,笔者从一开始就陷入到了对工具的痴迷,包括:PS、AutoCAD、PROE、犀牛、Axure、Keyshot、Altium……大概将 2 个多月的时间和精力都消耗在了学习使用工具上。通过工具的运用也确实提高了工作效率,在仅有创意的前提下通过灵活运用工具,一年内便成功申请了多个实用新型专利、设计了多款产品的高保真原型图等。正在上传…重新上传取消。

产品线负责人 1445

java 培训 redis 集群原理分享

一、Redis 集群介绍: 1、为什么需要 Redis 集群? 在讲 Redis 集群架构之前,我们先简单讲下 Redis 单实例的架构,从最开始的一主 N 从,到读写分离,再到 Sentinel 哨兵机制,单实例的 Redis 缓存足以应对大多数的使用场景,也能实现主从故障迁移。 但是,在某些场景下,单实例存 Redis 缓存会存在的几个问题: (1)写并发: Redis 单实例读写分离可以解决读操作的负载均衡,但对于写操作,仍然是全部落在了 master 节点上面,在海量数据高并发

m0_70565884的博客 343

WorkBuddy 连接百度网盘:能查能上传,但别指望 AI 帮你下载

本文介绍了如何通过WorkBuddy连接百度网盘实现文件管理功能。首先需要在百度开放平台创建应用并获取AppKey等凭证,然后通过拼接授权URL获取Access Token并填入WorkBuddy。实际测试表明,该连接器支持查看目录结构、搜索文件及上传文档,但无法实现文件下载和创建分享链接,原因是百度网盘MCP Server未提供相关接口。使用前需明确功能限制,该方案适合需要远程查阅网盘内容但不涉及下载的场景。

u011186532的专栏 2013

【ROS2】手眼标定:moveit2_handeye_calib使用详解

moveit2_handeye_calib MoveIt2 官方的 手眼标定功能包,包含标定插件、图形化界面和示例程序。提供基于 ArUco/ChArUco 标定板的采集与求解功能。标定板下载aruco在线生成器。

郭老二 248

Redis 3.2.1集群 —— CLUSTER MEET ip port

CLUSTER MEET命令被用来连接不同的开启集群支持的 Redis 节点,以进入工作集群。 基本的思想是每个节点默认都是相互不信任的,并且被认为是未知的节点,以便万一因为系统管理错误或地址被修改,而不太可能将多个不同的集群节点混成一个集群。 因此,为了使给定的节点能将另一个节点接收到组成 Redis Cluster 的节点列表中,这里只有两种方法: 系统管理员发送一个CLUSTE

yifanSJ的博客 2046

麻辣香锅病毒分析

Spicy Hot Pot浏览器劫持病毒(麻辣香锅病毒)从2020年初被安全公司监测到,因其病毒模块带有MLXG_KM被安全行业代称麻辣香锅病毒。目前通过各种激活工具传播, 包括暴风激活、小马激活和KMS激活等诸多工具,疑似与下载站进行合作推广此类激活工具。Spicy Hot Pot 是一个浏览器劫持 Rootkit,它会将用户的主页更改为指向恶意软件操作员控制的页面,此外还会将内存转储从机器上传到预定义的服务器,并结合本地更新功能以确保其保持更新。通常浏览器劫持者会通过更改用户主页的恶意可执行文件或注册表

不忘初心,护天下安全! 4792

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

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

ssm框架搭建

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

redis集群搭建及遇到的问题

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

霓虹深处 5365

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

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

蓝牙模块HM-10手册

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

Redis 集群模式

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

黑白影的博客 641
上一篇: 一次 Spring 无法启动的问题排查(字节码篇)
下一篇: 刨根问底:Kafka 到底会不会丢数据?
JavaShark
博客等级 码龄4年 184粉丝 438原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值