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.hqwc.cn/news/610330.html

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

相关文章

[目标检测] OCR: 文字检测、文字识别、text spotter

概述 OCR技术存在两个步骤&#xff1a;文字检测和文字识别&#xff0c;而end-to-end完成这两个步骤的方法就是text spotter。 文字检测数据集摘要 daaset语言体量特色MTWI中英文20k源于网络图像&#xff0c;主要由合成图像&#xff0c;产品描述&#xff0c;网络广告(淘宝)MS…

java题目17:以m行n列二维数组为参数进行方法调用,分别计算二维数组各列元素之和,返回并输出计算结果(MethodCalls17)

每日小语 伟大企业的一项特质是“利润之上的追求”。——段永平 思考 方法调用 方法调用是通过在代码中使用方法名和参数列表来实现的。 public class MethodExample {public static void main(String[] args) {// 调用方法add&#xff0c;并传入两个参数int sum add(3, 5…

springCloudAlibaba集成sentinel实战(超详细)

一、Sentinel介绍 1. 什么是Sentinel Sentinel是阿里开源的项目&#xff0c;提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。 分布式系统的流量防卫兵&#xff1a; 随着微服务的普及&#xff0c;服务调用的稳定性变得越来越重要。Sentinel以“流…

Leetcode:283.移动零

题目要求 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums [0…

python linux服务器ssh简单爆破(测试用户名密码)(连接ssh服务器)(测试登录ssh服务器)

文章目录 背景示例代码代码解释导入模块SSH服务器的地址和端口用户名和密码列表生成所有可能的用户名和密码组合尝试连接到SSH服务器并验证用户名和密码遍历并测试每一对凭证 背景 我们华为摄像头linux终端的密码忘了&#xff0c;还不太好初始化&#xff0c;手动一个个测试太麻…

Java - 算术运算符与算术表达式

今天我们要讲解的是算术运算符和算术表达式。在编程中&#xff0c;我们经常需要进行各种数学计算&#xff0c;而算术运算符和算术表达式则是我们实现这些计算的基础工具。 首先&#xff0c;我们先来了解一下什么是算术运算符。算术运算符是用来进行数学运算的符号&#xff0c;…

无重复字符串的最长子串

题目描述&#xff1a;给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串的长度。 第一次提交记录 class Solution:def lengthOfLongestSubstring(self, s: str) -> int:if not s:return 0lookup set()left res 0for right in range(len(s)):while s…

IDEA2023 开发环境配置

目录 1. 关闭IDEA自动更新1.2 IDEA 新版样式切换 2. Maven配置2.1本地仓库优先加载2.2 maven.config配置文件中 3. 全局配置JDK4. 配置文件编码:UTF-85. 开启自动编译&#xff08;全局配置&#xff09;6. 开启自动导包7. 开启鼠标悬浮&#xff08;提示文档信息&#xff09;8. 设…

Ollama教程——兼容OpenAI API:高效利用兼容OpenAI的API进行AI项目开发

相关文章: Ollama教程——入门&#xff1a;开启本地大型语言模型开发之旅 Ollama教程——模型&#xff1a;如何将模型高效导入到ollama框架 Ollama教程——兼容OpenAI API&#xff1a;高效利用兼容OpenAI的API进行AI项目开发 Ollama教程——兼容OpenAI API&#xff1a;高效利用…

编程新手必看,python中条件控制语句学习(13)

介绍&#xff1a; Python3中的条件控制主要通过if、elif和else关键字来实现&#xff0c;它们用于根据条件执行特定的代码块。 if语句&#xff1a;这是最基本的条件控制结构。如果满足某个条件&#xff08;条件为True&#xff09;&#xff0c;则执行相应的代码块。在Python中&am…

新国标过渡期接近尾声,九号公司“多篮子鸡蛋”开始奏效?

随着2023年报披露接近尾声&#xff0c;两轮电动车行业的马太效应愈发凸显。 具体来看&#xff0c;行业巨头雅迪、爱玛继续稳健增长&#xff0c;而在新势力中&#xff0c;曾冠以“两轮特斯拉”光环的小牛电动业绩大幅下滑&#xff0c;但令人意外的是&#xff0c;4月初发布最新财…

5G-A有何能耐?5G-A三载波聚合技术介绍

2024年被称作5G-A元年。5G-A作为5G下一阶段的演进技术&#xff0c;到底有何能耐呢&#xff1f; 三载波聚合&#xff08;3CC&#xff09;被认为是首个大规模商用的5G-A技术&#xff0c;将带来手机网速的大幅提升。 █ 什么是3CC 3CC&#xff0c;全称叫3 Component Carriers…