百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

重新刷新你对Redis集群的理解(刷新redis缓存命令)

mhr18 2024-11-13 11:09 25 浏览 0 评论

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) 语句计算出 keyCRC-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. 新主节点开始行使主节点职责

原文 https://www.cnblogs.com/WangXianSCU/p/15898007.html

相关推荐

2025最新指南:Quarkus整合Redisson,轻松玩转分布式锁!

分布式系统的高并发场景下,如何确保资源操作的原子性和一致性?Redisson作为Redis官方推荐的分布式锁方案,结合Quarkus的云原生特性,能实现高性能、低延迟的分布式锁管理。本文将从原理到实战...

Linux进程上下文切换过程context_switch详解

1前言1.1Linux的调度器组成2个调度器可以用两种方法来激活调度一种是直接的,比如进程打算睡眠或出于其他原因放弃CPU另一种是通过周期性的机制,以固定的频率运行,不时的检测是否有必要因此...

开发10年面试过上千人,在网易面试Java程序员,我最爱问这些问题

在网易当了3年的面试官,一般在面试Java程序员的时候,我主要会从这几个角度,去问这些问题,在这篇文章中,我会用我上一位面试过程来为大家总结,我面试的时候爱问的这些问题!有需要面试的小伙伴可以参考一下...

电影票务APP的“座位锁定”,Redis如何避免冲突?

现在买电影票,真是越来越方便了!再也不用提前老半天跑去电影院排队,在手机APP上动动手指,选好场次、挑好座位,在线支付,一气呵成。尤其是遇到热门大片,或者想抢个“皇帝位”(中间靠后视野好的位置),那个...

Serverless架构下,Redis的用武之地在哪里?

在云计算的演进浪潮中,Serverless(无服务器)架构无疑是一颗璀璨的明星。它将传统服务器的运维复杂性彻底“隐藏”起来,开发者只需关注核心业务逻辑,编写一个个独立的函数(Function-as-a...

高可用聊天系统设计方案(Hyperf实现)

一、系统架构设计1.分层架构图客户端↑↓HTTP/WSAPI网关层(Nginx+Keepalived)↑↓RPC业务服务集群↑↓数据层(MySQLClus...

大厂面试冲刺,Java“实战”问题三连,你碰到了哪个?

推荐学习全网首发!马士兵内部共享—1658页《Java面试突击核心讲》狂刷《Java权威面试指南(阿里版)》,冲击“金九银十”有望了Java“实战”问题三连Java“实战”面试题1:如果用mybati...

企业开发必备的6个Spring Cloud微服务开源项目

今天介绍六款比较热门的SpringCloud微服务项目,感兴趣的可以clone下来研究一下,相信对你学习微服务架构很有帮助。一、Cloud-Platform介绍Cloud-Platform是国内首个基...

系统架构设计方法论:系统演进的四重境界

在架构师面试中,设计能力的考察本质是验证候选人如何将混沌需求转化为可落地的技术方案。这不仅需要扎实的技术功底,更需要系统化的设计思维。以下四大步骤,既是架构设计的核心框架,也是技术决策的动态沙盘推演。...

跨浏览器共享Session信息方法总结

在不同浏览器之间共享Session信息需要克服浏览器间的隔离机制,常见解决方案如下:1.基于Token的跨浏览器传递实现方式:用户在主浏览器生成临时Token(如加密URL或二维码)。其他浏览器通过...

如何设计一套单点登录系统

一、介绍昨天介绍了API接口设计token鉴权方案,其实token鉴权最佳的实践场景就是在单点登录系统上。在企业发展初期,使用的后台管理系统还比较少,一个或者两个。以电商系统为例,在起步阶段,可能只有...

SpringBoot实现单点登录几种方案

前言:单点登录(SingleSign-On,SSO)是企业应用系统中常见的用户认证方案,它允许用户使用一组凭证访问多个相关但独立的系统,无需重复登录。基于Cookie-Session的传统SSO方案...

零基础小白如何学爬虫技术?看一遍就会的详细教程!

你以为爬虫需要精通编程、算法、网络协议才能入门?错了。作为零基础的小白,你完全可以在3周内学会主流网站的数据抓取,核心秘诀就两点:拆分具体目标+倒推式学习。与其纠结Python语法、HTTP协议这...

探秘Java中的分布式锁:优雅地协调分布式系统

探秘Java中的分布式锁:优雅地协调分布式系统在分布式系统的架构中,数据一致性是一个永恒的挑战。当我们需要在多个节点之间协调某些操作时,分布式锁便成为了一种不可或缺的工具。它就像一把钥匙,能够控制对共...

一文读懂 Spring Boot 3 分布式事务解决方案

在当今复杂的业务架构中,分布式事务处理是关键难题之一。随着业务规模的不断扩张,系统架构从单体逐渐演进为分布式,这就要求开发人员能够熟练掌握高效的分布式事务解决方案,以保障数据的一致性和业务的稳定性。今...

取消回复欢迎 发表评论: