Redis 集群模式

一、集群模式概述

Redis 中哨兵模式虽然提高了系统的可用性,但是真正存储数据的还是主节点和从节点,并且每个节点都存储了全量的数据,此时,如果数据量过大,接近或超出了 主节点 / 从节点机器的物理内存,就会出现严重的问题;

集群模式就是为了解决这个问题的,它通过引入更多的主节点和从节点,每一组主节点及其所对应的从节点存储了数据全集的一部分,多组这个的结构构成了一个更大的整体,这就是集群

如下图所示,假定引入了三组主从节点来存储全量数据,那么每组机器只需要存储全集的 1/3 即可,其中每组机器中的每个节点保存的数据内容是一样的,这样的一组机器(包含一个主节点和多个从节点)也称为一个分片;

 此时,如果全量数据继续增加,就只需引入更多的分片即可;

二、数据分片算法

1. 哈希求余

设有 N 个分片,使用 [0,N-1] 来编号;

哈希求余就是针对给定的 key,先根据一个 hash 函数计算出 hash 值(例如使用 MD5 算法计算 hash 值),再把得到的结果进行 % N,得到的结果就是其所对应的分片编号;

优点:简单高效,数据分配均匀;

缺点:一旦需要进行扩容,N 就会改变,导致原有的映射规则被破坏(hash(key) % N),就需要让节点之间的数据相互传输,重新排列,以满足新的映射规则,此时需要搬运的数据量非常多,开销很大;

2. 一致性哈希算法

首先,把 [0,2^32-1] 这个数据空间,映射到一个圆环上,数据按照顺时针方向增长;

假设存在三个分片,如下图所示

假设有一个 key,通过 hash 函数计算得到 hash 值 H,那么这个 key 对应的分片就是从 H 所在位置,顺时针往下找,找到的第一个分片;

这就相当于,N 个分片的位置,把整个圆环分成了 N 个区间,key 的 hash 值落在某个区间内,就归对应区间管理;

当需要扩容时,原有分片在环上的位置不动,只需要在环上新安排一个分片位置即可;

优点:大大降低了扩容时数据搬运的规模,提高了扩容操作的效率;

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

3. 哈希槽分区算法(Redis 采用)

为了解决上述搬运成本高 和 数据分配不均匀的问题,Redis cluster 引入了哈希槽 (hash slots) 算法;

hash_slot = crc16(key) % 16384

16384 = 16 * 1024 = 2 ^ 14,这就相当于把整个 hash 值,映射到 16384 个槽位上,即[0,16383]然后再把这些槽位比较均匀的分配给每个分片,同时每个分片的节点都要记录自己持有哪些分片;

比如有三个分片,则槽位的分配方式可能为:

  • 0 号分片:[0,5461],共 5462 个槽位
  • 1 号分片:[5462,10923],共 5462 个槽位
  • 2 号分片:[10924,16383],共 5460 个槽位

每个分片的节点使用 位图 来表示自己持有哪些槽位,对于 16384 个槽位来说,需要 2048 个字节即 2 KB 大小的内存空间来表示;

当需要进行扩容时,比如新加一个 3 号分片,就可以针对原有的槽位进行重新分配,分配的结果可能为:

  • 0 号分片:[0,4095],共 4096 个槽位
  • 1 号分片:[5462,9557],共 4096 个槽位
  • 2 号分片:[10924,15019],共 4096 个槽位
  • 3 号分片:[4096,5461],[9558,10923],[15020,16383],共 4096 个槽位

在实际使用 Redis 集群分片的时候,不需要手动指定哪些槽位分配给某个分片,只需要告诉某个分片应该持有多少个槽位即可,Redis 会自动完成后续的槽位分配,以及对应的 key 搬运的工作;

为什么是 16384 个槽位呢?

Redis 官方的解释是:节点之间通过心跳包通信,心跳包中包含了该节点持有哪些 slots,这个是使用位图这样的数据结构表示的,表示 16384 (16k) 个 slots,需要的位图大小是 2KB,如果给定的 slots 数更多了,比如 65536 个了,此时就需要消耗更多的空间,8 KB 位图表示了,8 KB,对于内存来说不算什么,但是在频繁的网络心跳包中,还是⼀个不小的开销的;

另一方面,Redis 集群一般不建议超过 1000 个分片,所以 16k 对于最大 1000 个分片来说是足够用的,同时也会使对应的槽位配置位图体积不至于很大;

三、集群故障处理

1. 故障判定

集群中的所有节点,都会周期性的使用心跳包进行通信;

  • 当节点 A 给节点 B 发送 ping 包,B 就会给 A 返回一个 pang 包;每个节点,每秒钟,都会给一些随机的节点发起 ping 包,这样设定是为了避免在节点很多的时候,心跳包也非常多;
  • 若节点 A 给节点 B 发起 ping 包,B 不能如期回应时,此时 A 就会尝试重置和 B 的 tcp 连接,看能否连接成功,如果仍然连接失败,A 就会把 B 设为 PFAIL 状态(相当于主观下线);
  • 当A 判定 B 为 PFAIL 之后,会通过 redis 内置的 Gossip 协议,和其他节点进行沟通,向其他节点确认 B 的状态,(每个节点都会维护一个自己的 "下线列表",由于视角不同,每个节点的下线列表也不⼀定相同);
  • 此时 A 发现其他很多节点,也认为 B 为 PFAIL,并且数目超过总集群个数的一半,那么 A 就会把 B 标记成 FAIL (相当于客观下线),并且把这个消息同步给其他节点 (其他节点收到之后,也会把 B 标记成 FAIL)

至此 B 就被彻底判定为故障节点了;

若某部分节点宕机,有可能会引起整个集群宕机 (整个集群处于 fail 状态),主要有以下三种情况:

  • 某个分片上的主节点和所有从节点都挂了
  • 某个分片上的主节点挂了,并且没有从节点(可归纳为第一种)
  • 超过半数的主节点挂了(此时就无法完成投票选举主节点的工作了)

2. 故障迁移

在上述故障判定中,若 B 是从节点,则不需要进行故障迁移,若 B 是主节点,并假设 B 有两个从节点 C 和 D,此时就会由 从节点 C D 触发故障迁移(把从节点提拔为主节点);

故障迁移的具体步骤为:

  1. 从节点判定自己是否具有参选资格: 如果从节点和主节点已经太久没通信(此时认为从节点的数据和主节点差异太了)时间超过阈值就失去竞选资格;   
    1. 具有资格的节点,比如 C  D会先休眠定时间,休眠时间 = 500ms 基础时间 + [0500ms] 随机时间 + 排名 * 1000ms,offset 的值越大,则排名会越靠前(越); 
    2.  C 的休眠时间到了C 就会给其他所有集群中的节点进行拉票操作,但是只有主节点才有投票资格
    3. 主节点就会把自己的票投给 C (每个主节点只有 1 票) C 收到的票数超过主节点数目的C 就会晋升成主节点(C 自己负责执行 slaveof no one并且让 D 执行 slaveof C)
    4. 同时,C 还会把自己成为主节点的消息同步给其他集群的节点;大家也都会更新自己保存的集群结构信息;

四、集群扩容

1. 把新的主节点加入到集群

redis-cli --cluster add-node (新的主节点的ip地址和端口号) (集群中任意节点的ip地址和端口号)

2. 重新分配 slots

redis-cli --cluster reshard (集群中任意节点的ip地址和端口号)

3. 给新的主节点添加从节点

redis-cli --cluster add-node (新的从节点的ip地址和端口号) (集群中任意节点的ip地址和端口号) --cluster-slave --cluster-master-id (新的主节点的 nodeId)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【每日刷题】Day78

【每日刷题】Day78 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 1608. 特殊数组的特征值 - 力扣(LeetCode) 2. 1385. 两个数组间的距离值 - …

实现胶囊神经网络,识别手写MNIST数据集,谈谈实现及理解。

🏆本文收录于《CSDN问答解答》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&…

在安装HDFS过程中遇见Permission denied

HDFS Shell命令权限不足问题解决 问题 想必有同学在实战Shell的时候,遇到了: Permission denied: userroot, accessWRITE, inode"/":hadoop:supergroup:drwxr-xr-x 这种类似的问题。 问题的原因就是没有权限,那么为什么呢&#…

C# OpenCvSharp 实现Reinhard颜色迁移算法

C# OpenCvSharp 实现Reinhard颜色迁移算法 目录 效果 项目 代码 下载 效果 项目 Reinhard颜色迁移算法的步骤: 1、将参考图片和目标图片转换到LAB空间下 2、得到参考图片和目标图片的均值和标准差 3、对目标图片的每一个像素值,减去目标图像均值然后…

【数据结构(邓俊辉)学习笔记】二叉搜索树04——AVL树

文章目录 1.重平衡1.1 AVL BBST1.2 平衡因子1.3 适度平衡1.4 接口1.5 失衡 复衡 2. 插入2.1 单旋2.2 双旋2.3 实现 3. 删除3.1 单旋3.2 双旋3.3 实现 4. (3 4)-重构4.1 "34"重构4.2 "34"实现4.3 rotateAt4.4 综合评价 1.重平衡 1…

自动雪深传感器的类型

TH-XL2随着科技的飞速发展,气象监测技术也在不断进步。在降雪天气频发的冬季,雪深数据对于保障道路交通、农业生产和电力供应等具有至关重要的作用。自动雪深传感器作为气象监测的重要工具,其类型多样、功能各异,为气象数据的准确…

让GNSSRTK不再难【第17讲 RTK定位技术原理-站间单差浮点解--第1部分】

第17讲 RTK定位技术原理-站间单差浮点解 RTK技术其实就是在RTD技术的基础上增加载波观测值的使用。由于伪距的误差在分米量级,即使我们通过站间单差消除掉绝大部分的伪距误差,但受限于伪距的精度,我们也只能达到分米量级的定位水平。 但载波…

.NET 矩阵6月红队工具和资源集合

01外网入口打点 1.1 Sharp4WbemScripting 1.2 ASP4Eval 1.3 Sharp4Web.config 1.4 Sharp4AddScript 02安全防御绕过 2.1 Sharp4DefenderStop 03搭建代理隧道 3.1 Sharp4suo5 04混淆加密防护 4.1 Obfuscar混淆器 4.2 Sharp4BatchGuard 05安全技术文档 5.1 .NET 通过Junction Fol…

对原生textarea加上:当前输入字数/最大输入字数

源码: <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>Textarea Character Counter with Dragga…

OpenCV 张正友标定法(二)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 在之前的博客OpenCV 张氏标定法中,我们没有考虑镜头畸变等因素,因此计算出的内参与外参均是理想情况下的数值,而如果我们考虑到镜头的畸变: 我们就需要考虑使用最小二乘法最小化像素坐标的重投影误差(上述所求…

Python中的数据结构

一.堆 堆的建立可以通过导入heapq库来实现 在Python中建立的是最小堆 即heap[k]<heap[2*k1]and heap[k]<heap[2*k2] 下面是一些 堆使用的方法 heapq.heappush([],加入的元素) heapq.heappop(heap)弹出最小的元素 heapq.nlargest(3,heap)返回最大的三个元素 hea…

无人机赋能自然资源调查

确权 业务挑战 由于测绘人员难以到达现场&#xff0c;确权区域大&#xff0c;传统人工测绘覆盖 不全面&#xff0c;信息不完整 传统测绘成果单一&#xff0c;现场核实难度高&#xff0c;确权采集信息不对称 无人机优势 数据采集效率是人工的10倍以上&#xff0c;可自动将…

【数学建模】 进化计算与群体智能

文章目录 进化计算与群体智能1. 遗传算法理论与实现1.1 遗传算法介绍1.2 遗传算法详细示例流程1) 初始种群2) 适应度评估3) 选择&#xff08;轮盘赌法&#xff09;4) 交叉5) 变异6) 迭代 1.3 遗传算法的实现1.4 scikit-opt 库实现遗传算法1.4.1 求解函数极值代码实现代码说明运…

智能制造 v3.13.14 发布,ERP、MES 更新

智能制造一体化管理系统 [SpringBoot2 - 快速开发平台]&#xff0c;适用于制造业、建筑业、汽车行业、互联网、教育、政府机关等机构的管理。包含文件在线操作、工作日志、多班次考勤、CRM、ERP 进销存、项目管理、EHR、拖拽式生成问卷、日程、笔记、工作计划、行政办公、薪资模…

C++20中的三向比较运算符(three-way comparison operator)

在C20中&#xff0c;引入了一个新的特性&#xff0c;即"三向比较运算符(three-way comparison operator)"&#xff0c;由于其外观&#xff0c;也被称为"宇宙飞船运算符(spaceship operator)"&#xff0c;其符号为<>。目的是简化比较对象的过程。这个…

八爪鱼现金流-032,给用户发邮件提示功能

每个月的 5 号、15 号、25 号的 17:30 工资日&#xff0c;给用户发送邮件&#xff0c;提示记账月报。 您也来记账一笔吧。 然后首页能看到趋势图。 八爪鱼现金流 八爪鱼

使用Petalinux设计linux系统

文章目录 1.通过 Vivado 创建硬件平台&#xff0c;得到 hdf 硬件描述文件2.设置 Petalinux 环境变量3.创建 Petalinux 工程4.配置Petalinux 工程5.配置Linux内核6.配置Linux根文件系统7.配置设备树文件8.编译 Petalinux 工程9.制作BOOT.BIN启动文件10.制作SD启动卡 1.通过 Viva…

智能旅行规划的未来:大模型与形式化验证的融合

我们在做旅行规划时面对众多的目的地选择、复杂的交通连接、预算限制以及个人偏好等多重因素&#xff0c;即使是最有经验的旅行者也可能会陷入选择困境。传统的旅行规划方法往往依赖于人工操作&#xff0c;这不仅耗时耗力&#xff0c;而且难以保证计划的最优性和可执行性。 本…

C++学习笔记---POCO库

在Windows系统中安装POCO 1&#xff09;安装OpenSSL POCO编译安装依赖OpenSSL&#xff0c;如果未安装OpenSSL则应该先安装OpenSSL。 假设将OpenSSL安装在C:\OpenSSL-Win64&#xff0c;将C:\OpenSSL-Win64、C:\OpenSSL-Win64\lib添加到PATH环境变量中2&#xff09;安装POCO 将p…