Redis深入理解-三次握手、槽位机制

news2024/11/25 14:25:29

Redis 节点之间的三次握手原理分析

比如多台 Redis 之间要建立集群,那么连接其中的一台 Redis 客户端,向其他 Redis 发送 meet 命令即可通知其他节点,那么发送 meet 命令给其他节点后,对方也会在内存中创建一个 ClusterNode 结构,来维护集群中的节点信息

这里的三次握手指的是 Redis 中的三次握手用来建立应用层的连接(即进行集群节点之间的连接),与 TCP 三次握手不同

那么 Redis 中集群的建立就是通过 三次握手 + Gossip 协议 来实现的

Gossip 协议也被称作是具有代表性的最终一致性的 分布式共识协议,特点就是需要同步的信息如同流言一般进行传播

Gossip 协议具体流程就是,对于需要同步的信息,从信息源节点开始,随机选择连接的 k 个节点来传播消息,每一个节点收到消息后,如果之前没有收到过,就也发送给除了之前节点的相邻的 k 个节点,直到最后整个网络中的所有节点都收到了消息,达到了最终一致性。

基于 slots 槽位机制的数据分片原理

在 Redis 分布式集群中,我们将数据分散的放在了各个 Redis 节点中,这样才可以更好利用分布式集群的优点(增加数据读写速度、分散存储数据的话,增加集群节点也就相当于扩大 Redis 内存),那么如何来组织数据的存放位置呢

并且还存在一个问题,在集群扩容或者缩容时,也就是集群节点增加或者减少,那么就需要进行数据迁移

解释一下为什么要进行数据迁移:如果在集群中新增加一个节点,那么该节点中的数据是空的,那么肯定不合理,因此要将其他节点中的数据转移一部分数据到新的集群节点中去,缩容同理

那么对于 组织数据存放位置 以及 数据迁移 这两个问题是如何解决的呢?

通过 槽位机制 来实现

我们先来了解一下数据分片的概念,数据分片通过将数据拆分为更小的块(即分片),并将其存储在多个数据库服务器上来解决海量数据的存储,那么在 Redis 中的数据分片是通过 槽位机制 来实现的,集群将所有的数据划分为 16384 个槽位,每个槽位就是一个数据分片,每个节点负责其中一部分,那么在集群扩容或缩容时,通过给新节点分配槽位来实现数据迁移

Redis 集群 slots 分配与内核数据结构

那么已经知道了 Redis 集群中通过 slots 来实现数据分片,那么集群中的每个节点不仅存储了自己拥有的槽位,还存储了整个集群槽位以及哪个槽位属于哪个节点

每个节点分配好了自己的槽位之后,会把自己的槽位信息同步给集群中的其他的所有节点

在集群中的每个节点中,以下边的数据结构来存储集群的槽位信息以及自己所拥有的槽位信息

在这里插入图片描述

基于 slots 槽位的命令执行流程分析

比如客户端需要插入一个 key-value,那么该键值对肯定属于一个 slot,slot 一定属于一个节点,那么我们通过客户端去插入这个键值对时,客户端会先随机找一个节点发送命令过去,节点内部会计算这个 slot 属于哪个节点

通过 CRC16 算法对 key 值进行哈希,并且对 16384 取模来获取具体的槽位,再随便找一个节点查看集群槽位分配情况,如果该节点需要存放的槽位属于当前节点,直接执行命令就可以;如果不是自己的节点,那么该节点会返回给客户端一个 MOVED(slot + 目标地址),再将请求进行重定向

基于跳跃表的 slots 和 key 关联关系

在集群模式中,所有的数据被划分到 16384 个槽位中,每一个槽位都有一部分的数据,客户端在发送命令的时候,在 server 端也会计算 key 所属的槽位,就可以把数据放在槽位里

每次操作完 key-value 数据之后,对于这个 key,会使用专门的 skipList 跳跃表数据结构,来跟 slot 做一个关联

那么 slot 和 key 之间的关联关系是通过 skipList 来实现的

skipList 的结构如下,包括 4 部分:header(头结点)、tail(尾结点)、level(跳表层级)、length(跳表长度)

在这里插入图片描述

那么跳表中每个节点包含了:对象、score、BW、L1、L2…L32指针,那么在存储 key 与 slot 的对应关系时,对象字段存储的就是 key 的值,score字段存储的就是槽位的值,表示该 key 属于哪个 slot 槽位

集群扩容时的slots转移过程与ASK分析

如果在集群中加入新的节点,可以通过命令把某个节点上的一部分槽位转移到新的节点中去

那么 slots 的转移过程依赖于 clusterState 中的两个数据结构:clusterNode *migration_slots_to[16384]clusterNode* importing_slots_from[16384]

这两个数据结构都是指向了一个 clusterNode 数组

importing_slots_from[] 记录了槽位从哪些节点中转移过来,如果 importing_slots_from[i] 不是 null,而是指向了一个 clusterNode,那么表示正在从这个 clusterNode 中导入槽位 i

migration_slots_to[] 记录了槽位转移到哪些节点中去,如果 migration_slots_to[i] 不是 null,而是指向了一个 clusterNode,表示正在向这个 cluster 转移该槽位

那么在槽位的迁移过程中,会出现 ASK 错误:

即如果在转移的过程中,对一个节点中进行 key-value 操作,计算槽位之后,发现槽位并不在当前节点(已经被迁移走了),那么就返回客户端 ASK 错误,引导客户端去操作该槽位转移到的节点,那么客户端接收到 ASK 错误后,根据错误提供的 IP 地址和端口号,再去操作目标节点,在操作目标节点之前,会先发送 ASKING 命令,因为此时正在迁移过程中,槽位还在新节点的 importing_slots_from 中,如果不发送 ASKING 命令,目标节点此时还没有完成槽位迁移,会以为槽位还不在自己这里,就返回给客户端 MOVED 命令,让客户端又去找原来的节点了,完整流程如下:

在这里插入图片描述

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

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

相关文章

无代码未来:智能、可视化、自动化的融合

无代码是一个相对较新的概念,不同的人群对其界定可能存在一定的差异。 对于IT专业人士和开发人员而言,无代码通常是指使用可视化界面和拖拽操作来构建应用程序的工具和平台。 无代码平台通过提供预先构建的组件和模块,使得开发人员可以通过简…

Shader编程:“热成像”风格的效果是怎么实现的?(内附源码)

未经作者(微信ID:Byte-Flow)允许,禁止转载 文章首发于公众号:字节流动 之前转载过知乎上面的一篇文章: 作者:这是上帝的杰作 链接:https://zhuanlan.zhihu.com/p/344110917 文章详细讲解了 Shader 实现“热成像”效果的思路,但是并没有给出完整的实现代码,后台有读者…

Fluent热辐射壁面设置

对于固体壁面,可分为: 内部面外部面 外部面,若需要考虑外部热辐射的影响,需要将类型改为“mixed”或者“radiation”类型,并设置外部的发射率。 内部面通常为“wall”和“wall-shadow”的配对形式。 对于两侧均是透明…

经验分享:JMeter控制RPS

一、前言 ​ RPS (Request Per Second)一般用来衡量服务端的吞吐量,相比于并发模式,更适合用来摸底服务端的性能。我们可以通过使用 JMeter 的常数吞吐量定时器来限制每个线程的RPS。对于RPS,我们可以把他理解为我们的TPS,我们就…

工博会新闻稿汇总

23届工博会媒体报道汇总 点击文章标题即可进入详情页 9月23日,第23届工博会圆满落幕!本届工博会规模之大、能级之高、新展品之多创下历史之最。高校展区在规模、能级和展品上均也创下新高。工博会系列报道深入探讨了高校科技发展的重要性和多方面影响。…

疯狂小杨哥花3000万举办演唱会

我是卢松松,点点上面的头像,欢迎关注我哦! 确实厉害,95年的,白手起家,1亿元买楼,3000万办演唱会,而且会在线上直播,疯狂小杨哥正常从“网红”向“企业家”的转变。全网没…

HarmonyOS 应用模型开发指南介绍

一、基本概念解析 新版文档中的知识点,介绍更全面,逻辑更清晰,提供了各类基本概念解析,帮助开发者更快学习、掌握系统能力。以下是新版文档部分概念展示。 1、HAP是什么? 开发者通过DevEco Studio把应用程序编译为一…

C++之哈希

unordered系列容器的效率之所以比较高(尤其是查找),是因为它底层使用了哈希结构,即哈希表. 哈希概念 前言: 顺序结构以及平衡树中, 元素关键码与其存储位置之间没有对应的关系, 因此在查找一个元素 时, 必须要经过关键码的多次比较. 顺序查找时间复杂度为O(N), 平衡树中为树的…

内蒙古珠三角服务工作站挂牌 搭建桥梁促进民营经济发展

内蒙古自治区促进民营经济发展珠三角服务工作站挂牌仪式暨蒙粤两地民营企业家交流座谈会在深圳市顺利举行。 为贯彻落实内蒙古自治区党委、政府关于促进民营经济发展的决策部署,11月26日,由自治区发展改革委、工商联共同主办的“内蒙古自治区促进民营经济…

SQL Server详细使用教程(包含启动SQL server服务、建立数据库、建表的详细操作) 非常适合初学者

文章目录 目录 前言 一、启动SQL server服务的三种方法 1.不启动SQL server服务的影响 2.方法一:利用cmd启动SQL server服务 3.方法二:利用SQL Server配置管理器启动SQL server服务 4.方法三:在服务管理器中启动SQL server服务 二、建立数据库…

js的数组去重方法

目录 es6数组中对象去重 1. filter()用法 2. findIndex()用法 3. 去重 其他方法: 方法二:reduce()去重 1. reduce()用法 1.1 找出字符长度最长的数组成员。 1.2 扁平化二维数组 1.3 扁平化多维数组 三、总结方案: 使用Set&#xf…

华为的数字化转型(9)——企业架构4A集成模型

企业架构(Enterprise Architecture,EA)是衔接战略与项目实施的桥梁,引入企业架构方法,可以对数字化转型愿景进行系统性的、分层分级的梳理和解释,以便企业上下在同一张蓝图上统一认识。 企业架构提供了整体…

Intel Software Guard Extensions简介

文章目录 前言一、新的基于硬件的控件实现数据安全二、机密计算的挑战三、用于机密计算的增强安全功能四、Enclave验证和数据密封五、数据中心认证参考资料 前言 最近开始研究Intel SGX硬件特性,记录下研究过程。 参考文档:product-brief-SGX 一、新的…

如何与死锁斗争!!!

其他系列文章导航 Java基础合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、死锁场景现场 二、死锁是如何产生的 三、死锁排查思路 四、sql模拟死锁复现 五、死锁的解决方案 前言 为避免影响业务,应尽可能避…

springboot实现数据脱敏

springboot实现数据脱敏 怎么说呢,写着写着发觉 ”这写的什么玩意“ 。 总的来说就是,这篇文章并不能解决数据脱敏问题,但以下链接可以。 SpringBoot中利用自定义注解优雅地实现隐私数据脱敏 然后回到本文,本来是想基于AOP代理&am…

MySQL优化技巧

在使用一些常规的 SQL 时&#xff0c;如果我们通过一些方法和技巧来优化这些 SQL 的实现&#xff0c;在性能上就会比使用常规通用的实现方式更 优化分页查询 通常我们是使用 <LIMIT M,N> 合适的 order by 来实现分页查询&#xff0c;这种实现方式在没有任何索引条件支…

【Java】IDEA 基本操作

0.IDEA 0.1 IDEA中的层级结构 0.1.1 结构分类 project&#xff08;项目、工程&#xff09;module&#xff08;模块&#xff09;package&#xff08;包&#xff09;class&#xff08;类&#xff09; 0.1.2 结构介绍 project&#xff08;项目、工程&#xff09; ​ 淘宝、京…

物联网AI 无线连接学习之WiFi基础篇 802.11协议发展

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 前言 随着物联网行业不断发展&#xff0c;WiFi技术的发展在其中起着非常关键的作用&#xff0c;也是我们日常生活中使用非常广泛的无线网络技术之一&#xff0c;现在我们随便买一个家用电子产品&#xff0c…

java springboot测试类Transactional解决 测试过程中在数据库留下测试数据问题

好 目前 我们已经完成了表现层对应的测试了 但这里有个坑 如果我们在执行某个声明周期时 包含了测试的过程 它会在数据库中留下一条数据 但真实企业开发 绝对不允许 过一遍留一组数据的 那么 我们的期望就是 执行测试过程 但不要留下任何数据 这是我们的数据库表 然后 这里…

华为电视盒子 EC6108V9C 刷机成linux系统

场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 家里装宽带的时候会自带电视盒子&#xff0c;但是由于某些原因电视盒子没有用&#xff0c;于是就只能摆在那里吃土&#xff0c;闲来无事&#xff0c;搞一下 问题描述 提示&#xff1a;这里描述项目中遇到…