Redis中的集群(六)

news2024/11/29 2:34:39

集群

ASK错误

在进行重新分片期间,源节点向目标节点迁移一个槽的过程中,可能会出现这样一种情况:属于被迁移槽的一部分键值对保存在源节点里面,而另一部分键值对则保存在目标节点里面。当客户端向源节点发送一个与数据库有关的命令,并且命令要处理的数据库键恰好就属于正在被迁移的槽时:

  • 1.源节点会先在自己的数据库里面查找指定的键,如果找到的话,就直接执行客户端发送的命令
  • 2.相反地,如果源节点没能在自己的数据库里面找到指定的键,那么这个键有可能已经被迁移到了目标节点,源节点没能在自己的数据库里面找到指定的键,那么这个键有可能已经被迁移到了目标节点,源节点将向客户端返回一个ASK错误,指引客户端转向正在导入槽的目标节点,并再次发送之前想要执行的命令

例子

  • 举个例子。如图展示了源节点判断是否需要向客户端发送ASK错误的整个过程,假设节点7002正在向节点7003迁移槽16198,这个槽包含"is"和"love"两个键,其中键"is"还留在节点7002,而键"love"已经被迁移到了节点7003,如果我们向节点7002发送关于键"is"的命令,那么这个命令会直接被节点7002执行:
127.0.0.1:7002>GET "is"
"you get the key 'is'"

而如果我们向节点7002发送关于键"love"的命令,那么客户端会先被转向至节点7003,然后再次执行命令:

127.0.0.1:7002> GET "love"
-> Redirected to slot [16198] located at 127.0.0.1:7003
"you get the key 'love'"
127.0.0.1:7003>
  • 被隐藏的ASK错误
    和接到MOVED错误时的情况类似,集群模式的redis-cli在接到ASK错误时也不会打印错误,而是自动根据错误提供的IP地址和端口进行转向动作。如果想看到节点发送的ASK错误的话,可以使用单机模式的redis-cli客户端
redis-cli -p 7002
127.0.0.1:7002> GET "love"
(error) ASK 16198 127.0.0.1:7003

CLUSTER SETSLOT IMPORTING命令的实现

clusterState结构的importing_slots_from数组记录了当前节点正在从其他节点导入的槽:

typedef struct clusterState {
// ...
clusterNode *importing_slots_from[16384];
// ...
} clusterState;

如果importing_slots_from[i]的值不为NULL,而是指向一个clusterNode结构,那么表示当前节点正在从clusterNode所代表的节点导入槽[i].在对集群进行重新分片的时候,向目标节点发送命令

CLUSTER SETSLOT <i> IMPORTING <source_id>

可以将目标节点clusterState.importing_slots_from[i]的值设置为source_id所代表节点的clusterNode结构。

例子

  • 举个例子。如果客户端向节点7003发送以下命令:
# b4348045d1eadca5abd96b8d0d13b0309ed117e1 是节点7002的id
127.0.0.1:7003> CLUSTER SETSLOT 16198 IMPORTING  b4348045d1eadca5abd96b8d0d13b0309ed117e1
OK

那么节点7003的clusterState.importing_slots_from数组将变成如图所示的样子。
在这里插入图片描述

CLUSTER SETSLOT MIGRATING命令的实现

clusterState结构的migrating_slots_to数组记录了当前节点正在迁移至其他节点的槽:

typedef struct clusterState {
// ...
clusterNode *migrating_slots_to[16384]
// ...
} clusterState;

如果migrating_slots_to[i]的值不为NULL,而是指向一个clusterNode结构,那么表示当前节点正在将槽[i]迁移至clusterNode所代表的节点。
在对集群进行重新分片的时候,向源节点发送命令:

CLUSTER SETSLOT <i> MIGRATING <target_id>

可以将源节点clusterState.migrating_slots_to[i]的值设置为target_id所代表节点的clusterNode结构。

例子

  • 举个例子。如果客户端向节点7002发送以下命令:
# b4348045d1eadca5abd96b8d0d13b0309ed117e1 是节点7003的ID
127.0.0.1:7002>CLUSTER SETSLOT 16198 MIGRATING  b4348045d1eadca5abd96b8d0d13b0309ed117e1

那么节点7002的clusterstate.migrating_slots_to数组将变成如图所示的样子
在这里插入图片描述

ASK错误

如果节点收到一个关于键key的命令请求,并且键key所属的槽i正好就指派给了这个节点,那么节点会尝试在自己的数据库里查找键key,如果找到了的话,节点就直接执行客户端发送的命令。与此相反,如果节点没有在自己的数据库里找到键key,那么系欸但会检查自己的clusterState.migrating_slots_to[i],
看键key所属的槽i是否正在进行迁移,如果槽i的确在进行迁移的话,那么节点会向客户端发送一个ASK错误,引导客户端正在导入槽i的节点去查找键key。

例子

  • 举个例子。假设在节点7002向节点7003迁移槽16198期间,有一个客户端向节点发送命令:
GET "love"

因为键"love"正好属于槽16198,所以节点7002会首先在自己的数据库中查找键"love",但并没有找到,通过检查自己的clusterState.migrating_slots_to[16198],节点7002发现自己正在将槽16198迁移至节点7003,于是它向客户端返回错误:

ASK 16198 127.0.0.1:7003

这个错误表示客户端可以尝试到IP为127.0.0.1,端口号为7003的节点去执行和槽16198有关的操作,如图所示.接到ASK错误的客户端会根据错误提供的IP地址和端口号,转向至正在导入槽的目标节点,然后首先向目标节点发送一个ASKING命令,之后再重新发送原本想要执行的命令。
当客户端接收到节点7002返回的以下错误时:

ASK 16198 127.0.0.1:7003

客户端会转向至节点7003,首先发送命令:

ASKING

然后再次发送命令:

GET "love"

并获得回复:

"you get the key 'love'"

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

科研学习|可视化——相关性结果的可视化

一、相关性分析介绍 相关性分析是指研究两种或者两种以上的变量之间相关关系的统计分析方法&#xff0c;一般分析步骤为&#xff1a; 1&#xff09;判断变量间是否存在关联&#xff1b;2&#xff09;分析关联关系&#xff08;线性/非线性&#xff09;、关联方向&#xff08;正相…

UE5、CesiumForUnreal实现加载建筑轮廓GeoJson数据生成白模功能

1.实现目标 在UE5.3中,通过加载本地建筑边界轮廓面GeoJson数据,获取底面轮廓和楼高数据,拉伸生成白模,并支持点选高亮。为防止阻塞Game线程,使用了异步任务进行优化,GIF动图如下所示: 其中建筑数量:128871,顶点索引数量:6695748,三角面数量:2231916,顶点数量:165…

4.11 QT tcp群聊

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpSocket>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();private …

51单片机学习笔记——LED点亮

一、独立按键控制LED元器件和原理图 根据厂家给的原理图找到独立按键模块&#xff0c;观察下图我们知道按钮的一个头接GND&#xff0c;一头接IO口。由此可知我们如果需要使用第一个按钮则需要用p31。 二、独立按键控制LED程序 程序编写需要使用到IF else语句 当如果P310时P20…

【canvas】canvas基础使用(六):图形阴影

简言 学习使用canvas的阴影属性。 阴影 shadowBlur 阴影模糊 CanvasRenderingContext2D.shadowBlur 是 Canvas 2D API 描述模糊效果程度的属性&#xff1b;它既不对应像素值也不受当前转换矩阵的影响。默认值是 0。 语法&#xff1a; ctx.shadowBlur level; 选项值&#x…

【已解决】VMware Horizon Client: 无法建立安全加密链路连接

文章目录 问题原因解决方法方法1&#xff1a;在HTTPS拦截中添加VMware忽略列表 (推荐)方法2&#xff1a; 只拦截 浏览器进程的请求 / 取消 HTTPS 拦截&#xff08;如果没有拦截HTTPS的必要 / 只针对浏览器请求&#xff0c;可以使用此方法&#xff09; 当前使用mac 编辑&#xf…

leetcode328.奇偶链表

1. 题目描述 在线练习 2. 解题思路 这道题&#xff0c;官方给的是中等难度。其实是一道基础题&#xff0c;大家应该都可以写得出来。 题目中给的示例可以清楚的看到&#xff0c;合并前后的奇偶链的各自包含的节点的顺序是不变的&#xff0c;我们基本可以确定使用尾插法来合并…

vue2+codemirror代码渲染,实现滚动到指定行(三 滚动指定行)

vue2+codemirror代码渲染,当代码量过大时,在几千行的代码中找到所需的方法类比较困难。这时我们需要跳转到具体方法类,代码滚动到方法类所在的代码行。 这里需要先把光标指向到指定行,再滚动到该行, 亲测好用 scrollToLine(n) {// 将光标设置到第n行的第一个字符this.c…

量子城域网系列(二):量子密钥与通信系统中各层协议融合应用

写在前面。国家标准中对量子保密通信的定义&#xff1a;量子保密通信是利用QKD与其他密码技术结合形成的保密通信技术。 经过这段时间的讨论&#xff0c;我们基本上明白了量子保密通信的内涵、基础协议、技术原理等。我们知道了当前语境下的量子密钥分发网络核心是实现两点之间…

【ROS2笔记三】构建ROS2功能包

3.构建ROS2功能包 文章目录 3.构建ROS2功能包3.1ROS2中包的组成部分3.2创建ROS2功能包并编写节点3.2.1使用CMake创建功能包3.2.2编写cpp节点代码 3.3编译运行节点3.4使用面向对象的方式编写ROS2节点3.5使用RCLPY编写节点Reference 3.1ROS2中包的组成部分 ROS2可以使用CMake或者…

ELK日志分析系统+Filebeat

目录 一、Filebeat介绍 1、Filebeat简介 2、Filebeat的工作方式 3、filebeat工作流程 4、Filebeat的作用 5、filebeat的用途 1.为什么要用filebeat来收集日志&#xff1f;为什么不直接用logstash收集日志&#xff1f; 2.filebeat和logstash的区别 二、部署(ELFK)Fileb…

【web开发01】前端开发HTML、CSS-新浪新闻的实现

前端开发HTML、CSS-新浪新闻的实现 1 实现标题排版1.1图片连接的三种方式1.2 具体代码1.3 总结1.< h1>到< h6>是标题从大到小 2 实现标题样式2.1 css的三种引入方式2.2 颜色的三种表示2.3 css选择器2.4 超链接 3 实现正文排版3.1 视频标签 video3.2 音频标签 audio…

【网安小白成长之路】6.pkachu、sql-lbas、upload-lbas靶场搭建

&#x1f42e;博主syst1m 带你 acquire knowledge&#xff01; ✨博客首页——syst1m的博客&#x1f498; &#x1f51e; 《网安小白成长之路(我要变成大佬&#x1f60e;&#xff01;&#xff01;)》真实小白学习历程&#xff0c;手把手带你一起从入门到入狱&#x1f6ad; &…

Python操作MongoDB - 常用操作

1、连接MongoDB 可以下载使用客户端&#xff1a;MangoDB Compass # 连接数据库&#xff0c;INT_MONGO是INT环境mongo的连接串 mongo_client pymongo.MongoClient(INT_MONGO)2、访问数据库 # 访问数据库Pytest db mongo_client["Pytest"]3、创建集合&#xff08;…

文件加密软件大全,按市场份额排名

文件加密软件大全&#xff0c;按市场份额排名 文件加密是一种保护数据安全的重要手段&#xff0c;通过使用特定的算法将明文文件转化为密文&#xff0c;以防止未经授权的访问、篡改或泄露&#xff0c;市场份额排名的八款软件你需要了解一下。 1、安企神软件 专注于加密和审计…

漏洞挖掘 SSRF 一次很菜的SSRF低危小通杀

前言 一转眼貌似很长时间都没更新博客了&#xff0c;甚至连标题的大小和格式都有点忘了&#xff0c;今后应该尽量保持每周更新一次&#xff0c;主要是平常上课太忙了&#xff0c;在学校还总是不定时会刷新一些烂事&#xff0c;就耽误了很多时间。这篇文章用于记载我最近的一次…

深入理解MD5算法:原理、应用与安全

title: 深入理解MD5算法&#xff1a;原理、应用与安全 date: 2024/4/11 20:55:57 updated: 2024/4/11 20:55:57 tags: MD5算法数据安全哈希函数摘要算法安全漏洞SHA算法密码学 第一章&#xff1a;引言 导言 在当今数字化时代&#xff0c;数据安全和完整性变得至关重要。消息…

gradio简单搭建——关键词简单筛选【2024-4-11优化】

gradio简单搭建——关键词简单筛选[2024-4-11 优化] 新的思路&#xff1a;标签自动标注界面搭建优化数据处理与生成过程交互界面展示 新的思路&#xff1a;标签自动标注 针对通过关键词&#xff0c;在文本数据中体现出主体的工作类型这一任务&#xff0c;这里使用展示工具grad…

Claude使用教程

claude 3 opus面世后&#xff0c;网上盛传吊打了GPT-4。网上这几天也已经有了许多应用&#xff0c;但竟然还有很多小伙伴不知道国内怎么用gpt&#xff0c;也不知道怎么去用这个据说已经吊打了gpt-4的claude3。 今天我们想要进行的一项尝试就是—— 用claude3和gpt4&#xff0c…

猝不及防 CCF-B ICPP 2024投稿延期至4月22日提交摘要 机会来了别错过

会议之眼 快讯 第53届ICPP&#xff08;International Conference on Parallel Processing&#xff09;即国际并行处理会议将于 2024年 8月12日-15日在瑞典哥特兰岛举行&#xff01;ICPP是世界上最古老的连续举办的并行计算计算机科学会议之一。它是学术界、工业界和政府的研究…