【Redis】聊一下Redis切片集群的原理

news2024/11/28 20:39:41

背景

在分布式领域中,为了提高系统的稳定性,一般会采用数据复制/镜像的方式,同时部署多个相同功能的节点提供服务,也就是A B C存储的相同的数据。有一个主节点提供读写服务,另外两个节点进行数据的复制,在MySQL中其实就是一主多从,在Redis其实也是一样的机制。而Kafka中呢,具体表现形式,也是通过多个节点进行构建集群模式。
但是为了提供系统的整体容量,也就是提供系统的高性能,一般单节点存储的数据量是有一定的上线,比如单台的MySQL存储上亿数据查询速度就比较慢,同样对于Kafka、Redis来说,其实他们存储的数据容量都受限于宿主机的配置,比如CPU、内存、磁盘、网络带宽等,所以为了提高系统的整体存储量,在不影响性能的前提下,大多会采用分片、切片、分库、分表模式进行数据存储。具体形式可能在不同的中间件表现形式不一样,但是只要是存储系统,很难逃脱以下几个问题

  • 单点故障-> 采用集群模式 (数据复制/镜像)(目的:提供系统稳定性、高可用)
  • 提升系统吞吐量-> 采用分片模式(数据分片)(目的:提升系统高性能)
  • 一般集群只要涉及到数据一致性,都会用到共识算法,比如raft、paxos等。

你看进行釜底抽薪之后,发现其实存储中间件的本质都是一样的。比如MySQL中分片模式会采用分库分表,将数据存储到不同的节点上,以分摊数据压力,Kafka很巧妙的使用了集群模式+分片的机制。那么对于Redis是如何处理的呢?让我们开始学习。

如何保存更多数据

比如我们一下子存储25G的数据到Redis中,一般的配置服务器肯定是容纳不下,所以解决方案就是要么采用高配置的单实例要么就采用多实例,将25G的数据进行切分分别存储到不同的实例中。
其实就是横行拓展和水平拓展。
在这里插入图片描述
在这里插入图片描述
两种方式都有优缺点。
横行拓展:可以方便的进行添加实例,但是这样会引入数据如何进行存储到不同的实例中,肯定需要引入一个比较好的负载算法,这是存数据的过程,如何进行查询数据,也就是采用相同的算法,需要将数据在对应的实例中查询到。也就是两点,一个是数据切片和实例的对应关系如何查询和判断,另一个就是客户端查询数据的时候如何能查询到数据
纵向拓展:横行拓展说白了就是免去了上面的数据切片和实例这种关系维护,只要在一台机器上就可以存储和查询。坏处是单机的配置是有上限的,不可能无限的添加服务硬件配置。

数据切片和实例的对应分布关系

数据切片的实现方案有很多中,Redis Cluster属于一种方案,其中规定了数据和实例的对应规则。
其实就是Redis Cluster采用哈希槽的方案,分为16384个,通过key进行CRC16算法计算出对应16bit值,然后在对16834取模,就可以获取在那个对应的槽,而槽在那个实例也可以定位到。
在这里插入图片描述
在手动分配哈希槽时,需要把 16384 个槽都分配完,否则 Redis 集群无法正常工作。

客户端如何定位数据

其实这个过程就是如何进行数据的读取,客户端在读取数据的时候,可以计算出数据在那个哈希槽,但是这个哈希槽在哪个实例上是不得而知的。客户端连接的是一个实例集群,所以每个实例知道自己所分配的哈希槽信息,在构建这个集群的时候,会进行哈希槽信息的扩散。而客户端随便连接任意一个实例都可以获取整个哈希槽分配的位置的信息。之后客户端进行获取数据,就可以把哈希槽分配信息数据存储到本地缓存。
这里的情况只是描述了一次分配哈希槽之后不会改变的情况,但是随着实例减少或者增加,会改变哈希槽分配信息的。以及为实现哈槽负载均衡,会进行动态的分配哈希槽。而这个过程其实有点类似于Kafka中rebalance过程,也就是随着消费者减少或者增加的时候,会进行消息的重新分配。你看解决问题的思路都是相同的。
那么针对上面的情况,Redis是如何解决的?
当出现哈槽槽变更的时候,客户端存储的是缓存的旧数据,因此两者之间的数据就不一致。解决方案也比较简单,通过重定向的方式,当访问哈希槽1的时候,客户端缓存的数据是在实例1中,但是由于负载均衡,哈希槽1分给了实例2,所以实例1会返回 move指令
get k1 v1
move 1 实例2ip:6379
这个时候客户端接受到实例1的MOVE指令,就会请求实例2,并将更新信息存储到本地缓存。
在这里插入图片描述
上面描述的是数据完全迁移成功的情况,但是如果数据没有迁移成功,而是还在处理中,如何解决?
其实,比较简单,说白了,比如客户端请求的哈希槽1 缓存信息是在实例1中,但是由于负载均衡,导致将哈希槽1数据分配给了实例2,这个时候客户端发送请求过来请求实例1,但是由于哈希槽1数据比较多,导致数据不能完全迁移过程,一个处理中状态。实例1会返回给客户端一个ASK命令,这个命令的含义有两层,一个是数据哈希槽1还没有完全迁移成功,二是会把最新的哈希槽1实例返回给你,你需要通过ASKing进行在请求哈希槽1的真正实例。接受发送获取数据的命令。
在这里插入图片描述
如果按照上述图中描述的说,整体流程就是如下
1.客户端请求Slot2,但是由于本地缓存数据存储的是实例2,所以会给实例2发送一个数据的请求。
2.实例2接受到请求后,发现这个数据已经在转移到实例3中,并且这个数据还没有完全迁移成功。所以会返回一个ASK的命令给客户端。
3.客户端接受到ASK命令就会请求发送给真正的实例3,先发送一个ASKING的命令,然后在发送获取数据的命令。
那么有同学就会问,MOVE和ASK的区别是什么?
MOVE会更新客户端本地哈希槽分配信息,但是ASK不会更新,ASK只会告诉客户端发送一条信息给新实例一个请求,而需要等数据完全同步之后,通过MOVE指令进行重定向到新的实例,这个时候才会更新客户端本地的哈希槽分配信息。

小结

本篇主要介绍了Redis分片集群的方式,用以保存大量数据的场景,以及切片之后数据的写入和读取问题。具体的就是哈希槽的分配机制,以及客户端的定位键值对的问题。ASK和MOVE指令,而这种方式也就是Redis Cluser。所以总结以下就是Redis 复制、Redis sentinel、Redis cluser。

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

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

相关文章

chatgpt赋能python:Python去重-如何高效地处理重复数据

Python去重 - 如何高效地处理重复数据 在数据处理过程中,重复数据可能会导致很多问题,如降低计算效率、影响数据质量等。因此,数据去重是一个非常重要的任务,特别是在大数据处理中更是如此。Python作为一种流行的编程语言&#x…

make xxx_deconfig过程

在uboot中,所写的shell脚本:mx6ull_alientek_emmc.sh的内容如下: #!/bin/bash2 make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- distclean3 make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfig4 make V1…

[数据结构习题]队列——用栈实现队列

[数据结构习题]队列——用栈实现队列 👉知识点导航💎:【数据结构】栈和队列 👉[王道数据结构]习题导航💎: p a g e 85.3 page85.3 page85.3 本节为栈和队列的综合练习题 题目描述: &#x1f…

chatgpt赋能python:Python实现CSV文件只取某两列的方法详解

Python实现CSV文件只取某两列的方法详解 介绍 CSV是一种常见的数据格式,通常使用逗号或分号分隔不同的字段。在处理CSV文件时,我们经常需要只提取其中的某些列,以便进行进一步的分析或处理。使用Python语言,可以很方便地实现这一…

MTK 相机功耗分析流程

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、硬件功耗二、相机软件功耗三、参考文档 一、硬件功耗 1.1 硬件信息 以下硬件信息最好提前获取到 模块备注平台MTK or Qcom or sprdCPU频率大中小核…

【Python】Python系列教程-- Python3 列表(十二)

文章目录 前言访问列表中的值更新列表删除列表元素Python列表截取与拼接嵌套列表列表比较Python列表函数&方法 前言 往期回顾: Python系列教程–Python3介绍(一)Python系列教程–Python3 环境搭建(二)Python系列…

第一次使用Arduino IDE(mac os) 配置合宙ESP32C3(9.9包邮)且烧录代码的历程

目录 Arduino 配置ESP32 1. Arduino 请更新至最新版 2.科学上网 3.添加开发板管理URL 配置 1.连接开发板 2.Arduino IDE 的配置 3.烧录代码 Arduino 配置ESP32 1. Arduino 请更新至最新版 2.科学上网 3.添加开发板管理URL 首选项,编辑并添加 https://…

医疗实施-DRG基本知识

医疗实施-DRG基本知识 DRG常见名词定义: DRG(Diagnosis Related Groups):疾病诊断相关分组,是用于衡量医疗服务质量效率以及进行医保支付的一个重要工具。DRG 实质上是一种病例组合分类方案,即根据年龄、疾病诊断、合…

网络安全学术顶会——NDSS 2023 议题清单、摘要与总结(下)

51、Let Me Unwind That For You: Exceptions to Backward-Edge Protection 通过堆栈缓冲区溢出进行反向边控制流劫持是软件利用的终极目标。直接控制关键的堆栈数据和劫持目标使得攻击者特别喜欢这种利用策略。因此,社区已经部署了强大的反向边保护,如影…

Executor框架的成员

Executor框架的成员 (1)ThreadPoolExecutorThreadPoolExecutor通常使用工厂类Executors来创建。Executors可以创建3种类型的ThreadPoolExecutor:SingleThreadExecutor、FixedThreadPool和CachedThreadPool。1) FixedThreadPool 。…

chatgpt赋能python:Python取某几行-掌握技巧提高效率

Python取某几行-掌握技巧提高效率 Python是一种简单易学、高效编程的语言。它也是一种非常强大的语言,适用于许多不同领域的应用程序。在处理文本文件和数据集时,Python的优势变得尤为突出。在这篇文章中,我们将重点介绍如何使用Python取某几…

Linux【网络编程】之深入理解UDP协议

Linux【网络编程】之深入理解UDP协议 一、传输层二、再谈端口号2.1 端口号划分 三、查看网络状态---netstat四、查看服务器进程ID---pidof五、UDP协议端格式5.1 理解报头 六、UDP的特点七、UDP的缓冲区问题八、常见基于UDP的应用层协议 在前面的几篇文章中我主要偏向于应用层介…

30分钟!从0到1,用ChatGPT+Python做一个AI起名网!

坚持6年,第629篇原创 现在利用ChatGPT可以做很多很多事情,而对于我们程序员来说,是机会也是挑战!因为原来很多工种,很多技术问题现在可以用非常廉价的技术去获取,成本更低了! 打个比方&#xff…

【LeetCode】《LeetCode 101》第十章:神奇的位运算

文章目录 10.1 常用技巧10.2 位运算基础问题461. 汉明距离(简单)190. 颠倒二进制位(简单)136. 只出现一次的数字(简单) 10.3 二进制特性342. 4的幂(简单)318. 最大单词长度乘积&…

Vue+springboot舞蹈基础课程视频学习分享平台的实现和开发

基于java语言设计并实现了舞蹈基础数据平台。该系统基于B/S即所谓浏览器/服务器模式,应用Springboot框架,选择MySQL作为后台数据库。系统主要包括首页、个人中心、用户管理、舞蹈类型管理、舞蹈视频管理、用户留言、管理员管理、系统管理等功能模块。 重…

springboot+vue+elementui计算机专业课程选课管理系统vue

本系统的主要任务就是负责对学生选课。主要用户为老师、学生,其中,学生可对自己的信息进行查询,可以进行选课,也可以进行删除已选课程,教师可对学生和课程的信息进行查询,教师拥有所有的权限,可以添加删除学生信息。系统提供界面,操作简单。 为实现这些功能,系统一个…

山区特殊场景的倾斜摄影三维模型数据出现几何坐标偏差原因,如何修正这些坐标偏差?

山区特殊场景的倾斜摄影三维模型数据出现几何坐标偏差原因,如何修正这些坐标偏差? 山区倾斜摄影三维模型数据出现几何坐标偏差的原因可能有很多,其中一些常见的原因包括不同地图投影系统之间的转换问题、GPS定位误差、测量设备精度问题、摄影…

C++入门:引用、内联函数、auto关键字

目录 一:引用 (1)概念 (2)使用 (3)引用的特性 (4)引用的使用场景 【1】做参数 【2】做返回值 (5) 引用的权限问题 (6)引用和指针的区别 【1】引用的底层实现 【2】指针和引用的一些不同 二:内联函数 (1)宏函数 【1】 宏的优点 【2】宏的缺…

【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......

目录 一、学习内容二、数据库事务三、JDBC 的事务管理四、事务的四大特性五、MyBatis六、MyBatis 核心配置文件和基本使用七、查询 student 表(1) 实体映射文件 mapper(2) 读取核心配置文件, 拿到 SqlSession 八、字段和属性名映射(1) mapUnderscoreToCamelCase(2) 完整的 sett…

【Linux】基本开发工具包使用

目录 一, yum ——linux软件包管理器 1. 软件包是啥子? 2. yum基本使用 1. 步骤: 2. 开发工具推荐(centos 7.6) 二,vim —— linux文本编辑器 1. Normal mode —— 命令模式(记不住没关系&#x…