Redis中的集群(六)

集群

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.mzph.cn/news/808732.shtml

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

相关文章

std::vector的核心框架接口的模拟实现bit::vector

std::vector的核心框架接口的模拟实现bit::vector #pragma once #include<iostream> #include<assert.h> #include<string> #include<algorithm> #include<vector>using std::cout; using std::endl;namespace bit {template<class T>cla…

C中自定义类型——结构体

一.前言 在C语言中&#xff0c;不仅有int、char、short、long等内置类型&#xff0c;C语言还有一种特殊的类型——自定义类型。该类型可以由使用者自己定义&#xff0c;可以解决一些复杂的个体。 二.结构体 2.1结构体的声明 我们在利用结构体的时候一般是用于描述一些有多种…

c++ 类型转换dynamic_cast

在C中&#xff0c;dynamic_cast 是一种用于安全地将指针或引用从一个类类型转换为另一个类类型的运算符。它主要用于在继承层次结构中进行类型转换&#xff0c;并在运行时执行类型检查&#xff0c;以确保转换的安全性。 dynamic_cast 执行以下操作&#xff1a; 1. 它检查 expr…

【SpinalHDL】Scala编程中的var及val

1. var与val区别及相同点 在SpinalHDL中&#xff0c;var 和 val 是两种不同的变量声明方式&#xff0c;它们在用法和语义上有一些区别和相同点&#xff1a; 1. 区别 var&#xff1a;代表可变变量&#xff0c;类似于其他编程语言中的可变变量。使用 var 声明的变量可以在声明…

javaweb配置JSTL

首先配置好javaweb项目。 在网上下载好jakarta-taglibs-standard并解压。 在web/WEB-INF目录下创建lib目录。 在jakarta-taglibs-standard目录下lib目录内的两个.jar文件复制到javaweb项目lib目录下。 将这两个.jar包导入库。 在idea菜单栏找到“文件”并打开&#xff0c;点…

linux磁盘知识学习

文章目录 linux 磁盘阵列知识积累配置RAID方案在Linux中配置RAID在其他设备上配置RAID 确认是什么RAID级别cat /proc/mdstat 输出示例mdadm --detail /dev/md0输出示例 如何确认设备是否做了RAID其他方式fdisklsblkpartedlshwlsscsismartctlblkid 不同命令使用场景1.fdisk2.mda…

nvm更新node版本

1、nvm安装和管理多个 Node.js 版本&#xff1a;NVM 允许用户在计算机上同时安装多个不同版本的 Node.js。这使得开发人员可以轻松地在不同的项目中使用不同的 Node.js 版本&#xff0c;而无需手动安装或卸载。 2、nvm切换 Node.js 版本&#xff1a;通过 NVM&#xff0c;用户可…

好菜每回味道不同--建造者模式

1.1 炒菜没放盐 中餐&#xff0c;老板需要每次炒菜&#xff0c;每次炒出来的味道都有可能不同。麦当劳、肯德基这些不过百年的洋快餐却能在有千年饮食文化的中国发展的那么好呢&#xff1f;是因为你不管何时何地在哪里吃味道都一样&#xff0c;而鱼香肉丝在我们中餐却可以吃出上…

Langchain-Chatchat 从入门到精通(基于本地知识库的问答系统)(更新中)

目录 前言一、Langchain-Chatchat介绍1-1、Langchain-Chatchat介绍1-2、LangChainChatGLM 工作流1-3、文档角度的工作流 二、快速上手2-0、硬件要求2-1、环境配置2-2、模型下载2-3、初始化知识库和配置文件2-4、一键启动 三、配置文件详解&#xff08;config目录下&#xff09;…

浏览器输入域名执行全过程?

当你在浏览器中输入www.baidu.com并按下回车键时&#xff0c;会触发一系列复杂的过程才能在你的屏幕上显示出百度的首页。以下是这一过程的详细步骤&#xff1a; 1. 解析域名 首先&#xff0c;浏览器需要解析你输入的域名www.baidu.com。这个过程称为DNS查询。 浏览器缓存&a…

MybatisPlus实现数据权限隔离

引言 Mybatis Plus对Mybatis做了无侵入的增强&#xff0c;非常的好用&#xff0c;今天就给大家介绍它的其中一个实用功能&#xff1a;数据权限插件。 数据权限插件的应用场景和多租户的动态拦截拼接SQL一样。建议点赞收藏关注&#xff0c;方便以后复习查阅。 依赖 首先导入M…

【Java集合】面试题汇总

Java 集合Java 集合概览1. List, Set, Queue, Map 四者的区别&#xff1f;2. ArrayList 和 Array&#xff08;数组&#xff09;的区别&#xff1f;3. ArrayList 和 Vector 的区别?4. Vector 和 Stack 的区别?&#xff08;了解即可&#xff09;5. ArrayList 可以添加 null 值吗…

【端云一体化开发】云函数本地运行/调试启动失败的两种解决方案

最近本地调试云函数一直出现这个错误&#xff1a;Before launch task execute failed! details:java.lang.lllegalStateException: npm installfailed 这个问题的原因似乎是运行云函数的时候会重新下载 npm 及相关依赖文件&#xff0c;但是 DevEco 的 npm 模块出错导致这个步骤…

智慧园区平台再升级!智慧迭代,服务升级

伴随物联网、人工智能等技术的迅速发展和智能化水平的提高&#xff0c;智慧园区成为了现代区域经济高质量发展的重要组成部分&#xff0c;上承智慧城市的建设&#xff0c;下接智慧运营和管理。智慧园区是一种基于信息技术的智能化管理模式&#xff0c;通过物联网、大数据、人工…

java中常见的几种排序

常见的几种排序整理 冒泡排序选择排序插入排序希尔排序快速排序归并排序堆排序 冒泡排序 思想&#xff1a;对比当前值的下一个值&#xff0c;如果大就交换位置 代码&#xff1a; /*** 冒泡排序*/ public class bubbleSort {public static void main(String[] args) {int[] ar…

【域适应】深度域适应常用的距离度量函数实现

关于 深度域适应中&#xff0c;有一类方法是实现目标域和源域的特征对齐&#xff0c;特征对齐的衡量函数主要包括MMD&#xff0c;MK-MMD&#xff0c;A-distance&#xff0c;CORAL loss&#xff0c; Wasserstein distance等等。本文总结了常用的特征变换对齐的函数定义。 工具 …

初始C++之缺省参数 函数重载 引用

初始C之缺省参数 函数重载 引用& 文章目录 初始C之缺省参数 函数重载 引用&一、缺省参数1.1 缺省参数的定义1.2 缺省参数的分类1.3 注意事项 二、 函数重载2.1 函数重载的定义2.2 参数个数不同2.3 参数类型不同2.4 类型顺序不同2.5 为什么C语言不支持函数重载 三、引用…

模型3-掌握模型与骨骼、动画播放之间的关系

模型、骨骼和动画播放之间存在密切的关系。在计算机图形学中&#xff0c;模型是指用于表示三维物体的几何形状和表面属性的数据。而骨骼是一种用于模拟物体的骨架结构的技术&#xff0c;它由一系列关节和连接它们的骨头组成。动画播放则是指将骨骼与模型进行关联&#xff0c;并…

OpenHarmony南向开发案例:【智能保险柜】

样例简介 智能保险柜实时监测保险柜中振动传感器&#xff0c;当有振动产生时及时向用户发出警报。在连接网络后&#xff0c;配合数字管家应用&#xff0c;用户可以远程接收智能保险柜的报警信息。后续可扩展摄像头等设备&#xff0c;实现对危险及时报警&#xff0c;及时处理&a…

探究 ChatGPT 的心脏--Transformer(基础知识第一篇)

Transformer 是 ChatGPT 的核心部分&#xff0c;如果将 AI 看做一辆高速运转的汽车&#xff0c;那么 Transformer 就是最重要的引擎。它是谷歌于 2017 年发表的《Attention is All You Need》中提出的 Sequence-to-sequence 的模型&#xff0c;诞生之后便一统江湖&#xff0c;在…