3、Redis集群原理分析

槽定位 (Slot Mapping):

Redis Cluster 将所有数据划分为 16384 个槽位(slots),每个槽位由一个或多个节点负责管理。Redis 集群通过 CRC16 哈希算法来计算每个 key 的哈希值,并对 16384 取模以确定该 key 应该存储在哪个槽位上。具体算法为 HASH_SLOT = CRC16(key) % 16384。当客户端连接到 Redis 集群时,会获取并缓存槽位的配置信息,从而能够快速地定位到存储某个 key 的目标节点。这种机制不仅提升了数据定位的效率,还确保了数据在节点之间的均匀分布,避免了单点瓶颈问题,使得 Redis 集群在处理高并发请求时能够保持高效。

跳转重定位 (Redirects):

当客户端向错误的节点发送请求时,错误节点会返回一个 MOVED 响应,指示客户端前往正确的节点处理该请求。这个响应包含目标节点的地址,客户端收到跳转指令后,会更新本地的槽位映射表,将新的节点信息缓存下来,以便下次请求直接发送到正确的节点。这种跳转重定位机制能够动态调整客户端的槽位信息,减少错误请求带来的开销,提高请求处理的效率,同时也确保了数据的一致性和完整性,避免了由于节点变化导致的请求失败或数据丢失。

节点间通信机制 (Gossip Protocol):

Redis 集群节点间使用 Gossip 协议进行通信,以维护集群的元数据。Gossip 协议是一种去中心化的协议,允许节点之间互相交流状态信息。常见的消息类型包括:

  • meet: 一个节点发送给新加入集群的节点,让新节点开始与集群中的其他节点通信。
  • ping: 每个节点定期发送给其他节点,包含自身状态和部分元数据,用于节点间的状态监控和信息交换。
  • pong: 对 ping 和 meet 消息的响应,确认接收到消息并返回自身状态。
  • fail: 当一个节点判断另一个节点宕机后,向其他节点广播该节点的失败状态。

Gossip 协议的优点在于其元数据更新的分散性,避免了单点压力。虽然元数据的更新有一定的延迟,但这种延迟在大规模分布式系统中是可以接受的。

选举原理 (Failover Election):

当 Redis 集群中的从节点(slave)检测到其主节点(master)处于 FAIL 状态时,会尝试进行故障转移(failover),即将自己提升为新的主节点。选举过程如下:

  1. 从节点发现主节点 FAIL 状态,增加当前集群的 epoch,并广播 FAILOVER_AUTH_REQUEST 消息请求选票。
  2. 其他主节点在接收到请求后,如果认为请求者合法,会返回 FAILOVER_AUTH_ACK 消息。
  3. 从节点收集到超过半数的 ACK 消息后,成为新的主节点。
  4. 新主节点广播 PONG 消息通知集群的其他节点。

这个过程确保了新主节点的选举具有足够的合法性和支持。Redis 集群要求至少三个主节点,以保证在选举过程中能够达成过半数条件。如果只有两个主节点,选举无法进行,从而无法保证集群的高可用性。

脑裂数据丢失问题 (Split-Brain Scenario):

脑裂(split-brain)是指网络分区导致集群中的不同部分各自选出自己的主节点并对外提供写服务,最终导致数据不一致。当网络恢复后,其中一个主节点会被降级为从节点,造成数据丢失。为解决这一问题,Redis 集群提供了配置参数 min-replicas-to-write,要求写操作必须同步到至少一个从节点才能成功执行。这种配置能够在一定程度上减少数据丢失风险,但在实际应用中仍需权衡集群的可用性和数据的一致性。

集群对外服务完整性 (Cluster Availability):

Redis 集群通过参数 cluster-require-full-coverage 来控制当部分节点失效时,集群是否仍然对外提供服务。设置为 no 时,即使有部分节点失效,集群仍然可用;设置为 yes 时,任何负责特定槽位的主节点失效且没有相应从节点进行故障转移时,集群不可用。这种机制允许在一定程度上保持集群的高可用性,同时也保障了数据的一致性,适用于对数据完整性要求较高的业务场景。

批量操作命令支持 (Batch Operations):

Redis 集群在支持批量操作命令(如 mset 和 mget)时,要求所有 key 必须落在同一个槽位上。通过在 key 前添加大括号 {},可以确保这些 key 的哈希值计算结果相同,从而分配到同一槽位。比如 mset {user1}:1:name zhuge {user1}:1:age 18,其中 user1 是哈希标签,确保两个 key 被分配到同一个槽位。这种机制既保证了批量操作的高效执行,也避免了跨节点操作带来的复杂性和性能开销。

Redis集群的比较:哨兵模式 vs 集群模式

哨兵模式 (Sentinel Mode):

  • 工作原理:
    哨兵(Sentinel)通过定期发送PING请求监控主节点(master)的状态。当检测到主节点宕机时,哨兵会与其他哨兵协作,进行主从切换(failover),选择一个从节点(slave)提升为新的主节点。哨兵会自动更新配置,让客户端指向新的主节点。

  • 优缺点:

    • 优点:
      哨兵模式可以在主节点故障时自动进行主从切换,提供一定程度的高可用性。
    • 缺点:
      哨兵模式的配置相对复杂,并且在故障转移期间会存在短暂的访问中断。由于只有一个主节点对外提供服务,因此无法支持高并发场景,单个主节点的内存不宜设置得过大,否则会影响持久化文件的生成和主从同步的效率。

高可用集群模式 (Cluster Mode):

  • 工作原理:
    Redis集群由多个主从节点组成,通过分片(sharding)将数据分散存储在不同的节点上。每个节点既可以存储数据,也可以进行故障转移,提升高可用性。集群使用Gossip协议维护元数据,实现节点间的信息同步和故障转移。

  • 优缺点:

    • 优点:
      Redis集群模式支持数据分片,能够水平扩展,适用于大规模数据存储和高并发访问。集群配置简单,不需要哨兵也能完成节点移除和故障转移,性能和高可用性均优于哨兵模式。
    • 缺点:
      配置不当可能导致数据不一致问题,因此需要确保正确配置和管理。

哨兵Leader选举流程

选举机制:

  • 步骤:

    1. 当某个哨兵(Sentinel)检测到主节点下线后,会与其他哨兵协商,选出一个Leader进行故障转移。
    2. 每个发现主节点下线的哨兵可以请求其他哨兵选举自己为Leader。
    3. 选举过程遵循先到先得的原则,超过一半的哨兵同意后,该哨兵成为Leader。
    4. 每次选举都会增加配置纪元,每个纪元只会选择一个Leader。
    5. Leader Sentinel进行故障转移操作,从存活的从节点中选举新的主节点。
  • 配置建议:
    哨兵节点建议部署至少三个,并推荐奇数个,以确保选举过程的顺利进行和高可用性。奇数个哨兵节点可以在选举过程中避免平票情况,提高选举效率和系统的可靠性。

通过上述详细解析,可以更深入地理解Redis集群的各个方面,提高其高可用性和性能。

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

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

相关文章

Maven基础学习

一、Why? 1.真的需要吗? 2.究竟为什么? 二、What? 1.Maven简介 2.什么是构建 3.构建过程的几个主要环节 4.自动化构建 5.Maven核心概念 6.安装Maven 三、How? 四、约定的目录结构

详解HTTP:常用的密钥交换算法RSA与ECDHE

HTTPS 常用的密钥交换算法:RSA 与 ECDHE 在 HTTPS 中,密钥交换算法扮演了至关重要的角色,确保数据在传输过程中的安全性。目前常用的密钥交换算法主要有两种:RSA 和 ECDHE。相比于较为传统的 RSA,ECDHE 由于具备前向安…

“论大数据处理架构及其应用”写作框架,软考高级,系统架构设计师

论文真题 大数据处理架构是专门用于处理和分析巨量复杂数据集的软件架构。它通常包括数据收集、存储、处理、分析和可视化等多个层面,旨在从海量、多样化的数据中提取有价值的信息。Lambda架构是大数据平台里最成熟、最稳定的架构,它是一种将批处理和流…

FFmpeg 命令行 音视频格式转换

📚:FFmpeg 提供了丰富的命令行选项和功能,可以用来处理音视频文件、流媒体等,掌握命令行的使用,可以有效提高工作效率。 目录 一、视频转换和格式转换 🔵 将视频文件转换为另一种格式 🔵 指定…

C语言分支和循环(下)

C语言分支和循环(下) 1. 随机数生成1.1 rand1.2 srand1.3 time1.4 设置随机数的范围 2. 猜数字游戏实现 掌握了前面学习的这些知识,我们就可以写⼀些稍微有趣的代码了,比如: 写⼀个猜数字游戏 游戏要求: 电…

文华均线交叉多空买卖点-支撑压力自动画线-波浪AB画线指标公式

A1:MA(C,5); A2:MA(C,10); MA1:MA(A1,15); MA2:MA(A2,15); JC:CROSS(MA1,MA2); SC:CROSSDOWN(MA1,MA2); N:1; JC1:BARSLAST(JC)N; SC1:BARSLAST(SC)N; VERTLINE(SC,COLORRED),DOT; VERTLINE(JC,COLORGREEN),DOT; H1:VALUEWHEN(SC,HHV(H,JC1)),COLORRED;//当前死叉到…

算法设计与分析--近似算法内容整理

文章目录 P、NP、NP-hard 和 NPC多项式时间概念区分NP-hard 的证明例题 1 证明 T S P TSP TSP 问题是 N P − h a r d NP-hard NP−hard 问题 。例题 2 证明最大加权独立集问题是 N P − h a r d NP-hard NP−hard 问题。 扩展 NP-hard 问题3-SAT 问题TSP 旅行商问题 Load B…

笔记本电脑部署VMware ESXi 6.0系统

正文共:888 字 18 图,预估阅读时间:1 分钟 前面我们介绍了在笔记本上安装Windows 11操作系统(Windows 11升级不了?但Win10就要停服了啊!来,我教你!),也介绍了…

摸鱼大数据——Spark基础——Spark环境安装——PySpark搭建

三、PySpark环境安装 PySpark: 是Python的库, 由Spark官方提供. 专供Python语言使用. 类似Pandas一样,是一个库 Spark: 是一个独立的框架, 包含PySpark的全部功能, 除此之外, Spark框架还包含了对R语言\ Java语言\ Scala语言的支持. 功能更全. 可以认为是通用Spark。 功能 P…

Linux开发讲课29---Linux USB 设备驱动模型

Linux 内核源码:include\linux\usb.h Linux 内核源码:drivers\hid\usbhid\usbmouse.c 1. BUS/DEV/DRV 模型 "USB 接口"是逻辑上的 USB 设备,编写的 usb_driver 驱动程序,支持的是"USB 接口": US…

单片机的学习(15)--LCD1602

LCD1602 14.1LCD1602的基础知识1.LCD1602介绍2.引脚及应用电路3.内部结构框图4.时序结构5.LCD1602指令集6.字符值7.LCD1602操作流程 14.2LCD1602功能函数代码1.显示一个字符(1)工程目录(2)main.c函数(3)LCD…

当晋升受阻或待遇不公时应怎么办?

当晋升受阻或待遇不公时应怎么办?

C语言中的基础指针操作

在C语言中,指针是一个非常重要的概念,它提供了直接访问内存地址的能力。指针变量用于存储内存地址,而不是数据值,在某种意义上和门牌号具有相似含义:指针是一个变量,其存储的是另一个变量的内存地址&#x…

6.27-6.29 旧c语言

#include<stdio.h> struct stu {int num;float score;struct stu *next; }; void main() {struct stu a,b,c,*head;//静态链表a.num 1;a.score 10;b.num 2;b.score 20;c.num 3;c.score 30;head &a;a.next &b;b.next &c;do{printf("%d,%5.1f\n&…

Cesium Model 中的剪裁平面 (ClippingPlane)

Cesium Model 中的剪裁平面 (ClippingPlane) 参考: https://www.cnblogs.com/webgl-angela/p/9197672.html Cesium Model 中的剪裁平面 (ClippingPlane) // 相关类: class ClippingPlaneCollection {} class ClippingPlane {}// 剪裁的整体流程: Model.prototype.update () …

LINGO:生产计划问题

模型&#xff1a;有瓶颈设备的多级生产计划问题 某工厂的主要任务是通过组装生产产品 A &#xff0c;用于满足外部市场需求。产品 A 的构成与组装过程见下图 &#xff0c;即 D , E , F , G 是从外部采购的零件&#xff0c;先将零件 D , E 组装成部件 B &#xff0c;零…

看你那样,超出你想像:羊、羊、羊

一、I am me,羊羊羊英文中的 我就是我(I am me),其实就是:羊 羊 羊,为什么会有这么一个结论呢?请往下看:I,就是羊am(是),也是羊me(我),还是羊我就是我,不一样的烟火。其实,我就是我(I am me),没有什么不一样,因为全是羊。二、羊都一样吗?among(在...当中…

斜率优化DP——AcWing 303. 运输小猫

斜率优化DP 定义 斜率优化DP&#xff08;Slope Optimization Dynamic Programming&#xff09;是一种高级动态规划技巧&#xff0c;用于优化具有特定形式的状态转移方程。它主要应用于那些状态转移涉及求极值&#xff08;如最小值或最大值&#xff09;的问题中&#xff0c;通…

c++重载(运算符)

1&#xff09;C入门级小知识&#xff0c;分享给将要学习或者正在学习C开发的同学。 2&#xff09;内容属于原创&#xff0c;若转载&#xff0c;请说明出处。 3&#xff09;提供相关问题有偿答疑和支持。 对于系统的所有操作符&#xff0c;一般情况下&#xff0c;只支持基本数…

ubuntu安装显卡驱动

获取权限 chmod X NVIDlA-Linux-x86_64-550.90.07.run 安装程序 sudo bash NVIDlA-Linux-x86_64-550.90.07.run