浅谈 Redis 的切片集群

news2024/11/23 19:02:49

切片集群,也叫分片集群,就是指启动多个 Redis 实例组成一个集群,然后按照一定的规则,把收到的数据划分成多份,每一份用一个实例来保存。回到我们刚刚的场景中,如果把 25GB 的数据平均分成 5 份(当然,也可以不做均分),使用 5 个实例来保存,每个实例只需要保存 5GB 数据。如下图所示:

img

实际上,切片集群是一种保存大量数据的通用机制,这个机制可以有不同的实现方案。在 Redis 3.0 之前,官方并没有针对切片集群提供具体的方案。从 3.0 开始,官方提供了一个名为 **Redis Cluster 的方案,用于实现切片集群。**Redis Cluster 方案中就规定了数据和实例的对应规则。

具体来说,Redis Cluster 方案采用哈希槽(Hash Slot,接下来我会直接称之为 Slot),来处理数据和实例之间的映射关系。在 Redis Cluster 方案中,一个切片集群共有 16384 个哈希槽,这些哈希槽类似于数据分区,每个键值对都会根据它的 key,被映射到一个哈希槽中。

那么,这些哈希槽又是如何被映射到具体的 Redis 实例上的呢?

我们在部署 Redis Cluster 方案时,可以使用 cluster create 命令创建集群,此时,Redis 会自动把这些槽平均分布在集群实例上。例如,如果集群中有 N 个实例,那么,每个实例上的槽个数为 16384/N 个。

当然, 我们也可以使用 cluster meet 命令手动建立实例间的连接,形成集群,再使用 cluster addslots 命令,指定每个实例上的哈希槽个数。

另外,我再给你一个小提醒,在手动分配哈希槽时,需要把 16384 个槽都分配完,否则 Redis 集群无法正常工作。

客户端如何定位数据的?

在定位键值对数据时,它所处的哈希槽是可以通过计算得到的,这个计算可以在客户端发送请求时来执行。但是,要进一步定位到实例,还需要知道哈希槽分布在哪个实例上。

客户端和集群实例建立连接之后,实例就会把自己的哈希槽信息上报给客户端,每个实例在创建集群之初是不知道其他实例的哈希槽的。

**那么,客户端为什么可以在访问任何一个实例时,都能获得所有的哈希槽信息呢?**这是因为,Redis 实例会把自己的哈希槽信息发给和它相连接的其它实例,来完成哈希槽分配信息的扩散。当实例之间相互连接后,每个实例就有所有哈希槽的映射关系了。

**客户端收到哈希槽信息后,会把哈希槽信息缓存在本地。**当客户端请求键值对时,会先计算键所对应的哈希槽,然后就可以给相应的实例发送请求了。

但是,在集群中,实例和哈希槽的对应关系并不是一成不变的,最常见的变化有两个:

  • 在集群中,实例有新增或删除,Redis 需要重新分配哈希槽;

  • 为了负载均衡,Redis 需要把哈希槽在所有实例上重新分布一遍。

两个error

当客户端把一个键值对的操作请求发给一个实例时,如果这个实例上并没有这个键值对映射的哈希槽,那么,这个实例就会给客户端返回下面的 MOVED 命令响应结果,这个结果中就包含了新实例的访问地址。

GET hello:key
(error) MOVED 13320 172.16.19.5:6379

其中,MOVED 命令表示,客户端请求的键值对所在的哈希槽 13320,实际是在 172.16.19.5 这个实例上。通过返回的 MOVED 命令,就相当于把哈希槽所在的新实例的信息告诉给客户端了。这样一来,客户端就可以直接和 172.16.19.5 连接,并发送操作请求了。

GET hello:key
(error) ASK 13320 172.16.19.5:6379

这个结果中的 ASK 命令就表示,客户端请求的键值对所在的哈希槽 13320,在 172.16.19.5 这个实例上,但是这个哈希槽正在迁移。此时,客户端需要先给 172.16.19.5 这个实例发送一个 ASKING 命令。这个命令的意思是,让这个实例允许执行客户端接下来发送的命令。然后,客户端再向这个实例发送 GET 命令,以读取数据。

ASK 命令表示两层含义:第一,表明 Slot 数据还在迁移中;第二,ASK 命令把客户端所请求数据的最新实例地址返回给客户端,此时,客户端需要给实例 3 发送 ASKING 命令,然后再发送操作命令。

和 MOVED 命令不同,ASK 命令并不会更新客户端缓存的哈希槽分配信息。ASK 命令的作用只是让客户端能给新实例发送一次请求,而不像 MOVED 命令那样,会更改本地缓存,让后续所有命令都发往新实例。

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

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

相关文章

stm32f407VET6 系统学习 day08 SPI 的使用 和 flash 的讲解

1.什么是SPI控制器 SPI 是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接 口。是Motorola首先在其MC68HCXX系列处理器上定义的。 SPI,是一种高速的,全双工,同步的通信总线(因为带有SCL同步时钟&am…

2023年PMP备考攻略全指南看这里就够了!

PMP考试是一年四次的,一般在3月、6月、9月、12月份考试(考试时间一般为周六)。 所以如果有想法一定要在这个几个时间点之间备考准备哦。 二,报名流程 一般都是中英文两个官网都报名 1.英文报名 需要在PMI官方网站提交填写申请…

【Linux】软件包管理器yum和编辑器vim

文章目录一、Linux软件包管理器yum1. 什么是软件包2. 查看软件包/安装软件/卸载软件3. 关于rzsz二、Linux编辑器vim1. vim的基本概念2. vim的基本操作3. vim命令模式指令集4. vim底行模式指令集5. vim的配置三、普通用户无法使用sudo的问题一、Linux软件包管理器yum 1. 什么是…

学习周报-20230106

文章目录一 Linux常用系统日志一 常用系统日志二 系统日志优先级三 其他日志文件二 DNS域名解析一 定义二 配置文件三 DNS解析流程四 总结三 vim编辑器的三种模式四 Linux虚拟机克隆后网卡名从eth0变成eth1一 系统环境二 问题发现三 解决过程五 在rhel6系统部署iscsi远程存储一…

项目资源规划前需要了解的基础知识

项目资源规划是优化各项目资源使用的一个可靠方法。你根据团队成员的技能、能力和对项目的适应性将任务分配给他们,以实现最大效率。 换句话说,规划项目资源的过程可以帮助你回答项目经理可能提出的两个最重要的问题。 ● 如何确保在团队不过度劳累的情…

零基础学MySQL(一)-- 启动与创建数据库及对数据库的备份与恢复

🧧启动与创建数据库及对数据库的备份与恢复🥗一、启动与连接数据库1️⃣启动数据库2️⃣连接数据库🥫二、数据库的基本介绍1️⃣数据库的三层结构2️⃣数据在数据库中的存储方式3️⃣SQL 语句分类🍱三、对数据库的操作1️⃣创建数…

Python 读取千万级数据自动写入 MySQL 数据库

Python 读取数据自动写入 MySQL 数据库,这个需求在工作中是非常普遍的,主要涉及到 python 操作数据库,读写更新等,数据库可能是 mongodb、 es,他们的处理思路都是相似的,只需要将操作数据库的语法更换即可。…

react+openlayers实现点要素的创建及其点上overlay叠加层的实现

前言 网上关于react或者vue3与openlayers结合的案例非常少,今天由于工作中用到,特记录下笔记,后面将持续更新react和vue3与ol的结合案例(新手勿喷)。 1.地图上要素(点线面)的创建 以点要素为…

C进阶:数据在内存中的存储

深度剖析数据在内存中的存储C进阶:数据在内存中的存储深度剖析数据在内存中的存储数据类型介绍类型的基本归类整型家族浮点数家族:构造类型:指针类型:空类型:整型在内存中的存储原码、反码、补码原码反码补码的相互转换整型数据的…

基于WebRtc的web播放大华海康rtsp视频流(延迟一秒以内)

基于WebRtc的web播放大华海康rtsp视频流(延迟一秒以内)WebRtc下载WebRtc运行Rtc测试Rtc使用html播放需要在vue上播放的可以看下一篇文章WebRtc你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可…

谷粒学院——第十七章、课程微信支付

需求分析 需要实现的功能 需要提供的接口 后端实现 创建数据库表 创建 service_order 模块 引入依赖 <dependencies><dependency><groupId>com.github.wxpay</groupId><artifactId>wxpay-sdk</artifactId><version>0.0.3</ve…

elasticsearch 7.9.3知识归纳整理(六)之 kibana图形化操作es指南

kibana图形化操作es指南 一、创建用户&#xff0c;角色和权限指引 1.创建角色 1.1 在kibana首页点击Manage and Administer the Elastic Stack下的securitys settings 1.2 点击左侧Security 下的roles 1.3 点击右上角的create role 1.4 输入角色名字 完成后点击下面的create…

华为手表开发:WATCH 3 Pro(3)创建项目以及运行完整流程

华为手表开发&#xff1a;WATCH 3 Pro&#xff08;3&#xff09;创建项目以及运行完整流程初环境与设备创建项目创建项目入口配置项目运行项目报错需要在 Appgallery Connect , 创建项目&#xff0c;然后在项目中登录账号就可以了登录后的最终结果再次点击运行&#xff0c;我们…

通俗易懂的java设计模式(5)-抽象工厂模式模式

什么是抽象工厂模式&#xff1f; 抽象工厂模式&#xff0c;可以说是工厂模式的升级版 关于工厂模式&#xff1a;通俗易懂的工厂模式 抽象工厂&#xff1a;围绕着一个超级工厂去创建其他的工厂&#xff0c;这个超级工厂也被称为工厂的工厂&#xff0c;这个设计模式属于创建型…

【小5聊】回看2022,展望2023,分享我的年度总结和感想,在一个行业十年,坚持下去你就是这个行业的专家

2022年&#xff0c;已成为过去&#xff01;2023年&#xff0c;TA已悄然而至&#xff01; 非常感谢CSDN提供的技术平台&#xff0c;很早就关注了C站&#xff0c;11年的时候&#xff0c;当时用的是163邮箱注册的账号&#xff0c;也是主要用来找资料看文章。 18年的时候&#xff0…

八、k8s 数据存储

文章目录1 数据存储介绍1.1 基本存储1.1.1 EmptyDir1.1.2 HostPath1.1.3 NFS2 高级存储2.1 PV2.2 PVC2.3 生命周期3 配置存储3.1 ConfigMap3.2 Secret1 数据存储介绍 在前面已经提到&#xff0c;容器的生命周期可能很短&#xff0c;会被频繁地创建和销毁。那么容器在销毁时&am…

基础数据结构——队列和栈

目录 一、队列 1、循环队列 2、Python队列的三种实现方式 3、例题——队列操作 4、优先队列 &#xff08;1&#xff09;基本操作 &#xff08;2&#xff09;例题&#xff08;lanqiaoOJ题号1228&#xff09; 二、栈 1、用 list 实现栈 2、用 collections.deque 实现栈…

【知识图谱导论-浙大】第一章:知识图谱概论

背景 2022年&#xff0c;随着在自然语言处理方向的深入&#xff0c;我逐渐开始对知识图谱在问答、搜索、推荐等领域的应用产生浓厚的兴趣。自己也通过书籍、博文、论文等对知识图谱有所了解&#xff0c;也通过中文开放知识图谱对中文知识图谱在各领域的发展有了深刻的认识。知…

将非负整数num转换为对应的英文表达(C++实现)—— 力扣第273号题的加强。

【问题描述】 将非负整数num转换为对应的英文表达式。 (样例1) 输入&#xff1a;25 输出&#xff1a;Twenty Five (样例2) 输入&#xff1a;12,315 输出&#xff1a;Twelve Thousand Three Hundred (and) Fifteen 备注&#xff1a;and可省略 另备注&#xff1a;偶然发…

(八)devops持续集成开发——jenkins流水线发布一个docker版的后端maven项目

前言 本节内容我们使用jenkins的流水化工具发布一个后端docker项目&#xff0c;实现后端项目的容器化部署。在开始本节内容之前&#xff0c;我们需要在生产环境安装好docker环境并且能够联网下载镜像。通过jenkins的流水化工具&#xff0c;实现代码拉取&#xff0c;maven打包编…