首页 > 数据库 >Redis设计与实现第17章 -- 集群 总结2(执行命令 重新分片)

Redis设计与实现第17章 -- 集群 总结2(执行命令 重新分片)

时间:2024-12-03 22:28:23浏览次数:8  
标签:slot 17 -- Redis MOVED 命令 键值 节点 客户端

17.3 在集群中执行命令

接收命令的节点会计算出命令要处理的数据库键属于哪个槽,并检查这个槽是否指派给了自己:

  • 如果是的话,直接执行这个命令

  • 否则,节点向客户端返回一个MOVED错误,指引客户端转向redirect至正确的节点,并再次发送之前想要执行的命令

17.3.1 计算键属于哪个槽

节点使用CRC16(key&16383)来计算键key属于哪个槽,其中CRC16语句用于计算键key的CRC-16校验和,而&16383语句则用于计算出一个介于0~16383之间的整数作为键key的槽号

使用CLUSTER KEYSLOT <key>可以查看一个给定键属于哪个槽

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

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

  • 如果clusterState.slots[i] = clusterState.myself,说明槽i由当前节点负责

  • 否则,节点会根据clusterState.slots[i] 指向的clusterNode结构所记录的节点IP和端口号,向客户端返回MOVED错误,指引客户端转向正确节点。

17.3.3 MOVED错误

MOVED错误的格式为MOVED <slot> <ip>:<port>,其中slot为键所在的槽,而ip/port则是负责处理槽slot的节点的IP地址和端口号。客户端会根据MOVED错误中提供的IP地址和端口号,转向至负责处理槽slot的节点,并向该节点重新发送之前想要执行的命令

一个集群客户端通常会与集群的多个节点创建套接字连接,而所谓的节点转向实际上是换一个套接字来发送命令。如果客户端未与想要转向的节点创建套接字连接,客户端会先根据MOVED错误提供的IP地址和端口号来连接节点,然后再进行转向。

要注意,集群模式的客户端收到MOVED错误后,是根据MOVED错误自动进行节点转向的,并打印出转向信息。但是如果是单机stand alone模式的客户端,MOVED错误就会被客户端打印出来。

17.3.4 节点数据库的实现

节点只能使用0号数据库,而且除了将键值对保存在数据库里面之外,还会用clusterState结构里的slots_to_keys跳跃表来保存槽和键之间的关系,跳跃表里每个节点的分值score都是一个槽号,而每个节点的成员member都是一个数据库键

通过跳跃表,节点可以很方便的对属于某个或某些槽的所有数据库键进行批量操作,例如CLUSTER GETKEYSINSLOT <slot> <count>命令可以返回最多count个属于槽slot的数据库键,就是通过遍历跳跃表实现的

17.4 重新分片

Redis集群的重新分片操作可以将任意数量已经指派给某个节点(源节点)的槽改为指派给另一个节点(目标节点),并且相关槽所属的键值对也会从源节点被移动到目标节点。

重新分片操作可以在线进行,而且源节点和目标节点都可以继续处理命令请求。

是由Redis的集群管理软件redis-trib负责执行的,Redis提供了进行重新分片所需的所有命令,redis-trib则通过向源节点和目标节点发送命令来进行重新分片操作,具体步骤如下:

  1. 对目标节点发送CLUSTER SETSLOT <slot> IMPORTING <source_id> 命令,让目标节点准备好从源节点导入import属于槽slot的键值对

  2. 对源节点发送 CLUSTER SETSLOT <slot> MIGRATE <target_id> 命令,让源节点准备好将属于槽slot的键值对迁移migrate到目标节点

  3. 向源节点发送CLUSTER GETKEYSINSLOT <slot> <count>命令,获得最多count个属于槽slot的键值对的键名key name

  4. 对于步骤3获得的每个键名,redis-trib都向源节点发送一个MIGRATE <target_ip> <target_port> <key_name> 0 <timeout>命令,将被选中的键原子性地从源节点迁移到目标节点

  5. 重复执行步骤3和4,直到源节点保存的所有属于槽slot的键值对都被迁移到目标节点。

  6. redis-trib向集群的任意一个节点发送CLUSTER SETSLOT <slot> NODE <target>命令,将槽slot指派给目标节点,会通过消息发送到整个集群

标签:slot,17,--,Redis,MOVED,命令,键值,节点,客户端
From: https://blog.csdn.net/LightOfNight/article/details/144224738

相关文章

  • Python基于滑动窗口CNN损伤梁桥数据、故宫城墙图像数据分类可视化|附数据代码
    全文链接:https://tecdat.cn/?p=38442原文出处:拓端数据部落公众号分析师:YufeiGuo在现代土木结构工程领域,结构损伤的准确识别与定位对于保障基础设施的安全性和耐久性具有极为关键的意义。传统的人工检查方法,如目视检查以及借助专业设备进行检测,在很长一段时间内占据着主导地位,......
  • 【解决方法】vscode import cv2报错Import "cv2" could not be resolvedPylancereport
    报错一般是opencv-python装的环境与当前环境不是同一个1.没有装opencv-pythonpipinstallopencv-python -ihttps://pypi.tuna.tsinghua.edu.cn/simple2.装错了在左侧扩展栏目中搜索@workspaceUnsupported下拉点击表示 在右侧加入信任文件ctrl+shift+p在下来菜单中......
  • 设计位置编码
    Gall定律一个有效的复杂系统通常是从一个有效的简单系统演化而来的——JohnGall本文将带你一步步探究Transformer模型中先进的位置编码技术。我们将通过迭代改进编码位置的方法,最终得出旋转位置编码(RotaryPostionalEncoding,RoPE),这也是最新发布的LLama3.2和......
  • 中国AI大模型市场:创业公司在巨头竞争中的生存之道|报告汇总PDF洞察(附原数据表)
    原文链接:https://tecdat.cn/?p=38460在2023年10月上旬的一次聚会中,众多投资了AI大模型的投资者在轻松的氛围中探讨了当前市场的严峻挑战。市场数据显示,仅仅半年前,投资者们还在为争夺投资份额而焦虑。然而,当前市场情绪已经发生了转变,投资者普遍认为,大模型领域的创业公司在与大型企......
  • 假努力,自我欺骗,麻木
    考场上Hints加油啊。心态很重要题目没有那么简单,也没有那么难。看题,最好先手玩一下样例/打个暴力。不要一道题的验证暴力打很久,按题意模拟即可,不然可能会没时间想正解。尝试先多想几个方向的思路,给出一些看上去比较可行的方案。想到一个思路最好不要马上打代......
  • 堆栈2
    1、 2、push3   push 2    push 1只有ESP发生变化(ESP=ESP-c),1、2、3也被压入栈   3、CALL00401005(按F7不按F8)把这个值(它的下一行)压入堆栈,EIP修改00401005(与9相同)按F7之后会生成一个JMP指令4、PUSHEBP   MOVEBP,ESP   SUBE......
  • vxe-table 在 vxe-tabs 页签组件中使用表格
    在vxe-tabs页签组件中使用vxe-table表格组件,自适应页签高度。官网:https://vxetable.cn/<template><div><vxe-tabspadding><vxe-tab-panetitle="页签1"name="1"><vxe-gridv-bind="gridOptions1">&l......
  • 12/3宾语从句
    宾语从句‌是名词性从句的一种,位于及物动词、介词或复合谓语之后,充当宾语的角色。宾语从句的语序必须是陈述语序,不能用疑问句语序。宾语从句可以分为动词的宾语从句、介词的宾语从句和形容词的宾语从句‌宾语从句的引导词宾语从句的引导词包括:‌连词‌:that(通常可以省略),whether,i......
  • Windows 输入法详解
    一、输入法的实现原理 输入法的输入原理主要包括以下几个步骤:输入捕获:用户通过键盘输入字符,输入法截获这些按键事件。对于中文输入,通常是拼音、五笔或其他编码。编码解析:输入法将用户输入的编码(如拼音)解析为可能的汉字或词组候选项。候选项生成:根据输入的编码......
  • IDA的基本使用
    1、shift+F12查找字符串,左边就是地址,双击就可以进入汇编界面2、在程序框图界面按Tab进入伪代码界面,按空格进入汇编界面3、按G跳转到地址4、左边这玩意是可以拖的(www真不知道),拖动之后可以看到地址(Start)......