【Redis 进阶】集群

思维导图:


一、Redis集群概述

(一)广义集群与狭义集群的定义

  • ​广义集群​​:指由多个机器组成的分布式系统,例如前面提到的主从模式和哨兵模式。
  • ​狭义集群​​:Redis提供的集群模式,主要用于解决存储空间不足的问题。

(二)Redis集群的核心思想

Redis集群通过引入多组Master/Slave架构,每组Master/Slave负责存储数据全集的一部分,从而实现数据的分布式存储和高可用性。

图片中的每一个红框,都可以称作一个分片,也就是说,理论上如果数据量进一步增加,只要继续增加分片的数量即可。

那么接下来的问题就是,给定一个数据,这个数据应该放在哪个分片上呢,取数据的时候又应该到哪个片段读取?

二、数据分片算法

(一)哈希求余算法

  • ​原理​​:通过哈希函数对数据key进行映射,得到的整数再对分片数量求余,确定数据所在分片。
    节点位置 = hash(key) % 节点数量
  • ​缺点​​:由于数据的分布是随机的,在加入一个切片后,所有的数据需要重新分配区间,大量的数据需要迁移。数据迁移成本高,尤其在数据量过大时。

(二)一致性哈希算法

  • ​原理​​:

1.将1 ~ 2^32 - 1均匀分布在一个圆环上。

2.将整个圆划分为三个分片

3.找到相应分片的方法就是找到数据的 hash 值,落到某个点,然后顺时针旋转,对应的分片就是所属分片

  • ​缺点​​:在这种情况下,如果想进行扩容操作,那就可以在 0 号分片和 2 号分片中间插入 3 号分片,然后把原属于 0 号 和 2 号的部分数据迁移到 3 号,这样数据迁移的数量就会大大降低。但是同时也带来了一个问题,那就是分片的数据不均匀,导致数据倾斜。

(三)哈希槽分区算法

  • ​原理​​:
    • Redis集群采用哈希槽分区算法,将整个数据集划分为16384个槽位,每个节点负责一部分槽位。
    • 假设当前有三个分片,一种可能的分配方式:
      • 0号分片: [0, 5461],共5462个槽位。
      • 1号分片: [5462, 10923],共5462个槽位。
      • 2号分片: [10924, 16383],共5460个槽位。

这里的分片规则是很灵活的,每个分片持有的槽位不一定连续。每个分片的节点使用位图来表示自己持有哪些槽位。对于16384个槽位来说,需要2048个字节(2KB)大小的内存空间表示。

  • 如果需要进行扩容,比如新增一个3号分片,就可以针对原有的槽位进行重新分配。例如一种可能的分配方式:
    • 0号分片: [0, 4095],共4096个槽位。
    • 1号分片: [5462, 9557],共4096个槽位。
    • 2号分片: [10924, 15019],共4096个槽位。
    • 3号分片: [4096, 5461] + [9558, 10923] + [15019, 16383],共4096个槽位。

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

  • ​优点​​:扩展性强,数据分布均匀。
数据分片相关问题
  1. ​Redis集群最多时有16384个分片吗?​

    • 虽然理论上可以支持16384个分片,但实际应用中建议不超过1000个分片,以避免数据倾斜和系统不稳定。
    • 分片过多会导致服务程序涉及的机器数量激增,增加系统不稳定性。
  2. ​为什么是16384个槽位?​

    • 节点间通过心跳包通信,心跳包需包含分片对应的槽位信息。
    • 使用位图表示槽位信息,占用2KB大小,适合频繁交互的心跳包,减少网络带宽消耗。

三、基于Docker在云服务器上搭建Redis集群

(一)创建目录和配置

  • ​YAML文件​​:使用Docker Compose定义集群节点和服务配置。
  • ​Shell脚本​​:批量创建每个节点的配置文件。

(二)创建Redis节点

  • 使用Docker创建11个Redis节点(9个集群节点,2个扩容节点)。

(三)创建集群

  • 使用redis-cli --cluster create命令创建集群。
  • cluster nodes命令查看集群信息。

四、故障转移机制

(一)故障判定

Redis集群中的故障判定依赖于节点间的心跳包通信。每个节点每秒会随机向部分节点发送心跳包(避免全量发送导致的指数级增长)。心跳包包含节点ID、所属分片、包含的槽位等信息。

  1. ​主观下线(PFAIL)​
    • 当一个节点(如A)向另一个节点(如B)发送ping包后,如果在规定时间内未收到B的pong包回复,A会重置与B的连接并再次发送ping包。
    • 若再次发送后仍未收到回复,A就会主观地认为B下线了,将B标记为PFAIL状态。
  2. ​客观下线(FAIL)​
    • 当一个节点将某个节点标记为PFAIL后,它会通过Redis内置的Gossip协议与其他节点进行通信,询问它们对目标节点状态的看法。
    • 如果超过半数的节点都认为该目标节点处于PFAIL状态,那么这个目标节点就会被判定为FAIL状态,此时故障转移流程将被触发。

(二)故障迁移

当主节点发生故障被判定为FAIL后,故障迁移过程如下:

  1. ​从节点参选资格判断​
    • 故障主节点的从节点会根据自身与主节点的数据差异等因素判断是否有参选资格。
  2. ​休眠与拉票​
    • 具有参选资格的从节点会进入休眠状态,休眠时间计算方式为:500ms基础时间+【0 - 500】随机时间+排名 * 1000ms(offset越大,排名越靠前,即越小)。
    • 当某个从节点先醒来后,会向其他节点发送拉票请求,但只有主节点能够参与投票。
  3. ​新主节点选举​
    • 当某个从节点的票数超过当前主节点(故障主节点)的半数时,该从节点就会晋升为新主节点。
    • 新主节点确定后,会将其信息同步给其他节点,同时哨兵节点会通知客户端更新连接信息,以确保后续操作指向新的主节点。

(三)集群宕机情况

  1. 某个分片的主从节点全部挂掉。
  2. 主节点挂掉且无从节点。
  3. 超过半数的master节点故障。

五、集群扩容

(一)新主节点加入与槽位重分配

  • ​新主节点加入​​:将新的Redis节点加入到集群中。
  • ​槽位重分配​​:通过redis-cli --cluster reshard命令重新分配槽位,将部分槽位从现有节点迁移到新节点。
  • 在这个过程中,对于集群中的key,大部分是不用搬运的,在搬运的过程中,未搬运的key可以被客户端访问。对于正在搬运的key,可能就会出现访问出错的情况。就比如你正重定向到某个切片,但这个切片上的对应数据已经被搬运走了。所以为了更高的可用性,除了扩容,也可以搭建新的集群(一组新的机器),然后从旧的集群中克隆数据,使用新的集群代替旧的集群。(成本高)

(二)添加从节点

  • 给新的主节点添加从节点以提高数据冗余和高可用性。

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

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

相关文章

第二十八节:直方图处理- 直方图计算与绘制

直方图是数字图像处理的基石工具,在计算机视觉领域扮演着关键角色。通过本文,您将深入掌握使用OpenCV进行直方图计算的底层原理,并学会多种专业的直方图可视化方法。无论您是刚入门的新手还是希望提升技能的开发者,这里都有值得探索的进阶技巧。 一、直方图基础理论 1.1 什…

传奇游戏跟奇迹游戏的区别

前言 对传奇和奇迹游戏背景感兴趣的,可以去浏览以下相关博客: 传奇与奇迹的发源 传奇游戏跟奇迹游戏的区别 区别1:画面 奇迹游戏画面更为美观(图1:奇迹游戏画面) 传奇游戏画面相对简陋(图2&am…

佰力博科技准静态d33测试的注意事项

准静态d33测试是测量压电材料纵向压电应变常数的重要方法,其注意事项包括以下几个方面: 选择合适的测量设备 准静态d33测试需要使用专用的压电测试仪,如佰力博PEAI1000高精度压电分析仪、准静态d33测量仪或PCA1000压电陶瓷综合参数分析仪。这…

归并排序~

归并排序是经典的排序算法之一,是分治思想的体现。虽然在排序大多用sort就能搞定,但是有些题用可以用归并顺带就解决掉了(比如求逆序对)。 归并排序大概就是先将整个序列分为足够小的片段,然后在每个小片段里面进行排序,然后再依…

UUG杭州站 | 团结引擎1.5.0 OpenHarmony新Feature介绍

PPT下载地址:https://u3d.sharepoint.cn/:b:/s/UnityChinaResources/EaZmiWfAAdFFmuyd6c-7_3ABhvZoaM69g4Uo2RrSzT3tZQ?e2h7RaL 在2025年4月12日的Unity User Group杭州站中,Unity中国OpenHarmony技术负责人刘伟贤带来演讲《团结引擎1.5.0 OpenHarmony新…

有效的聚水潭数据集成到MySQL案例

聚水潭数据集成到MySQL的技术案例分享 在本次技术案例中,我们将探讨如何通过轻易云数据集成平台,将聚水潭的采购退货单数据高效、准确地集成到MySQL数据库中的BI云妃秀采购退货表。这个过程不仅需要处理大量的数据,还要确保数据的完整性和实…

win11 VSCode 强制弹窗微软登录

今天在一台新电脑上配置VSCode同步的时候,用了微软账号,因为这台电脑比较特殊,不方便科学上网,所以一开始用的微软账户登录,导致和GitHub账号登录的配置、扩展等等不同步。 后面准备改用GitHub账号登录发现不行&#…

Milvus 全面解析

Milvus是鹰科鹰属的一种猛禽,以飞行速度快、视力敏锐和适应能力强而闻名。 Zilliz 以其开源高性能、高可扩展性矢量数据库 Milvus 命名,该数据库可在从笔记本电脑到大型分布式系统等各种环境中高效运行。它既可以作为开源软件使用,也可以作为云服务使用。 Milvus 由 Zilli…

【复刻】人工智能技术应用如何影响企业创新(2007-2023年)

AI 技术如何推动企业创新,是新质生产力形成与发展的核心问题。深入研究这一议题,有助于为当前的创新管理实践提供有效方案,进而助力中国经济实现高质量发展。参照李玉花(2024)的做法,对来自中国工业经济《人…

快消零售AI转型:R²AIN SUITE如何破解效率困局

引言 快消零售行业正经历从“规模扩张”到“精益运营”的转型阵痛,消费者需求迭代加速、供应链复杂度攀升、人力成本持续走高,倒逼企业通过技术升级实现业务重塑[1]。RAIN SUITE以AI应用中台为核心,针对快消零售场景打造全链路提效方案&…

计算机网络八股文--day1

从浏览器输入url到显示主页的过程? 1. 浏览器查询域名的IP地址 2. 浏览器和服务器TCP三次握手 3. 浏览器向服务器发送一个HTTP请求 4. 服务器处理请求,返回HTTP响应 5. 浏览器解析并且渲染页面 6. 断开连接 其中使用到的协议有DNS协议&#xff08…

Vector和list

一、Vector和list的区别——从“它们是什么”到“区别在哪儿” 1. 它们是什么? Vector:类似于一排排整齐的书架(数组),存放元素时,元素排成一条线,连续存储。可以很快通过编号(索引…

VCS X-PROP建模以及在方针中的应用

VCS X-PROP建模以及在方针中的应用 摘要:VCS X-Prop(X-Propagation)是 Synopsys VCS 仿真工具中的一种高级功能,用于增强 X 态(未知态)和 Z 态(高阻态)在 RTL 仿真中的建模和传播能力…

HPE ProLiant DL360 Gen11 服务器,配置 RAID 5 教程!

今天的任务,是帮客户的一台HPE ProLiant DL360 Gen11 服务器,配置RAID 5。依然是按照我的个人传统习惯,顺便做一个教程,分享给有需要的粉丝们。如果你在实际操作中,遇到了什么问题,欢迎在评论区留言&#x…

PyTorch深度神经网络(前馈、卷积神经网络)

文章目录 神经网络概述神经元模型多层感知机前馈神经网络网络拓扑结构数学表示基本传播公式符号说明整体函数视角 卷积神经网络卷积神经网络发展简史第一代(1943-1980)第二代(1985-2006)第三代(2006-至今)快…

三轴云台之控制算法协同技术篇

三轴云台的控制算法协同技术是确保云台在复杂动态环境下实现高精度、高稳定性运动控制的核心,其技术体系涵盖多传感器融合、多算法协同以及多目标优化三个关键维度。以下从技术架构与实现路径展开分析: 一、多传感器融合:构建环境感知基础 三…

Adobe DC 2025安装教程

一.软件下载 点此下载 二.软件安装

[Java实战]Spring Boot 整合 Freemarker (十一)

[Java实战]Spring Boot 整合 Freemarker (十一) 引言 Apache FreeMarker 作为一款高性能的模板引擎,凭借其简洁语法、卓越性能和灵活扩展性,在 Java Web 开发中占据重要地位。结合 Spring Boot 的自动化配置能力,开发者能快速构建动态页面、…

DeepSeek:开启能源领域智能化变革新时代

目录 一、DeepSeek 与能源领域变革的邂逅1.1 DeepSeek 在人工智能领域的地位与特点1.2 能源行业面临的挑战与变革需求1.3 DeepSeek 在能源领域应用的重要性和意义 二、能源政策解读与科普新助手2.1 能源政策解读的深度变革2.2 能源科普的创新使者 三、能源项目可行性分析新利器…

uniapp设置 overflow:auto;右边不显示滚动条的问题

设置了overflow:auto;或者其它overflow的属性不显示滚动条是因为在uniapp中默认隐藏了滚动条 解决方法: //强制显示滚动条 ::-webkit-scrollbar {width: 8px !important;background: #ccc !important;display: block !important;}//设置滚动条颜色.cu-…