系列十四、Redis的集群(一)
一、是什么
1.1、概述
由于数据量过大,单个master-slave模式难以承担,当出现master节点故障的一瞬间,哨兵重新选举新的master节点之前,这一小段时间将会导致Redis服务不可用,因此需要对多个master-slave主从复制集进行集群,形成水平扩展,每个master-slave主从复制只负责存储整个数据集的一部分,这就是Redis的集群,其作用是提供在多个Redis节点之间共享数据的程序集。

1.2、演化

1.3、一句话
Redis集群是一个提供在多个Redis节点间共享数据的程序集,Redis集群可以支持多个master。
二、集群架构图

三、功能
(1)Redis集群支持多个master,每个master又可以挂载多个slave;
- 读写分离
- 支持数据的高可用
- 支持海量数据的读写存储操作
(2)由于Cluster自带Sentinel的故障转移机制,内置了高可用的支持,无需再去使用哨兵功能;
(3)客户端与Redis的节点连接,不再需要连接集群中的所有节点,只需要任意连接集群中的一个可用节点即可;
(4)槽位slot负责分配到各个物理服务节点,由对应的集群来负责维护节点、插槽和数据之间的关系;
四、集群算法&分片&槽位slot
4.1、槽位slot
Redis集群没有使用一致性hash,而是引入了哈希槽的概念。Redis集群中有16384个哈希槽,每个Key通过CRC16算法校验后对16384取模,进而决定要存储的数据放在哪个槽位中,集群中的每一个节点负责一部分hash槽,例如:当前集群有3个节点,那么:

4.2、CRC16算法的特点
- 对集群模式下的所有key进行CRC16计算,计算的结果始终在0-16383之间;
- 对客户端的key进行CRC16计算时,同一个key经过多次CRC16计算的结果始终一致;
- 对客户端的不同key进行CRC16算法,计算的结果会出现不同的key计算结果一致;
4.3、分片
4.3.1、概述
使用Redis集群时,我们会将存储的数据分散到多台Redis机器上,这即被称为分片,换言之,集群中的每个Redis实例都被认为是整个数据集的一个分片。
4.3.2、如何找到给定key的分片
为了找到给定key的分片,我们对key进行CRC16(key)算法处理,并通过对总分片数量(16384)取模,然后使用确定性哈希函数,这意味着给定的key将多次始终映射到同一个分片,我们据此可以推断将来读取key所在的分片。
4.4、分片 + 槽位的优点
方便扩容缩容和数据分片查找。这种结构很容易的添加或者删除节点,比如如果我想添加一个节点D,我需要从节点A、B、C上得到部分槽位给到D,如果我想移除节点A,那么需要先将A中的槽位移到B和C上,然后将没有任何槽位的A节点从集群中移除即可,由于从一个节点将哈希槽移动到另外一个节点的过程中并不会停止服务,所以无论添加节点还是删除节点或者改变某个节点的哈希槽数量都不会造成集群不可用的状态。
4.5、槽位映射业界解决方案@哈希取余分区
4.5.1、概述
2亿条数据就是2亿个k:v,我们单机不行,必须要分布式多机,假设有3台机器构成一个集群,用户每次读写操作都是根据公式:hash(key)%N(机器数量),计算出哈希值,用来决定将数据映射到哪一个节点上。

4.5.2、优点
简单粗暴,直接有效。只需要预估好数据,规划好节点,例如:3台、8台、10台,就能保证一段时间的数据支撑。使用hash算法让固定的一部分请求落到同一台机器上,这样每台机器固定处理一部分请求(并维护这些请求信息),起到负载均衡+分而治之的作用。
4.5.3、缺点
原来规划好的节点,进行扩容或者缩容就比较麻烦了,不管扩容还是缩容,每次数据变动导致节点有变动,映射关系就需要重新进行计算,在服务器的数量固定不变时没有问题,如果需要弹性扩容或者故障停机的情况下,原来的取模公式就会发生变化:hash(key)/3 ===> hash(key)/?,此时地址经过取余运算的结果将会发生很大变化,根据公式获取的服务器也会变得不可控。某个Redis机器宕机了,由于机器的数量发生变化,会导致hash取余的全部数据重新洗牌。
4.6、槽位映射业界解决方案@一致性哈希算法分区
4.6.1、概述
一致性哈希算法是1997年由麻省理工学院提出,设计目的是为了解决分布式缓存数据变动和映射问题,当某个机器宕机了,分母数量改变了,自然余数不是预期结果了。
4.6.2、作用
当服务器个数发生变化时,尽量减少影响客户端到服务器的映射关系。
4.6.3、三大步骤
-
算法构建一致性哈希环


-
服务器IP节点映射

-
key落到服务器的落键规则

4.6.4、优点
容错性

扩展性
4.6.5、缺点

4.6.6、小总结
为了在节点数目发生改变时尽可能少的迁移数据,将所有的存储节点排列在首尾相接的Hash环上,每个key在计算Hash后会顺时针找到临近的存储节点进行存放。而当有节点加入或退出时仅影响该节点在Hash环上顺时针相邻的后续节点。
优点:加入和删除节点只影响哈希环中顺时针方向的相邻的节点,对其他节点无影响。
缺点:数据的分布和节点的位置有关,因为这些节点不是均匀的分布在哈希环上的,所以数据在进行存储时达不到均匀分布的效果。
4.7、槽位映射业界解决方案@哈希槽分区
4.7.1、为什么会出现
一致性哈希算法存在数据倾斜的问题。哈希槽实质上就是一个数组[0-2^14-1],形成hash slot空间。
4.7.2、解决了什么问题
解决均匀分配的问题,在数据和节点之间又增加了一层,被增加的这层称为哈希槽(slot),用于管理数据和节点之间的关系,现在就相当于节点上放的是槽,槽里边放的是数据。

槽解决的是粒度的问题,相当于把粒度变大了,这样便于数据的移动。哈希解决的是映射的问题,使用key的哈希值来计算所在槽,便于数据分配。
4.7.3、有多少个哈希槽
一个集群只能有16384个槽,区间为[0-2^14-1],这些槽会分配给集群中的所有主节点,分配策略没有要求。集群会记录节点和槽的对应关系,解决了节点和槽的关系后,接下来就需要对key求hash值,然后对16384取模,余数是多少,key就落到对应的槽里,HSAH_SLOT = CRC16(key)%16384。以槽位单位移动数据,因为槽的数目是固定的,处理起来比较容易,这样数据移动的问题就解决了。
4.7.4、哈希槽的计算

五、经典面试题
5.1、为什么Redis集群的最大槽数是16384个?
Redis集群并没有使用一致性hash,而是引入了哈希槽的概念,Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放在哪个槽里面,集群的每个节点负责维护一部分hash槽,所有的节点维护的哈希槽共同组成一个完整的哈希槽。但是为什么哈希槽的数量是16384(2^14)个,而不是其他的值呢?CRC算法产生的哈希值有16bit,该算法可以产生2^16即65536个值,换句话说值是分布在0-65535之间,有更大的65536不用,为什么只用16384就够?作者在取模的时候,为什么不%65536,而选择%16384?HASH_SLOT = CRC16(key)%65536为什么没启用?
https://github.com/redis/redis/issues/2576

(1)如果槽位为65536,发送的心跳信息的消息头达8KB,发送的心跳包过于庞大
在消息头中最占用空间的是myslots[CLUSTER_SLOTS/8],当槽位为65536时,这块的大小为:65536/8/1024=8KB
当槽位为16384时,这块的大小为:16384/8/1024=2KB
由于Redis节点每秒钟需要发送一定数量的PING消息作为心跳包,如果槽位为65536,这个PING消息的消息头太大了,浪费带宽。
(2)Redis集群的主节点数量基本不可能超过1000个
集群节点越多,心跳包的消息体内携带的数据越多,如果节点超过1000个,将会导致网络拥堵。因此Redis作者不建议Redis Cluster节点的数量不超过1000个,那么对于节点数量在1000以内的Redis Cluster集群,16384个槽位足够用了,没有必要扩展到65536个。
(3)槽位越小,节点少的情况下,压缩比高,容易传输
Redis主节点的配置信息中,它负责的哈希槽是通过一张bitmap的形式来保存的,在传输过程中会对bitmap进行压缩,但是如果bitmap的填充率slots/N很高的话(N表示节点数),bitmap的压缩率就很低,如果节点数很少,而哈希槽的数量很多的话,bitmap的压缩率就很高。

5.2、缺点
Redis集群不保证强一致性。这意味着在特定条件下,Redis集群可能会丢弃掉一些被系统收到的写入命令。
六、集群细节
- 所有的Redis节点彼此互联(ping-pong机制),内部使用二进制协议优化传输速度和带宽;
- 节点的fail是通过集群中超过半数的节点检测失效时才生效;
- 客户端与Redis节点直连,不需要中间Proxy层,客户端不需要连接集群中的所有节点,连接集群中任意一个可用的节点即可;
- redis-cluster把所有的物理节点映射到[0-16383]个slot上,cluster负责维护node《===》slot《===》value
相关文章:
系列十四、Redis的集群(一)
一、是什么 1.1、概述 由于数据量过大,单个master-slave模式难以承担,当出现master节点故障的一瞬间,哨兵重新选举新的master节点之前,这一小段时间将会导致Redis服务不可用,因此需要对多个master-slave主从复制集进行…...
红帽认证 | RHCE考试包括哪些内容?
Red Hat Certified Engineer(RHCE)考试是一项面向企业级系统管理员的认证考试,是认证Linux系统管理员技能的一种方式。 RHCE证书是Linux管理员领域中最受欢迎和最受认可的证书之一。 那RHCE考试都有哪些内容呢,一起来看看吧&…...
ASPICE标准快速掌握「3.1. 实践示例」
实践示例 本章内容是最重要的,建议慢下来跟着博主的思路一步一步前进 1. 示例背景说明 假设我们现在是一个Tier1的车窗控制软件开发商,我们给OEM提供软件解决方案 1.1. 本过程目标 根据客户、上级部门、安全团队与质量团队等提出的要求,本项目要求SYS.1过程达到ASPICE过…...
pytorch 训练可视化
pytorch 训练可视化 1.from torch.utils.tensorboard 1.from torch.utils.tensorboard from torch.utils.tensorboard import SummaryWriter在最新版本的pytorch中官方提供了tensorboard的api。以下是官方教程的链接 https://pytorch.org/tutorials/intermediate/tensorboard…...
webgis开发参考资料
一、ArcGIS相关 1、ArcGIS for Server 10.3.X 新型紧凑型缓存的解读和应用 http://zhihu.geoscene.cn/article/1038 2、arcgis server 紧促(bundle)格式缓存文件的读取 https://blog.csdn.net/abc553226713/article/details/8668839 3、ArcGIS 10.0紧…...
JSX 注意事项
学习目标: 掌握 JSX 实际开发过程中的一些注意事项 1. JSX 必须具有一个根节点,如果没有根节点可以使用<></>(幽灵节点)代替根节点将所有元素包裹起来 function App() {return (<><div className"App">1</div&…...
MQ常见的问题(kafka保证消息不丢失)
MQ常见的问题 1,mq如何避免消息堆积问题。 消息堆积:生产者的生产速率远远大于消费者的消费速率,使消息大批量的堆积在消息队列。 解决方案:1,提升消费者的消费速率(增加消费者集群) 2&…...
Unity编辑器扩展 --- AssetPostprocessor资源导入自动设置
unity导入资源的编辑器设置: 防止策划资源乱导入,资源导入需要的格式,统一资源管理 AssetPostprocessor资源导入管线 AssetPostprocessor用于在资源导入时自动做一些设置,比如当导入大量图片时,自动设置图片的类型,大小等。Ass…...
用Flask快速生成报表
一、前言 《用Python快速生成报表之一》 我们介绍了用html-table快速生成表格数据报表,今天我们再介绍一下用Python Flask 快速开发报表,使用的是最古老的套页面方式。 二、Flask快速生成报表 Python有N多Web框架,最强大最出名的是Django&…...
关于时序预测可解释性预测
本文做一些论文收集使用,先更新一两篇 论文 1 Learning Structured Components: Towards Modular and Interpretable Multivariate Time Series Forecasting 论文地址: https://browse.arxiv.org/pdf/2305.13036.pdf 论文代码:https://gi…...
泊车功能专题介绍 ———— AVP系统技术要求之场地规范定位要求
文章目录 停车场场地规范场地分级规范场地标识规范位置标识跨层标识十字路口标识丁字路口处标识闸口/收费口标识上下车点标识 定位功能要求环境要求定位精度要求场端定位要求道路自动驾驶定位要求泊车入位定位要求 车端定位要求道路自动驾驶定位要求泊车入位定位要求初始定位要…...
【STM32】时钟设置函数(寄存器版)
一、STM32时钟设置函数移植 1.时钟模块回顾 一个疑问 前面代码并没有设置时钟为什么可以直接使用。 2.时钟树 3.时钟树分析 1.内部晶振(HSI) 内部晶振不稳定,当我们上电后,会自动产生振动,自动产生时钟,…...
【DDD】贫血模型和充血模型
基于业务开发的项目大多是MVC架构的。成为Web项目的标准开发模式,但它却是违反面向对象编程风格的,是面向过程的。之后基于领域驱动设计开发模式被人提倡。 DDD(Domain-driven design)领域驱动设计是一种通过将实现连接到持续进化…...
【JS学习】字符串的substring方法
1. 介绍 substring 是JavaScript字符串对象的一个方法,用于从一个字符串中提取子字符串,并返回提取的部分。 可以使用 substring 方法来截取字符串的一部分,指定起始索引和结束索引(或只指定起始索引)。 这个方法不…...
vue部署,chunk文件有部分404,解决方案
排查方案: 1,检查项目配置,再vue.config.js里面配置 publicPath: "./",2,打包后检查报错文件是否存在打包目录 3,如果1,2都有 找到部署后404的文件,查看是否为空文件 style里面全注释也会打包文…...
《红蓝攻防对抗实战》六.常规反弹之利用NC在windows系统执行反弹shell
目录 一.利用NC工具在windows系统执行反弹shell 1. Windows正向连接shell 2.Windows反向连接shell 前文推荐: 《红蓝攻防对抗实战》一. 隧道穿透技术详解《红蓝攻防对抗实战》二.内网探测协议出网之TCP/UDP协议探测出网《红蓝攻防对抗实战》三.内网探测协议出网…...
python如何创建自己的对冲交易算法
在这篇文章中,我解释了如何创建一个人工智能来每天为我进行自动交易。 随着机器学习的现代进步和在线数据的轻松访问,参与量化交易变得前所未有的容易。为了让事情变得更好,AWS 等云工具可以轻松地将交易想法转化为真正的、功能齐全的交易机器…...
Ubuntu22.04安装,SSH无法连接
Ubuntu初始化安装后,系统默认不允许root通过ssh连接,因此需要完成三个设置 1.修改ssh配置文件 vim /etc/ssh/sshd_config 将PermitRootLogin注释打开,并将值改为yes 保存修改并退出 :wq 2.重启ssh服务 sudo service ssh restart 3.重新打…...
解决dirsearch扫描工具pkg_resources模块警告问题
一、pkg_resources模块问题 ┌──(kali㉿kali)-[~/桌面/XXX/dirsearch-master] └─$ python dirsearch.py -h /home/kali/XX/XXXX/dirsearch-master/dirsearch.py:23: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io…...
JAVA-编程基础-11-04-java IO 字符流
Lison <dreamlison163.com>, v1.0.0, 2023.05.07 JAVA-编程基础-11-04-java IO 字符流 文章目录 JAVA-编程基础-11-04-java IO 字符流字符流Reader 和 Writer字符输入流(Reader)**FileReader构造方法****FileReader读取字符数据** 字符输出流&am…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...

