系列十四、Redis的集群(一)

news2024/10/5 17:20:18

一、是什么

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

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

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

相关文章

AD20基本原理图的设计

1、利用先前学习的知识,创建文件名为“51单片机最小系统”的PCB工程文件,并将文件保存在相应的目录下。 2、在工程文件下创建原理图文件,命名为“51单片机最小系统”。 3、点击右边“Properties[ˈprɒpətiz](属性)”…

数据库系统>分布式数据库

1.分布式数据库体系结构 分布式数据库体系结构如下图所示: 全局外模式:是对分布式数据库的最高层的抽象。 全局概念模式:是分布式数据库的整体抽象,包含了系统中全部数据的特性和逻辑结构,描述分布数据库全局数据的逻…

九月九日重阳节September 9th, Double Ninth Festival

每年农历九月初九,是中国传统节日“重阳节”。二九相重,称为“重九”,民间在该日有登高的风俗,所以重阳节又称“登高节”。On the ninth day of the ninth lunar month, comes the traditional Chinese holiday: the Double Ninth…

SystemVerilog Assertions应用指南 Chapter 1.21重复运算符

1.21重复运算符 如果信号“stat”在任何给定的时钟上升沿跳变为高,接着从下一个时钟周期起,信号“a”保持三个连续时钟周期为高,然后下一个时钟周期,信号“stop”为高,像上述描述的序列可以使用下面的SVA代码来检验。 sequence ss ;(posedge clk) $rose(start) |-&…

Transformer知识点

Transformer知识点 1.输入部分1.1文本嵌入层1.2位置编码器 2.编码部分2.1掩码张量2.2注意力机制2.3多头注意力机制2.4前馈全连接层2.5规范化层2.6子层连接结构2.7编码器层2.8编码器 3.解码部分1.编码器层2.编码器 4.输出部分 结构如下图,包括四部分:输⼊…

COSCon'23 开源社文创丨 给开源人一点“color see see”

成都城市限定 “小O在成都”行李箱贴纸 成都限定行李箱贴纸把小O和特色元素相融合 当小O遇到成都 在云端漫步的蓝色小章鱼 掉落到这座热情似火的城市, 结识了大熊猫朋友 学会了四川麻将 吃到了红油串串... 快带着小O来一场自由的旅游吧! “你也要尝尝竹子…

UE4 材质实操记录

TexCoord的R通道是从左到右的递增量,G通道是从上到下的递增量,R通道减去0.5,那么左边就是【-0.5~0】区间,所以左边为全黑,Abs取绝对值,就达到一个两边向中间的一个递减的效果,G通道同理&#xf…

山西电力市场日前价格预测【2023-10-21】

日前价格预测 预测说明: 如上图所示,预测明日(2023-10-21)山西电力市场全天平均日前电价为385.30元/MWh。其中,最高日前电价为723.78元/MWh,预计出现在18: 15。最低日前电价为208.67元/MWh,预计…

001.C语言基础学习

之前只学过python,在这里我的本意是想学C,但是没有C语言的基础,听起来比较吃力,所以就快速过一下C语言。这是一个零基础入门的笔记,高手可以绕过。 0.Visual studio2022的使用 创建第一个C语言项目和源文件 https://…

【PACS系统源码】与医院HIS系统双向数据交换,实现医学影像集成与影像后处理功能

​医院医学影像PACS系统源码,集成三维影像后处理功能,包括三维多平面重建、三维容积重建、三维表面重建、三维虚拟内窥镜、最大/小密度投影、心脏动脉钙化分析等功能。系统功能强大,代码完整。 PACS系统与医院HIS实现双向数据交换&#xff0c…

【diffusion model】扩散模型入门

写在最前,参加DataWhale 10月组队学习。 参考资料: HuggingFace 开源diffusion-models-class 1.扩散模型介绍 2.调用模型生成一张赛博风格的猫咪图片 2.1 安装依赖包 %pip install -qq -U diffusers datasets transformers accelerate ftfy pyarrow9…

Vercel 如何使用 Amazon EventBridge 调度器在2个月内发布 Cron 作业

Vercel 使用 Amazon EventBridge 调度器实施 Cron 作业,使他们的客户能够大规模创建、管理和运行计划任务。该功能很快就获得了广泛采用,发布后仅几个月,每周 cron 调用次数就超过 700 万次。本文将介绍他们是如何取得这一成就的,…

d3dx9_43.dll丢失有什么办法可以解决,解决d3dx9_43.dll丢失

通常d3dx9_43.dll丢失都是在运行游戏时汤出的d3dx9_43.dll找不到的错误窗口,因为d3dx9_43.dll文件更多是在使用游戏时会被调用的dll文件,d3dx9_43.dll是属于DirectX9的一个组件,DirectX9是游戏系统中的一个重要程序,所以当d3dx9_4…

MySQL数据库下载与安装使用

文章目录 MySQL数据库下面是各个版本完整的生命周期。下载MySQL安装包安装和使用MySQL一些基础MySQL使用命令 MySQL数据库 这里我选择的是免安装绿色解压版本 现在各位开发者使用的MySQL,大部分版本都是 5.7,根据官方说明,MySQL 5.7 将于 202…

零售创新:社交媒体如何改变跨境电商游戏规则?

在当今数字化的时代,社交媒体已经成为了我们日常生活中不可或缺的一部分。Facebook、Instagram、Twitter、WeChat等平台不仅让我们与朋友家人保持联系,还成为了一个新的商业战场。特别是在跨境电商领域,社交媒体的崛起正在彻底改变游戏规则。…

团购页面.

<!DOCTYPE html> <html><head><title>团购</title><meta http-equiv"content-type" content"text/html; charsetutf-8"/><meta name"apple-mobile-web-app-capable" content"yes"/><lin…

yxy销售网站后台管理系统

springbootmybatisthymeleaf 第一个练习的项目就是小商品零售平台后台管理系统&#xff0c;但是当时由于业务不熟练&#xff0c;需求分析先不做好&#xff0c;导致在开发的过程中出现了很多问题。 这次首先把需求确定&#xff0c;详细的做好前期准备工作&#xff0c;再来进行…

acme.sh: 未找到命令解决办法丨acme命令安装ssl证书

在Freessl申请的ssl证书现在都是需要acme命令了&#xff0c;服务器没有自带所以会出现这个报错&#xff0c;首先 1、安装并下载&#xff1a; curl https://get.acme.sh | sh -s emailmyexample.com2、进入到安装目录,创建指令别名&#xff1a; cd /root/.acme.sh/ alias acm…

一些经典的神经网络(第19天)

1. 经典神经网络&#xff08;LeNet&#xff09; LeNet是早期成功的神经网络&#xff1b; 先使用卷积层来学习图片空间信息 然后使用全连接层来转到到类别空间 【通过在卷积层后加入激活函数&#xff0c;可以引入非线性、增加模型的表达能力、增强稀疏性和解决梯度消失等问题…

防水款无源NFC卡片

产品参数&#xff1a; PN29_T 产品参数 产品型号 PN29_T 尺寸(mm) 85.8*41*2.9mm 显示技术 电子墨水屏 显示区域(mm) 29(H) * 66.9(V) 分辨率(像素) 296*128 像素尺寸(mm) 0.227*0.226 显示颜色 黑/白 视觉角度 180 工作温度 0-50℃ 电池 无需电池 工作…