Redis中的集群(五)

news2025/6/22 0:44:21

集群

在集群中执行命令

MOVED错误。

当节点发现键所在的槽并非由自己负责处理的时候,节点就会向客户端返回一个MOVED错误,指引客户端转向至正在负责槽的节点,MOVED错误的格式为:

MOVED <slot> <ip>:<port>

其中slot为键所在的槽,而ip和port则是负责处理槽slot的节点的IP地址和端口号。例如错误:

MOVED 10086 127.0.0.1:7002

表示槽10086正由IP地址为127.0.0.1,端口号为7002的节点负责,又例如错误:

MOVED 789 127.0.0.1:7000

表示槽789正由IP地址为127.0.0.1,端口号为7000的节点负责。
当客户端接收到节点返回的MOVED错误时,客户端会根据MOVED错误中提供的IP地址和端口号,转向至负责处理槽slot的节点,并向该节点重新发送之前想要执行的命令。以前面的客户端从节点7000转向至7001的情况作为例子:

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

在这里插入图片描述

如图所示展示了客户端向节点7000发送SET命令,并获得MOVED错误的过程
在这里插入图片描述

客户端根据MOVED错误,转向至节点7001,并重新发送SET命令的过程

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

被隐藏的MVOED错误

集群模式的redis-cli客户端在接收到MOVED错误时,并不会打印出MOVED错误,而是根据MOVED错误自动进行节点转向,并打印出转向信息,所以是看不见节点返回的MOVED错误的

redis-cli -c -p 7000 #集群模式

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

但是如果,使用单机(stand alone)模式的redis-cli客户端,再次向节点7000发送相同的命令,那么MOVED错误就会被打印出来:

redis-cli -p 7000 # 单机模式
127.0.0.1:7000> SET msg "happy new year!"
(error) MOVED 6257 127.0.0.1:7001

这是因为单机模式的redis-cli客户端不清除MOVED错误的作用,所以它只会直接将MOVED错误直接打印出来,而不会进行自动转向。

节点数据库的实现

集群节点保存键值对以及键值对过期时间的方式,与单机模式下保存键值对以及对过期时间的方式完全相同。节点和单机服务器在数据库方面的一个区别是,节点只能使用0号数据库,而单机Redis服务器则没有这一限制。

slots_to_keys跳跃表每个节点的分值(score)都是一个槽号,而每个节点的成员(member)都是一个数据库键:

  • 1.每当节点往数据库中添加一个新的键值对时,节点就会将这个键以及键的槽号关联到slots_to_keys跳跃表
  • 2.当节点删除数据库中某个键值对时,节点就会在slots_to_keys跳跃表接触被删除键与槽号的关联
例子
  • 举个例子。如图展示了节点7000的数据库状态,数据库中包含列表键"lst",哈希键"book",以及字符串键"date",其中键"lst"和键"book"带有过期时间。另外除了将键值对保存在数据库里面之外,节点还会用clusterState结构中的slots_to_keys跳跃表来保存槽和键之间的关系:
typedef struct clusterState {
//...
zskiplist *slot_to_keys;
// ...
}clusterState;
  • 举个例子。对于上图所示的数据库,节点7000将创建类似如图所示的slots_to_keys跳跃表:
    1.键"book"所在跳跃表节点的分值为1337.0,这表示键"book"所在的槽位1337
    2.键"date"所在跳跃表节点的分值位2022.0,这表示键"date"所在的槽为2022
    3.键"lst"所在跳跃表节点的分值为3347.0,这表示键"lst"所在的槽为3347

通过在slots_to_keys跳跃表中记录各个数据库键所属的槽,节点可以很方便地对属于某个或某些槽的所有数据库进行批量操作,例如命令CLUSTER GETKEYSINSLOT 命令可以返回最多count个属于槽slot的数据库键,而这个命令就是通过遍历slots_to_keys跳跃表来实现的
在这里插入图片描述

重新分片

Redis集群的重新分片操作可以将任意数量已经指派给某个节点(源节点)的槽改为指派给另一个节点(目标节点),并且相关槽所属的键值对也会从源节点被移动到目标节点。重新分片操作可以在线(online)进行,在重新分片的过程中,集群不需要下线,并且源节点和目标节点都可以继续处理命令请求。

例子

  • 举个例子。对于之前提到的7000、7001、7002三个节点的集群来说,我们可以向这个集群中添加一个IP为127.0.0.1,端口号为7003的节点
redis-cli -c -p 7000
127.0.0.1:7000> CLUSTER MEET 127.0.0.1 7003
OK

可以用CLUSTER NODES进行查看各个节点之前所负责的槽的区间

重新分片的实现原理

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

  • 1.redis-trib对目标节点发送CLUSTER SETSLOT IMPORTING <source_id>命令,让目标节点准备好从源节点导入(import)属于槽slot的键值对
  • 2.redis-trib对源节点发送CLUSTER SETSLOT MIGRATING <target_id>命令,让源节点准备好将属于槽slot的键值对迁移(migrate)至目标节点
  • 3.redis-trib向源节点发送CLUSTER GETKEYSINSLOT 命令,获得最多count个属于槽slot的键值对的键名(key name)
  • 4.对于步骤3获得的每个键名,redis-trib都向源节点发送一个MIGRATE <target_ip> <target_port> <key_name> - 命令,将被选中的键原子地从源节点迁移至目标节点
  • 5.重复执行步骤3和步骤4,直到源节点保存的所有属于槽slot的键值对都被迁移至目标节点为止。每次迁移的过程如图所示
  • 6.redis-trib向集群中的任意一个节点发送CLUSTER SETSLOT NODE <target_id>命令,将槽slot指派给目标节点,这一指派信息会通过消息发送至整个集群,最终集群中的所有节点都会直到槽slot已经指派给了目标节点

如果重新分片涉及多个槽,那么redis-trib将对每个给定的槽分别执行上面给出的步骤,流程图如图所示
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件建模与设计 —— 入门

序言 对于软件建模与设计&#xff0c;非科班出身的同学可能和我一样比较陌生&#xff0c;虽然日常开发中也涉及到建模&#xff0c;但是并没有系统的学习过软件建模设计。类似于设计模式&#xff0c;软件建模与设计也有一套三板斧。 设计模式 创建型模式提供了创建对象的机制…

ZYNQ7000 PL与PS交互总结

这里写目录标题 一、ZYNQ7000整体框架二、AXI总线与接口2.1 AXI总线协议分类2.1.1 AXI_Lite协议2.1.2 AXI_Full协议2.1.3 AXI_Stream协议 2.2 AXI接口分类 三、PS与PL交互方式总结3.1 PL中断3.2 AXI_Lite协议配合AXI GP接口进行寄存器访问3.3 AXI_Full协议配合AXI HP接口进行内…

解决苹果iMac的M1芯片Node Sass does not yet support your current environment的问题

问题背景 如图所示&#xff0c;这是我的电脑&#xff0c;M1芯片 启动前端项目老是报错&#xff0c;说node Sass不支持我当前的环境&#xff0c;同事的macBook是intel芯片的&#xff0c;就能跑起项目来 很烦 但是不慌&#xff01;&#xff01;&#xff01; 咱有解决方法啦&a…

添加okHttp依赖报错

compile "com.squareup.okhttp:okhttp:2.4.0" compile com.squareup.okio:okio:1.5.0 compile "com.google.code.gson:gson:2.8.0" 升级了&#xff0c;改为 implementation "com.squareup.okhttp:okhttp:2.4.0"implementation com.squareup.o…

零基础入行IT行业:AI助力实现梦想

目录 一、前言 二、学习路径&#xff1a;构建你的“AI学习阶梯” 1.基础知识启蒙&#xff08;预期时间&#xff1a;1-2个月&#xff09; 2.技能逐层提升&#xff08;预期时间&#xff1a;3-6个月&#xff09; 3.深化专业方向&#xff08;预期时间&#xff1a;6-12个月&…

浏览器的重排重绘

相关问题 如何提升页面渲染性能如何减少页面重排重绘哪些行为会引起重排/重绘 关键点 渲染性能 Layout Paint 浏览器渲染大致分为四个阶段&#xff0c;其中在解析 HTML 后&#xff0c;会依次进入 Layout 和 Paint 阶段。样式或节点的更改&#xff0c;以及对布局信息的访问等…

Node.js 的 5 个常见服务器漏洞

Node.js 是一个强大且广泛使用的 JavaScript 运行时环境&#xff0c;用于构建服务器端应用程序。然而&#xff0c;与任何其他软件一样&#xff0c;Node.js 也有自己的一些漏洞&#xff0c;如果处理不当&#xff0c;可能会导致安全问题。请注意&#xff0c;这些漏洞并不是 Node.…

【漏洞复现】OpenMetadata 命令执行漏洞复现(CVE-2024-28255)

声明&#xff1a;亲爱的读者&#xff0c;我们诚挚地提醒您&#xff0c;Aniya网络安全的技术文章仅供个人研究学习参考。任何因传播或利用本实验室提供的信息而造成的直接或间接后果及损失&#xff0c;均由使用者自行承担责任。Aniya网络安全及作者对此概不负责。如有侵权&#…

【MySQL数据库 | 第二十六篇】InnoDB基本数据存储单元以及存在问题

前言&#xff1a; InnoDB作为MySQL中最常用的存储引擎之一&#xff0c;承载着许多数据库系统的关键任务&#xff0c;如事务管理、并发控制和数据完整性保障。 然而&#xff0c;就像任何技术一样&#xff0c;InnoDB也并非完美无缺。在深入了解其工作原理和特性的同时&#xff…

宏集PLC如何为楼宇自动化行业提供空调、供暖与通风的解决方案?

一、应用背景 楼宇自动化行业是通过将先进的技术和系统应用于建筑物中&#xff0c;以提高其运营效率、舒适度和能源利用效率的行业&#xff0c;其目标是使建筑物能够自动监控、调节和控制各种设备和系统&#xff0c;包括照明系统、空调系统、安全系统、通风系统、电力供应系统…

头歌-机器学习 第13次实验 特征工程——共享单车之租赁需求预估

第1关&#xff1a;数据探索与可视化 任务描述 本关任务&#xff1a;编写python代码&#xff0c;完成一天中不同时间段的平均租赁数量的可视化功能。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 读取数据数据探索与可视化 读取数据 数据保存在./step1/…

JUC:实现一个简易的数据库连接池(享元模式)

主要是学习享元模式。 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在通过共享尽可能多的对象来最小化内存使用和提高性能。在该模式中&#xff0c;对象被分为两种状态&#xff1a;内部状态和外部状态。 内部状态&#xff08;Intr…

[SystemVerilog]常见设计模式/实践

常见设计模式/实践 RTL 设计&#xff08;尤其是 ASIC&#xff09;的最终目标是制作出最小、最快的电路。为此&#xff0c;我们需要了解综合工具如何分析和优化设计。此外&#xff0c;我们还关注仿真速度&#xff0c;因为等待测试运行实际上是在浪费工程精力。虽然综合和仿真工…

智造未来,引领潮流:中科美菱新品发布展现制造新力量

2024年3月30日&#xff0c;中科美菱在第十六届中国整合生物样本学大会上瞩目亮相&#xff0c;发布了其全新力作—云智安菱睿系列全自动超低温样本存储设备SU-80。同时&#xff0c;公司还携云智安自动化样本库解决方案闪耀昆明。这一新品的华丽登场&#xff0c;不仅向世界展示了…

本地域名解析DNS

本地域名解析&#xff1a; - 需要修改本地hosts&#xff0c;增加映射 - windows hosts文件目录 c:\windows\system32\drivers\etc\hosts - 增加映射 22.100.10.122 gitlab.xxx.cn

爬取豆瓣(线程、Session)优化版本

爬取豆瓣&#xff08;线程、Session&#xff09;优化版本 该文章只是为了精进基础&#xff0c;对Session、threading、网站请求解析的理解。 此版本没有爬取详情页。还在学习阶段的读者可以尝试一下。 适用于基础刚开始学习爬虫的&#xff01; 1.改进点&#xff1a; 将普通的r…

JDK版本升级后连不上MySQL数据库的问题

1. 问题描述 用户在将 JDK 版本从 8 升级到 11 后&#xff0c;发现应用无法连接到 MySQL 数据库&#xff0c;出现连接超时或连接被拒绝的错误。 例如出现如下报错信息&#xff1a; 可能原因&#xff1a; JDBC驱动版本不兼容&#xff1a; 新的 JDK 11 可能需要使用更高版本的 My…

时序预测 | Matlab实现SSA-ESN基于麻雀搜索算法(SSA)优化回声状态网络(ESN)的时间序列预测

时序预测 | Matlab实现SSA-ESN基于麻雀搜索算法(SSA)优化回声状态网络(ESN)的时间序列预测 目录 时序预测 | Matlab实现SSA-ESN基于麻雀搜索算法(SSA)优化回声状态网络(ESN)的时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现SSA-ESN基于麻雀搜索…

数据的未来:人工智能引领下的大数据革命

大数据是指在一定时间范围内&#xff0c;无法通过常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;这种数据具有海量、高增长率和多样化的特点&#xff0c;需要采用新的处理模式才能发挥其更强的决策力、洞察发现力和流程优化能力。大数据将数据视为核心资源&#xff0…

Vue 项目如何在VSCode中进行断点调试

概要&#xff1a; 简单介绍一下&#xff0c;在VSCode中如何对Vue项目进行断点调试。具体内容包括但不限于&#xff1a;如何配置调试环境、如何在代码中设置断点、如何启动调试以及如何解决在调试过程中可能遇到的问题。 实际开发中&#xff0c;我们的前端项目一般都是在浏览器…