3、Redis集群原理分析

news2024/10/5 15:08:37

槽定位 (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集群的各个方面,提高其高可用性和性能。

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

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

相关文章

名企面试必问30题(十)——你有自己的方法论吗?

1.思路 第一,方法论指的是做某些事情或业务的套路,但它没有绝对的正确性,每个人都可以拥有专属的方法论。 第二,方法论必定源自于自身实战经验的总结。 2.参考解答 “在软件测试工作中,我逐渐形成了自己的一套方法论。…

Elasticsearch 聚合查询简介

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…

技术赋能教育:校园3D电子地图与AR导航解决方案

随着高考的落幕,又一批新鲜血液即将注入大学校园。面对陌生的环境,如何快速适应、准确找到目标地点,成为新生们的一大难题。同时,对于学校而言,如何向报考人员直观展示校园环境,提供沉浸式参观体验&#xf…

VMware ESXi 8.0U3 macOS Unlocker OEM BIOS 集成驱动版,新增 12 款 I219 网卡驱动

VMware ESXi 8.0U3 macOS Unlocker & OEM BIOS 集成驱动版,新增 12 款 I219 网卡驱动 VMware ESXi 8.0U3 macOS Unlocker & OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版) 发布 ESXi 8.0U3 集成驱动版,在个人电脑上运行企业级工作负载 请访…

kaggel-汽车价格预测项目

1.读取数据,查看数据基本概况 import pandas as pd datapd.read_csv(r./car_price_prediction.csv)#查看前5行数据 print(data.head(5))output:ID Price Levy ... Wheel Color Airbags 0 45654403 13328 1399 ... Left wheel Silve…

llama3模型部署时遇到的问题及解决方案

在llama3模型部署时,会遇到一系列问题,这里就作者所遇到的问题与解决方法分享一下。 注意:这里是从llama3 github主页上给的方法一步步做的,不适用于其他部署大模型的方法。 文章目录 ERROR 403:Forbidden安装依赖时出…

50-3 内网信息收集 - 域环境搭建

搭建准备: 在搭建准备阶段,我们需要准备三台 Windows 虚拟机:Windows Server 2012、Windows 7 和 Windows Server 2008。接下来,我们将配置 Windows Server 2012 作为域控制器,而 Windows 7 和 Windows Server 2008 将作为成员机加入域。建议保持这三台虚拟机的内存不超过…

Go环境安装---附带每一步截图

Windows环境 Go安装包下载 下载后直接安装步骤按照即可。 测试 winR 输入cmd 在命令行输出go version可以看到自己的版本。 go env 查看环境变量 在桌面创建hello.go的文件 编写代码。注意,编码必修是UTF-8 在命令行输入路径刚刚代码所在的路径&#x…

云原生之容器编排实践-OpenEuler23.09在线安装Kubernetes与KubeSphere

背景 前几篇文章中介绍了如何将 ruoyi-cloud 项目部署到 Kubernetes 集群中,包括网关服务、认证服务和系统服务并且对全部服务采用 YAML 文件的方式来进行部署,这虽然有助于理解 K8S 组织管理资源的风格与底层机制,但是对于团队中不太熟悉命…

隧道FM调频广播信号泄漏电缆+天线覆盖方案

泄露电缆信号具有信号均匀,覆盖效果好等特点,但是由于造价昂贵及工程施工量大让一部分工程望而却步,现介绍一种性价比稍高一点的,泄漏电缆+宽带天线的方案。如图,去掉泄露电缆末端的匹配假负载 &#xff0c…

图书管理系统(附源码)

前言:前面一起和小伙伴们学习了较为完整的Java语法体系,那么本篇将运用这些知识连串在一起实现图书管理系统。 目录 一、总体设计 二、书籍与书架 书籍(Book) 书架(Booklist) 三、对图书的相关操作 I…

[C++][设计模式][适配器模式]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受 1.动机 在软件系统中,由于应用环境的变化,常常需要将”一些现存的对象“放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足如何应对这些”迁移的变化“?如何既能利用现…

第一节:如何开发第一个spring boot3.x项目(自学Spring boot 3.x的第一天)

大家好,我是网创有方,从今天开始,我会记录每篇我自学spring boot3.x的经验。只要我不偷懒,学完应该很快,哈哈,更新速度尽可能快,想和大佬们一块讨论,如果需要讨论的欢迎一起评论区留…

基于MongoDB的电影影评分析

项目源码及资料 项目介绍 1、从豆瓣网爬取Top10的电影数据 爬取网址: https://movie.douban.com/top250 1.1 爬取Top10的影视信息 mv_data [] i 0 for x in soup.select(.item):i 1mv_name re.search(>([^<])<, str(x.select(.info > .hd > a > .tit…

【VMware】VMware 开启的虚拟机无法联网的解决方案

目录 &#x1f30a;1. 问题说明 &#x1f30a;2. 解决方案 &#x1f30d;2.1 查看虚拟网络编辑器 &#x1f30d;2.2 设置 vmnet &#x1f30d;2.3 设置虚拟机网络 &#x1f30d;2.4 Xshell连接虚拟机 &#x1f30a;1. 问题说明 虚拟机 ping 其他网页显示失败,比如&#…

嵌入式linux系统中动态链接库实现详解

大家好,linux系统中动态库是如何实现相互链接的?今天简单聊聊动态链接库的实现原理。 假设有这样两段代码,第一段代码定义了一个全量变量a以及函数foo,函数foo中引用了下一段代码中定义的全局变量b。 第二段代码定义了全局变量b以及main函数,同时在main函数中调用了第一个…

【数据仓库与数据挖掘】期末复习重点资料

题型&#xff1a; 选择题10个2分 填空题10空2分 简答题6个5分 大题1个&#xff08;20分10分&#xff09; 第一章 数据仓库的概念与体系结构 1.1 数据仓库的基本概念 1、元数据 元数据&#xff08;Metadata&#xff09;是描述数据仓库中数据的数据结构和构建方法的数据。…

关于Redisson分布式锁的用法

关于Redisson分布式锁的用法 Redisson是一个基于Redis的Java分布式对象和服务框架&#xff0c;它提供了多种分布式锁的实现&#xff0c;包括可重入锁、公平锁、读写锁等。Redisson实现分布式锁的核心原理主要依赖于Redis的数据结构和Redisson框架提供的高级功能。以下详细讲解…

java之动态代理

1 代理模式 代理模式提供了对目标对象额外的访问方式&#xff0c;即通过代理对象访问目标对象&#xff0c;这样可以在不修改原目标对象的前提下&#xff0c;提供额外的功能操作&#xff0c;扩展目标对象的功能。简言之&#xff0c;代理模式就是设置一个中间代理来控制访问原目标…

普通集群与镜像集群配置

一. 环境准备 关闭防火墙和selinux&#xff0c;进行时间同步 主机名系统IP服务rabbitmq-1 Rocky_linux9.4 192.168.226.22RabbitMQ&#xff0c;MySQLrabbitmq-2Rocky_linux9.4192.168.226.23RabbitMQrabbitmq-3Rocky_linux9.4192.168.226.24RabbitMQ 修改主机名#192.168.226…