Redis中的集群(四)

集群

槽指派

CLUSTER ADDSLOTS命令的实现

CLUSTER ADDSLOTS命令接受一个或多个槽作为参数,并将所有输入的槽指派给接收该命令的节点负责:

CLUSTER ADDSLOTS <slot> [slot ...]

CLUSTER ADDSLOTS命令的实现可以用以下伪代码来表示:

def CLUSTER_ADDSLOTS(*all_input_slots):# 遍历所有输入槽,检查它们是否都是未指派槽for i in all_input_slots:# 如果有哪怕一个槽已经被指派给了某个节点# 那么向客户端返回错误,并终止命令执行if clusterState.slots[i] != null:reply_error()return# 如果所有输入槽都是未指派槽# 那么再次遍历所有输入槽,将这些槽指派给当前节点for i in all_input_slots:# 设置clusterState结构的slots数组# 将slots[i]的指针指向代表当前节点的clusterNode结构clusterState.slots[i] = clusterState.myself# 访问代表当前节点的clusterNode结构的slots数组# 将数组在索引i上的二进制位设置为1setSlotBit(clusterState.myself.slots, i);
例子

在这里插入图片描述

  • 举个例子。如图展示了一个节点的clusterState结构,clusterState.slots数组中的所有指针都指向NULL,并且clusterNode.slots数组中的所有二进制位的值都是0,这说明当前节点没有被指派任何槽,并且集群
    中的所有槽都是未指派的。当客户端对如图所示的节点执行命令:
CLUSTER ADDSLOTS 1 2

将槽1和槽2指派给节点之后,节点的clusterState结构将被更新为如图所示的样子:
1.clusterState.slots数组在索引1和索引2上的指针指向了代表当前节点的clusterNode
2.并且clusterNode.slots数组在索引1和索引2上的为止被设置成了1

最后,在CLUSTER ADDSLOTS命令执行完毕之后,节点会通过发送消息告知集群中的其他节点,自己目前正在处理哪些槽
在这里插入图片描述

在集群中执行命令

在对数据库中的16384个槽都进行了指派之后,集群就会进入上线状态,这时客户端就可以向集群中的节点发送数据命令了,当客户端向节点发送与数据库键有关的命令时,接收命令的节点会计算出命令要处理的数据库键属于哪个槽,并检查这个槽是否指派给了自己:

  • 1.如果键所在的槽正好就指派给了当前节点,那么节点直接执行这个命令
  • 2.如果键所在的槽并没有指派给当前节点,那么节点会向客户端返回一个MOVED错误,指引客户端转向(redirect)至正确的节点,并再次发送之前想要执行的命令,如图所示

例子

  • 举个例子。如果在之前提到的由7000、7001、7002三个节点组成的集群中,用客户端连上节点7000,并发送以下命令,那么命令会直接被节点7000执行:
127.0.0.1:7000> SET date "2024-04-10"
OK

因为键date所在的槽2022正式由节点7000负责处理的。但是,如果执行以下命令,那么客户端会先被转向至节点7001,然后再执行命令

127.0.0.1:7000> SET msg "happy new year!"
-> Redirected to slot[6257] located at 127.0.0.1:7001
OK127.0.0.1:7001> GET msg
"happy new year!"

这是因为msg所在的槽6257是由节点7001负责处理的,而不是由最初接收命令的节点7000负责处理:
1.当客户端第一次向节点7000发送SET命令的时候,节点7000会向客户端返回MOVED错误,指引客户端转向至节点7001
2.当客户端转向到节点7001之后,客户端重新向节点7001发送SET命令,这个命令会被节点7001成功执行

计算键属于哪个键

节点使用以下算法来计算给定键key属于哪个槽:

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

其中CRC16(key)语句用于计算键key的CRC-16校验和,而& 16383语句则用于计算出一个介于0~16383之间的整数作为键key的槽号。可以使用CLUSTER KEYSLOT 命令可以查看一个给定键属于哪个槽:

127.0.0.1:7000> CLUSTER KEYSLOT "date"
(integer) 2022
127.0.0.1:7000> CLUSTER KEYSLOT "msg"
(integer) 6257
127.0.0.1:7000> CLUSTER KEYSLOT "name"
(integer) 5798
127.0.0.1:7000> CLUSTER KEYSLOT "fruits"
(integer) 14943

CLUSTER KEYSLOT命令就是通过调用上面给出的槽分配算法来实现的,以下是该命令的伪代码实现:

def CLUSTER_KEYSLOT(key):
# 计算槽号
slot = slot_number(key)# 将槽号返回给客户端
reply_client(slot)

判断槽是否由当前节点负责处理。

当节点计算出键所属的槽i之后,节点就会检查自己在clusterState.slots数组中的项i,判断键所在的槽是否由自己负责:

  • 1.如果clusterState.slots[i]等于clusterState.myself,那么说明槽i由当前节点负责,节点可以执行客户端发送的命令
  • 2.如果clusterState.slots[i]不等于clusterState.myself,那么说明槽i并非由当前节点负责,节点会根据clusterState.slots[i]指向的clusterNode结构所记录的节点IP和端口号,向客户端返回MOVED错误,指引客户端转向至正在处理槽i的节点
例子

在这里插入图片描述

  • 举个例子。假设如图所示为节点7000的clusterState结构:
    1.当客户端向节点7000发送命令SET date "2024-04-10"的时候,节点首先计算出键date属于槽2022,然后检查得出clusterState.slots[2022]等于clusterState.myself,这说明槽2022正是由节点7000负责,
    于是节点7000直接执行这个SET命令,并将结果返回发送命令的客户端
    2.当客户端向节点7000发送命令SET msg "happy new year!"的时候,节点首先计算出键msg属于槽6257,然后检查clusterState.slots[6257]是否等于clusterState.myself,结果发现两者并不相等:这说明槽6257并非
    由节点7000负责处理,于是节点7000访问clusterState.slots[6257]所指向的clusterNode结构,并根据结构中记录的IP地址127.0.0.1和端口号7001,向客户端返回错误MOVED 6257 127.0.0.1:7001,指引节点转向至正在负责处理槽6257的节点7001

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/304090.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows10系统下TP-LINK万兆网卡属性配置高级说明

文章目录 打开配置属性说明ARP Offload&#xff1a;ARP地址解析协议卸载Downshift retries:降档重试次数Energy-Efficient Ethernet:高能效以太网Flow Control:流量控制Interrupt Moderation:中断调整Interrupt Moderation Rate:中断调节率IPv4 Checksum Offload:IPv4校验和卸载…

gemini1.5 API调用

https://ai.google.dev/pricing?hlzh-cn 查询可用的model https://generativelanguage.googleapis.com/v1beta/models?keyxxx 使用postman调用 https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro-latest:generateContent?keyxxx https://ai.google…

TTL介绍

transistor-to-transistor logic (TTL) What is transistor-to-transistor logic (TTL)? 晶体管对晶体管逻辑&#xff08;也称简单晶体管对晶体管逻辑或 TTL&#xff09;是数字逻辑设计的一个系列&#xff0c;由一系列双极结型晶体管构成&#xff0c;可在直流脉冲下工作。许多…

1999-2022年各省研究与试验发展人员全时当量数据/省研发人员全时当量数据/(RD)人员全时当量(无缺失)

1999-2022年各省研究与试验发展人员全时当量数据/省研发人员全时当量数据/(R&D)人员全时当量&#xff08;无缺失&#xff09; 1、时间&#xff1a;1999-2022年 2、来源&#xff1a;科技年鉴 3、指标&#xff1a;研究与试验发展人员全时当量/研发人员全时当量 4、范围&a…

面试经典算法系列之双指针4 -- 删除有序数组中的重复项

面试经典算法题4 – 删除有序数组中的重复项 LeetCode.26 公众号&#xff1a;阿Q技术站 问题描述 给你一个 非严格递增排列 的数组 nums &#xff0c;请你原地删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应…

KVM 高级功能部署

目录 一、案例分析 1.1、案例概述 1.2、案例前置知识点 1&#xff09;KVM 虚拟机迁移 2&#xff09;KSM 内核同页合并 1.3、案例环境 1&#xff09;本案例环境 2&#xff09;案例需求 3&#xff09;案例实现思路 二、案例实施 2.1、静态迁移 1&#xff09;在…

征程 5 芯片架构

文章目录 简介图像处理升级丰富异构计算自动驾驶 I/O 接口功能安全和信息安全保障征程 5 架构性能指标简介 征程5 是地平线第三代车规级产品,也是国内首颗遵循 ISO 26262 功能安全认证流程开发,并通过ASIL-B 认证的车载智能计算方案;⁣基于最新的地平线BPU 贝叶斯架构设计,…

vue项目node版本问题

1. 启动项目报错 2. 解决 &#xff08;1&#xff09;更新依赖 npm install --legacy-peer-deps &#xff08;2&#xff09;如果不行就重装node node版本为14.15.1 sass版本为 node-sass": "^6.0.1" "sass-loader": "^6.0.…

HTML:表单

目录 案例&#xff1a; 一、form标签 二、input标签 三、textarea标签 四、select标签 五、fieldset 标签 案例&#xff1a; <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>报名表</title> </head> &l…

FME学习之旅---day22

我们付出一些成本&#xff0c;时间的或者其他&#xff0c;最终总能收获一些什么。 教程&#xff1a;栅格入门 FME 支持读取和写入 70 多种栅格格式。本教程将介绍几个基本示例&#xff0c;展示如何使用 FME 读取、转换和写入栅格数据。 FME 数据检查器不应用任何对比度增强。因…

书生·浦语大模型第二期实战营第二课笔记和基础作业

来源&#xff1a; 作业要求:Homework - Demo 文档教程:轻松玩转书生浦语大模型趣味 Demo B站教程:轻松玩转书生浦语大模型趣味 Demo 1. 笔记 2.基础作业 2.1 作业要求 2.2 算力平台 2.3 新建demo目录&#xff0c;以及新建目录下的文件&#xff0c;下载模型参数 2.4 Intern…

关于GNSS硬件延迟初步学习,电离层提取

1、卫星端偏差分为频间和频内偏差&#xff08;inter or intra frequency&#xff09;&#xff0c;下面以GPS的C1C和C2W组合为例分析对PPP解算的影响&#xff1a; 如果不改正卫星端的inter-frequency&#xff08;即&#xff1a;C1C-C1W&#xff09;偏差&#xff08;因为每颗卫星…

Spring Boot 切面的一种的测试方法,java中级开发面试

void afterReturnName() { Assertions.assertEquals(studentController.getNameById(123L).getName(), "测试姓名Yz");} } 但往往切面中的逻辑并非这么简单&#xff0c;在实际的测试中其实我们也完成没有必要关心在切面中到底发生了什么&#xff08;发生了什么应该在…

旧衣回收市场发展快速,线上小程序为商家提供新机遇

随着人们生活水平的提高&#xff0c;衣服淘汰的速度也在不断加快&#xff0c;每年垃圾站都会有非常多的废弃衣物。旧衣物的废弃不仅对环境有破坏&#xff0c;还造成了资源浪费。 因此&#xff0c;旧衣物回收行业受到了大众的关注&#xff0c;旧衣回收市场具有先天的优势&#…

AOF文件重写

1.2.3.AOF文件重写 因为是记录命令&#xff0c;AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作&#xff0c;但只有最后一次写操作才有意义。通过执行bgrewriteaof命令&#xff0c;可以让AOF文件执行重写功能&#xff0c;用最少的命令达到相同效果。 如图&am…

Chrome谷歌下载入口

​hello&#xff0c;我是小索奇 发现好多人说谷歌浏览器在哪里下载呀&#xff0c;哪里可以找到&#xff1f; 你可能会心想&#xff0c;一个浏览器你还不会下载啊&#xff1f; 还真是&#xff0c;有很多伙伴找不到下载入口&#xff0c;为什么呢&#xff1f; Bing进行搜索&am…

Open CASCADE学习|求曲面的参数空间

在三维空间中&#xff0c;任意的曲面都可以通过特定的方法映射到一个二维参数平面上&#xff0c;从而对其进行详细的几何分析和处理。首先&#xff0c;我们需要从三维模型中提取出特定的曲面&#xff0c;这通常被称为“Face”。一个face可以被视为三维空间中的一个封闭区域&…

java程序生成exe文件启动时,在没有java环境计算机运行

1.idea项目配置工件 2. 开始构建java程序成jar包 3. 生成exe启动程序

【第七篇】使用BurpSuite进行主动、被动扫描和主动、被动爬虫

文章目录 前言主动扫描被动扫描主动爬虫被动爬虫前言 Burp Scanner 既可以用作全自动扫描仪,也可以用作增强手动测试工作流程的强大手段。 扫描网站涉及两个阶段: 抓取内容和功能: Burp Scanner 首先在目标站点周围导航,密切反映真实用户的行为。它对站点的结构和内容以及…

【数据库】数据库应用系统生命周期

目录 1.为什么提出”软件工程“的思想&#xff1f; 2.为什么提出”瀑布模型“&#xff1f;缺点是什么&#xff1f; 3.为什么提出”快速原型模型“&#xff1f; 4.为什么提出”螺旋模型“&#xff1f; 5.关于数据库的英文缩写。 6.模型设计中的3条设计主线&#xff1a;数…