Redis进阶(五):集群

news2024/9/19 10:37:10

1.概念

集群,从广义来讲:只要是多个机器,构成了分布式系统,都可以称为一个集群

狭义的集群:redis提供的集群模式,这个集群模式之下,主要是要解决存储空间不足的问题(拓展存储空间)

哨兵模式提高了系统的可用性,哨兵模式中,本质上还是redis主从节点存储数据,其中就要求一个主节点/从节点,就得存储整个数据的”全集“

引入多台机器,每台机器分担一部分:存储一部分数据,每台存储数据的机器还需要搭配多个从节点

2.分片

上述红框标注的就是分片~ 三种主流的分片方式

2.1 hash求余

借助hash函数,把一个key映射到整数,再针对数组长度求余,就可以得到一个数组下标

比如有三个分片:0,1,2

此时可以针对要插入的数据的key(redis都是键值对结构的数据)计算hash值(比如md5:将string经过数据计算得到一个整数),再把这个hash值余上分片的个数,就得到了一个下标,此时就可以把这个数据放到该下标对应的分片中了。

hash(key) % length(分片的个数,上述就是3)


但如果分片添加了,也就是扩容发生的时候,分片结果就会发生变化(需要重新进行分配)。

2.2 一致性hash算法

上述方式,如果数据很大,且发生数据搬运,开销极大,只能在非生产环境下,通过替换的方式进行扩容,依赖机器更多了,成本也高,因此一致性hash算法解决上述问题

在hash求余这种操作,当前key属于哪个分片是交替的:例如102 -》0 ,103-》1,104-》2 ...0,1,2.....,在一致性hash下,把交替出现,改成连续出现。

具体分为几步:

把0->2^32-1这个数据空间,映射到⼀个圆环上.数据按照顺时针⽅向增⻓.

假设有三个分区,在圆环上进行划分

假定一个key,计算得到hash值,该key值划分就是顺时针往下找,找到的第一个分区就是key所属分片

这就相当于,N个分⽚的位置,把整个圆环分成了N个管辖区间.Key的hash值落在某个区间内,就对应区间管理.

扩容场景

此时,只需要把0号分⽚上的部分数据,搬运给3号分⽚即可.1号分⽚和2号分⽚管理的区间都是不变的.
优点:⼤⼤降低了扩容时数据搬运的规模,提⾼了扩容操作的效率.

缺点:数据分配不均匀(有的多有的少,数据倾斜).

2.3 hash槽分区算法(redis使用)

就比如说:

此处,每个分区都会使用位图的数据结构表示当前有多少槽位号,16384个bit位,用每一个0/1来区分自己这个分片当前是否持有该槽位号

总结一下:key值先通过hash算法计算一下得到一个hash值,hash值再取模16384得到槽位,根据槽位数再划分到不同的分片。

分片增加场景:

注意事项

Redis集群是最多有16384个分⽚吗?

key是先映射到槽位,再映射到分片的。

如果每个分片包含的槽位比较多,如果槽位个数相当,就可以认为是包含的key数量相当。

如果每个分片包含的槽位比较少,槽位个数并不能直观的反应到key的数目。

因此造成:有的槽位有key,有的槽位没有key

如果每个分片只有一个槽位:很难保证数据在各个分片的均衡性 

 

为什么是16384

1.节点之间通过心跳包进行通信,心跳包包含每个节点持有什么slots(槽位),槽位使用位图这样的数据结构表示的,16384 (16k)是2kb字节的空间,redis留出2kb的空间来保存槽位,如果slots更多了,就需要更大的空间去保存槽位。因为是周期性通信*(非常频繁,占用带宽)

 2.另⼀⽅⾯,Redis集群⼀般不建议超过1000个分⽚.所以16k对于最⼤1000个分⽚来说是⾜够⽤
的,同时也会使对应的槽位配置位图体积不⾄于很⼤.

3.集群搭建

需求:

3.1 实现

在sh文件添加:

实现批量创建redis配置文件

执行脚本: 

sh xxx.sh

创建redis容器:

在yml文件中进行编辑:

 其他redis节点配置:

启动容器:

docker -compose up -d

几个redis节点构建成集群:

3.2 使用集群

 使用集群存储数据:

-c:选型添加之后,redis客户端就会根据当前key实际算出来的槽位号,自动找到匹配的分片主机

 

4.故障处理

如果某个节点挂了,处理分几个情况

从节点挂了,挂就挂了不管,但如果是主节点挂了 ?

如果主节点挂了,就会自动把该主节点旗下的某个从节点选拨为主节点

4.1具体流程

1、先判断故障:

1.节点A给节点B发送ping包,B节点返回pong包,二个包除了message type属性不同之外,其他部分是一样的。

2.每个节点每秒钟都会给一些随机的节点发送ping包

3.A节点向B节点发送ping,不能正常返回pong,A就会尝试重置和B的TCP连接,如果还是失败,A就会把B标记为PEAIL(主观下线)

4.A判定BPEAIL之后,A会通过内置的Gossip协议,和其他节点进行沟通。让其他节点确认B状态

5.A发现其他节点也是认为B节点PFAIL,超过一半,那么A标记B为FAIL(客观下线),并且将消息同步给其他节点。

2、故障迁移

如果挂了的B节点是从节点无所谓

如果是主节点:需要从B节点的从节点挑选一个作为主节点

1.从节点首先需要判定是否有资格,从节点与主节点之间太久没同步了,此时差异太大,(超过了一定的阈值),就会失去资格

2.具有资格的节点会先进行休眠:休眠时间的大小因素主要为排名大小(offset值越大,排名越小)

3.有资格从节点的休眠时间到了,该节点就会给其他主节点进行拉票操作

4.主节点收到拉票请求就会投给那个参加竞选的从节点,当票数超过主节点数目的一半,该晋升成功的从节点自己负责 slaveof no one,并且让同为从节点的另一个从节点归属自己

5.同时,该节点晋升为主节点的消息也要发送给其他节点,以供其他节点更新自己的集群结构

集群宕机

出现以下几种情况会发生集群宕机:

1.某个分片,所有的主节点和从节点全挂了 :分片存储了部分的数据,如果该分片全挂了,就会宕机

2.主节点挂了,但该主节点没有从节点:和上述一个情况

3.超过半数的主节点挂了

5.集群扩容

场景:101-109 9个主机,构成了3主6从结构的集群,当前110和111也想加入到集群中:以110为主节点,111为从节点 == 分片从三个到四个

1.新的主节点添加到集群中

左ip为被新增的节点,右ip为集群上任意的一个节点:表明节点增添到哪个集群中

2.重新分配slots

然后需要输入分配多少槽位(通常16384 / 分片数)

紧接着,会询问让哪个节点来接收,粘贴110主机id即可

 

3.把从节点添加到集群中

5.1 问题

如果搬运key/slots时,此时的客户端能否访问咱们redis集群吗?

搬运key,大部分的key不是用来搬运的,针对这些未搬运的key:此时是可以访问的,针对这些正在搬运中的key,是有可能出现不能访问的情况

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

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

相关文章

分歧时间估计与被子植物的年代-文献精读43

Ad fontes: divergence-time estimation and the age of angiosperms 回归本源:分歧时间估计与被子植物的年代 摘要 准确的分歧时间对于解释和理解谱系演化的背景至关重要。在过去的几十年里,有关冠被子植物推测的分子年龄(通常估计为晚侏罗…

Python入门全解析丨Part3-Python的循环语句

(一)while循环的基础应用 一.while的条件 >>>需要是布尔类型&#xff0c;True表示继续循环&#xff0c;False表示循环结束 >>>需要设置循环终止的条件 >>>需要空格缩进 二.while循环使用举例 sum0; i1; while i <100:sumi;i1; print(f&quo…

华阳珠珍娘娘宝圣祖庙文化董事会隆重举办

中国广东省汕头市华阳珠珍宝圣祖庙文化董事会隆重举办海内外两岸护婴女神妈祖回娘家启动仪式&#xff01;风暖日丽的初春天&#xff0c;纷纷鼓乐赛华阳。护婴妙化在此地&#xff0c;莲岛故里起瓣香。这首诗是清代华阳乡人游殷享&#xff0c;时任湖北郧西县知县赞叹赛护婴&#…

VLAN 基本配置

一. 实验拓扑 二. 实验简介 交换机的VLAN端口可以分为Access、Trunk和Hybrid3种类型。Access 端口是交换机上用来直接连接用户终端的端口&#xff0c;它只允许属于该端口的缺省VLAN的帧通过。Access端口发往用户终端的帧一定不带VLAN标签。Trunk端口是交换机上用来连接其他交…

【C语言】十六进制、二进制、字节、位

【C语言】十六进制、二进制、字节、位 文章目录 [TOC](文章目录) 前言一、十六进制、二进制、字节、位二、变量、指针、指针变量三、参考文献总结 前言 使用工具&#xff1a; 1.控制器&#xff1a;STM32F103C8T6 2.仿真器&#xff1a;STLINK 提示&#xff1a;以下是本篇文章正…

修改Apollo的依赖版本包,并制作arm版本的镜像

由于一些安全因素&#xff0c;Apollo组件扫描出一些依赖插件存在安全漏洞&#xff0c;因此要修改部分依赖组件的版本&#xff0c;重新制作镜像&#xff0c;我们来看一下如何实现 1. 修改源码 1.1 拉取源码&#xff0c;并切换到我们需要的分支 # 拉取源码项目 git clone gitgi…

TeamTalk消息服务器(群组相关)

具体的流程如下介绍&#xff0c;后续需要着重研究数据库相关表的结构设计。 群组信令和协议设计 enum GroupCmdID {CID_GROUP_NORMAL_LIST_REQUEST 1025,CID_GROUP_NORMAL_LIST_RESPONSE 1026,CID_GROUP_INFO_REQUEST 1027,CID_GROUP_INFO_RESPONSE 1028,// ...... 暂时省…

pm2 + linux + nginx

pm2 pm2是一个用于管理node项目的工具 前言 有如下两个文件 index.js const express require("express"); const app express(); const port 9999;app.get("/index", (req, res) > {res.json({code:200,msg:"songzx001"}) });app.lis…

openGL笔记之序章

本系列来自 youtube 主播cherno的 openGL系列, b站双语版链接 https://www.bilibili.com/video/BV1Ni4y1o7Au?p1&vd_source0be7021510d651441db0edd576304997 openGL 是一个接口规范&#xff0c;定义了一系列接口&#xff0c;我们可以通过使用这些接口来一定程度的操作GP…

[Meachines] [Easy] Safe BOF+ROP链+.data节区注入BOF+函数跳转BOF+KeePass密码管理器密码破译

信息收集 IP AddressOpening Ports10.10.10.147TCP:22&#xff0c;80&#xff0c;1337 $ nmap -p- 10.10.10.147 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.4p1 Debian 10deb9u6 (protocol 2.0) | ssh-hostkey: | 2048 …

基于django的在线音乐网站设计/基于python的音乐播放系统

Django在线音乐网站设计 摘要&#xff1a;计算机网络如果结合使用信息管理系统&#xff0c;能够提高管理员管理的效率&#xff0c;改善服务质量。优秀的在线音乐网站设计能够更有效管理音乐资讯规范&#xff0c;帮助管理者更加有效管理音乐网站&#xff0c;可以帮助提高克服人工…

【深度剖析】《黑神话:悟空》员工薪资大曝光,你慕了吗?

《黑神话&#xff1a;悟空》引爆市场&#xff0c;员工薪资却成热议焦点&#xff01; 自8月20日解锁以来&#xff0c;《黑神话&#xff1a;悟空》以其国产3A游戏的高品质迅速占领市场&#xff0c;引发全球玩家的热烈讨论。深圳市游科互动科技有限公司开发的这款游戏&#xff0c…

C++20 是 C++ 语言的一次重大更新

C20 是 C 语言的一次重大更新&#xff0c;它引入了许多新特性&#xff0c;旨在提高开发者的生产力和代码的现代化。以下是 C20 的一些关键特性的总结&#xff1a; 模块&#xff08;Modules&#xff09;&#xff1a;C20 引入了模块&#xff0c;这是一种新的编译单元&#xff0c;…

CSS解析:定位和层叠上下文

许多开发人员对定位的理解很粗略&#xff0c;如果不完全了解定位&#xff0c;就很容易给自己挖坑。有时候可能会把错误的元素放在其他元素前面&#xff0c;要解决这个问题却没有那么简单。 一般的布局方法是用各种操作来控制文档流的行为。定位则不同&#xff1a;它将元素彻底…

mysql 不同版本安装不同端口

安装版本为Mysql8.0.11 先解压&#xff0c;解压后&#xff0c;包下创建my.ini文件内容如下&#xff1a; 注意&#xff1a;端口不能给别的mysql一样 [mysqld]# 设置3306端口port3307 # 自定义设置mysql的安装目录&#xff0c;即解压mysql压缩包的目录basedirD:\\rj\\mysql8.0.…

如何将 HEIC 转换为 JPG/PNG

“我刚刚将 iPhone 15 升级到 iOS 18&#xff0c;但新 iPhone 的照片现在变为 HEIC。什么是 HEIC 格式&#xff1f;我可以在 Windows 上使用 HEIC 照片吗&#xff1f;有人知道 HEIC 的技巧吗&#xff1f;谢谢&#xff01;” 当你换了一部新的iPhone时&#xff0c;你会发现你的图…

TCP协议 配合 Wireshark 分析数据

在TCP连接中&#xff0c;无论是客户端还是服务端&#xff0c;都有可能成为发送端或接收端&#xff0c;这是因为TCP是一个全双工协议&#xff0c;允许数据在同一连接中双向流动 客户端&#xff08;Client&#xff09;&#xff1a;通常是指主动发起连接请求的一方。例如&#xf…

商家推广怎么利用C#发送视频短信

视频短信&#xff0c;这一融合了视频、音频与文本的创新通信方式&#xff0c;不仅革新了传统短信的单一形式&#xff0c;更以其独特的魅力带领着移动通信的新风尚。它以移动视频格式为载体&#xff0c;实现了信息传输的多元化&#xff0c;为用户带来不一样的通信体验。 支持免费…

windows安全中心永久卸载工具分享

使用方法 博客&#xff1a;h0ck1r丶羽~从零到一 卸载工具下载链接&#xff1a; 夸克网盘分享 一路回车&#xff0c;选项Y即可 耐心等待几秒种&#xff0c;自动重启 此时打开windows安全中心&#xff0c;已经完全不能使用了&#xff0c;响应的杀毒功能也关了 往期推荐 【渗透测…

简易STL实现 | Deque的实现

一种 在内存中存储元素的数据结构&#xff0c;它支持 在两端添加和删除元素&#xff08;使用循环数组实现&#xff09; 1、deque的特性&#xff08;分段deque实现&#xff09; 1、双端操作&#xff1a; deque支持在前端和后端执行快速的插入和删除操作 2、随机访问&#xff…