重新刷新你对Redis集群的理解(刷新redis缓存命令)
mhr18 2024-11-13 11:09 30 浏览 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) 语句计算出 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 故障转移
当一个从节点发现自己正在复制的主节点进入已下线状态时,从节点将开始对下线主节点进行故障转移操作:
- 第一个发现问题的主节点举行一个选举,要求自己称为新的主节点。选举的规则和 Sentinel 中选举领头 Sentinel 非常相似,他们都基于 Raft 算法的领头选举方法。
- 成功则称为新主节点
- 失败则等待下一个从节点提出选举。
- 被选中的从节点执行 SLAVEOF no one 命令,成为新的主节点。
- 新的主节点接管已下线主节点的全部槽指派。
- 新主节点广播 PONG 消息,让别的节点知道自己已经成为主节点。
- 新主节点开始行使主节点职责
原文 https://www.cnblogs.com/WangXianSCU/p/15898007.html
相关推荐
- Dubai's AI Boom Lures Global Tech as Emirate Reinvents Itself as Middle East's Silicon Gateway
-
AI-generatedimageAsianFin--Dubaiisrapidlytransformingitselffromadesertoilhubintoaglob...
- OpenAI Releases o3-pro, Cuts o3 Prices by 80% as Deal with Google Cloud Reported to Make for Compute Needs
-
TMTPOST--OpenAIisescalatingthepricewarinlargelanguagemodel(LLM)whileseekingpartnershi...
- 黄仁勋说AI Agent才是未来!但究竟有些啥影响?
-
,抓住风口(iOS用户请用电脑端打开小程序)本期要点:详解2025年大热点你好,我是王煜全,这里是王煜全要闻评论。最近,有个词被各个科技大佬反复提及——AIAgent,智能体。黄仁勋在CES展的发布...
- 商城微服务项目组件搭建(五)——Kafka、Tomcat等安装部署
-
1、本文属于mini商城系列文档的第0章,由于篇幅原因,这篇文章拆成了6部分,本文属于第5部分2、mini商城项目详细文档及代码见CSDN:https://blog.csdn.net/Eclipse_...
- Python+Appium环境搭建与自动化教程
-
以下是保姆级教程,手把手教你搭建Python+Appium环境并实现简单的APP自动化测试:一、环境搭建(Windows系统)1.安装Python访问Python官网下载最新版(建议...
- 零配置入门:用VSCode写Java代码的正确姿
-
一、环境准备:安装JDK,让电脑“听懂”Java目标:安装Java开发工具包(JDK),配置环境变量下载JDKJava程序需要JDK(JavaDevelopmentKit)才能运行和编译。以下是两...
- Mycat的搭建以及配置与启动(mycat2)
-
1、首先开启服务器相关端口firewall-cmd--permanent--add-port=9066/tcpfirewall-cmd--permanent--add-port=80...
- kubernetes 部署mysql应用(k8s mysql部署)
-
这边仅用于测试环境,一般生产环境mysql不建议使用容器部署。这里假设安装mysql版本为mysql8.0.33一、创建MySQL配置(ConfigMap)#mysql-config.yaml...
- Spring Data Jpa 介绍和详细入门案例搭建
-
1.SpringDataJPA的概念在介绍SpringDataJPA的时候,我们首先认识下Hibernate。Hibernate是数据访问解决技术的绝对霸主,使用O/R映射(Object-Re...
- 量子点格棋上线!“天衍”邀您执子入局
-
你是否能在策略上战胜量子智能?这不仅是一场博弈更是一次量子智力的较量——量子点格棋正式上线!试试你能否赢下这场量子智局!游戏玩法详解一笔一画间的策略博弈游戏目标:封闭格子、争夺领地点格棋的基本目标是利...
- 美国将与阿联酋合作建立海外最大的人工智能数据中心
-
当地时间5月15日,美国白宫宣布与阿联酋合作建立人工智能数据中心园区,据称这是美国以外最大的人工智能园区。阿布扎比政府支持的阿联酋公司G42及多家美国公司将在阿布扎比合作建造容量为5GW的数据中心,占...
- 盘后股价大涨近8%!甲骨文的业绩及指引超预期?
-
近期,美股的AI概念股迎来了一波上升行情,微软(MSFT.US)频创新高,英伟达(NVDA.US)、台积电(TSM.US)、博通(AVGO.US)、甲骨文(ORCL.US)等多股亦出现显著上涨。而从基...
- 甲骨文预计新财年云基础设施营收将涨超70%,盘后一度涨8% | 财报见闻
-
甲骨文(Oracle)周三盘后公布财报显示,该公司第四财季业绩超预期,虽然云基建略微逊于预期,但管理层预计2026财年云基础设施营收预计将增长超过70%,同时资本支出继上年猛增三倍后,新财年将继续增至...
- Springboot数据访问(整合MongoDB)
-
SpringBoot整合MongoDB基本概念MongoDB与我们之前熟知的关系型数据库(MySQL、Oracle)不同,MongoDB是一个文档数据库,它具有所需的可伸缩性和灵活性,以及所需的查询和...
- Linux环境下,Jmeter压力测试的搭建及报错解决方法
-
概述 Jmeter最早是为了测试Tomcat的前身JServ的执行效率而诞生的。到目前为止,它的最新版本是5.3,其测试能力也不再仅仅只局限于对于Web服务器的测试,而是涵盖了数据库、JM...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- Dubai's AI Boom Lures Global Tech as Emirate Reinvents Itself as Middle East's Silicon Gateway
- OpenAI Releases o3-pro, Cuts o3 Prices by 80% as Deal with Google Cloud Reported to Make for Compute Needs
- 黄仁勋说AI Agent才是未来!但究竟有些啥影响?
- 商城微服务项目组件搭建(五)——Kafka、Tomcat等安装部署
- Python+Appium环境搭建与自动化教程
- 零配置入门:用VSCode写Java代码的正确姿
- Mycat的搭建以及配置与启动(mycat2)
- kubernetes 部署mysql应用(k8s mysql部署)
- Spring Data Jpa 介绍和详细入门案例搭建
- 量子点格棋上线!“天衍”邀您执子入局
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle 空为0 (51)
- oracle主从同步 (56)
- oracle 乐观锁 (53)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)