Redis Cluster 详解

Redis Cluster 详解

1. 为什么需要 Redis Cluster?

Redis 作为一个高性能的内存数据库,在单机模式下可能会遇到以下问题:

  1. 单机容量受限:Redis 是基于内存存储的,单机的内存资源有限,单实例的 Redis 只能存储有限的数据。
  2. 单点故障(SPOF):单机 Redis 宕机后,所有缓存数据都无法访问,影响业务可用性。
  3. 性能瓶颈:单机 Redis 受 CPU 和 I/O 限制,无法支撑高并发的访问需求。
  4. 扩展性差:单机模式不支持水平扩展,无法通过增加机器来提高存储和计算能力。

Redis Cluster(集群模式) 是 Redis 官方提供的分布式解决方案,主要用于解决以上问题。


2. Redis Cluster 解决了什么问题?有什么优势?

Redis Cluster 解决了以下问题:

  1. 数据分片存储,突破单机限制
    • 通过 哈希槽(hash slot)+ 多节点 的方式,将数据存储到多个 Redis 实例中,实现水平扩展
    • 解决了单机存储受限的问题。
  2. 无中心化架构,避免单点故障
    • 传统的 Redis Sentinel 模式存在 主从架构 + 哨兵管理,但仍然有中心节点。
    • Redis Cluster 去中心化,所有节点都存储集群信息,任何节点都可以提供集群状态。
    • 解决了单点故障的问题。
  3. 主从复制 + 自动故障转移
    • Redis Cluster 采用主从架构,每个 Master 可以有多个 Slave 备份。
    • 如果某个 Master 宕机,Redis Cluster 会自动提升 Slave 为新的 Master,保证集群可用性。
  4. 动态扩展,支持水平扩容
    • Redis Cluster 允许 动态添加 / 删除节点,可以在运行时扩展 Redis 集群,而不会影响业务。
    • 解决了 Redis 单机模式扩展性差的问题。

Redis Cluster 的核心优势

特点Redis Cluster 解决方案
存储受限数据分片存储,支持多个节点
单点故障无中心化架构,主从复制
故障恢复自动故障转移
性能瓶颈多主架构,支持并行读写
扩展性可动态扩容 / 缩容

3. Redis Cluster 是如何分片的?

Redis Cluster 采用 哈希槽(hash slot)+ 数据分片 机制进行数据分片:

  1. 整个集群有 16384 个哈希槽(slot)。

  2. 每个 Key 通过哈希算法分配到某个哈希槽:

    • slot = CRC16(key) % 16384
    • CRC16 是一种高效的哈希计算方法。
  3. 哈希槽分布到不同的 Redis 节点:

    • 例如:3 个 Redis 节点,每个节点存储部分哈希槽:

      节点 A:0 - 5460
      节点 B:5461 - 10922
      节点 C:10923 - 16383
      
    • 如果有新的节点加入,Redis Cluster 会重新分配哈希槽。


4. 为什么 Redis Cluster 的哈希槽是 16384 个?

Redis Cluster 选择 16384 作为固定的哈希槽数量,主要基于以下考虑:

  1. 兼容 CRC16 计算
    • Redis 使用 CRC16 算法计算 Key 的哈希值,并使用 模运算(% 16384) 确定哈希槽。
    • 16384(2¹⁴)是 2 的幂,计算高效。
  2. 负载均衡
    • 16384 个槽足够均匀地分配到多个节点,避免热点数据集中在某个节点。
  3. 迁移成本低
    • 槽的数量适中,在节点增加/删除时,可以快速迁移哈希槽,减少数据重新分布的影响。
  4. 适用于大规模集群
    • 16384 个槽能支持数百个 Redis 节点,适用于不同规模的集群扩展。

5. 如何确定给定 key 应该分布到哪个哈希槽中?

Redis Cluster 通过 CRC16 哈希算法 计算 key 的哈希槽:

slot = CRC16(key) % 16384

示例:

import crcmodcrc16 = crcmod.predefined.Crc('crc-16')
crc16.update(b'mykey')
slot = crc16.crcValue % 16384
print(slot)  # 输出哈希槽号

Redis 客户端会计算 Key 的哈希槽,并直接请求对应的 Redis 节点。


6. Redis Cluster 支持重新分配哈希槽吗?

是的,Redis Cluster 允许动态调整哈希槽分配,以支持扩容或缩容:

  • 增加新节点
    • 新增节点后,部分哈希槽会从已有 Master 迁移到新节点。
    • 使用 redis-cli --cluster reshard 进行槽位重新分配。
  • 删除节点
    • 删除节点时,节点上的哈希槽会迁移到其他节点。

哈希槽迁移过程:

  1. CLUSTER SETSLOT IMPORTING
  2. CLUSTER SETSLOT MIGRATING
  3. 数据同步
  4. 更新哈希槽信息

7. Redis Cluster 扩容/缩容期间可以提供服务吗?

可以!Redis Cluster 支持在线扩容/缩容,在数据迁移过程中仍然可以提供服务:

  1. 客户端访问时,可能会遇到 MOVED 重定向
    • 例如:客户端请求 Key 时,如果 Key 的哈希槽迁移到了新的节点,返回 MOVED <slot> <new-node-ip>,客户端会重新请求正确的节点。
  2. 数据在后台迁移,不影响正常读写
    • Redis Cluster 采用 渐进式迁移,不会一次性移动所有数据,而是逐步将哈希槽数据转移到新节点。

8. Redis Cluster 中的节点是如何通信的?

Redis Cluster 采用 Gossip 协议 进行节点间通信,保证集群状态一致:

  • PING:定期发送心跳检测其他节点的状态。
  • PONG:响应 PING,并附带本节点的状态信息。
  • MEET:新节点加入集群时,使用 MEET 命令。
  • FAIL:如果多数节点判定某个 Master 故障,则广播 FAIL 信息,触发故障转移。

每个 Redis Cluster 节点都维护整个集群的拓扑信息,即便某些节点故障,集群仍然可以继续运行。

9. Redis Cluster 缓存的数据量太大怎么办?

当 Redis Cluster 的数据量过大时,可以采取以下措施:

  • 水平扩展(增加节点):增加新的 Redis 节点,并重新分配哈希槽,使新节点分担数据存储压力。
  • 数据淘汰策略:使用 maxmemory-policy 进行数据淘汰,如 volatile-lruallkeys-lru 等。
  • 数据压缩:对于字符串、JSON 数据,可以使用 Snappy、Gzip 等方式进行压缩,减少存储占用。
  • 冷热数据分层:将热数据存入 Redis,冷数据存入 MySQL、MongoDB 等持久化存储中。
  • 使用 BigKey 拆分:避免存储大 key(如超大列表、集合、哈希),可以拆分为多个小 key 存储。

10. Redis Cluster 的基本架构

一个典型的 Redis Cluster 由多个 Redis 实例组成,每个实例可以是主节点(Master)或从节点(Slave):

  • 主节点(Master):负责存储数据并处理客户端请求,每个 Master 管理一部分哈希槽。
  • 从节点(Slave):作为 Master 的备份,提供高可用性,Master 宕机时从节点可自动提升为 Master。
  • 客户端(Client):连接 Redis Cluster,向不同的 Master 发送请求,并根据哈希槽计算数据存储位置。

Redis Cluster 默认使用 无中心化架构,每个节点既存储数据,又维护整个集群的元数据(比如槽位信息、其他节点状态等)。


总结

问题解答
为什么需要 Redis Cluster?解决单机存储、可用性、性能瓶颈问题。
Redis Cluster 如何分片?采用 16384 个哈希槽,通过 CRC16(Key) % 16384 计算槽位,并分布到不同节点。
为什么是 16384 个哈希槽?兼顾计算效率、负载均衡、扩展性和数据迁移成本。
Redis Cluster 能动态扩容吗?支持在线扩容/缩容,迁移期间不影响业务。
Redis Cluster 节点如何通信?采用 Gossip 协议,进行 PING/PONG 心跳检测,支持自动故障转移。
数据量太大怎么办?采用水平扩展、数据淘汰策略、数据压缩、冷热分层等优化方案。
基本架构?由多个 Master 节点和 Slave 节点组成,每个 Master 负责一部分哈希槽。

Redis Cluster 通过数据分片 + 无中心化架构 + 自动故障恢复,实现了高可用、可扩展的分布式 Redis! 🚀

扩展阅读

1. Redis Cluster 的哈希槽为什么是 16384?

Redis Cluster 采用 16384 个哈希槽(slot)来进行数据分片和管理,主要基于以下几个原因:

(1) 兼顾性能与灵活性
  • 太少的哈希槽:如果哈希槽数量太少,例如 1024,数据分布会很粗糙,负载均衡效果不佳。
  • 太多的哈希槽:如果哈希槽数量过多(如 10^6 级别),每次集群管理和迁移操作都会涉及大量计算,增加开销。

16384 是一个合理的折中方案,它既能保证数据分布的均衡性,又能在扩展和迁移时保持较低的计算和存储成本。

(2) CRC16 计算的高效性

Redis Cluster 采用 CRC16(循环冗余校验)算法计算哈希槽:

Slot = CRC16(Key) % 16384

CRC16 是一种高效的哈希计算方式,16384(2¹⁴)是 2 的幂,可以通过位运算高效计算哈希槽。

(3) 分片和迁移的平衡
  • 16384 个槽可以被

    多个 Master 节点

    平均分配。例如:

    • 3 个 Master:每个 Master 约管理 5461 个槽(16384 ÷ 3)。
    • 6 个 Master:每个 Master 约 2730 个槽(16384 ÷ 6)。
  • 这样,扩容和数据迁移时,不会造成太大的数据重分布,迁移成本较低。

(4) 兼容性

Redis Cluster 设计时考虑到 多个 Redis 实例部署在多个服务器上,16384 适用于不同规模的集群:

  • 小规模集群(3~6 个节点)→ 适量的槽可保证均衡分配。
  • 大规模集群(数十个节点)→ 16384 个槽依然可以较好地分片。

2. 什么是 Gossip 协议?

(1) Gossip 协议的基本概念

Gossip 协议是一种 去中心化的分布式通信协议,用于 节点之间同步信息,类似于“八卦传播”:

  • 每个节点只与部分其他节点通信,而不是全网广播。
  • 信息在多个通信轮次后,逐步传播到整个集群。

Redis Cluster 采用 Gossip 协议 来管理节点状态,保持集群的可用性。


(2) Redis Cluster 中的 Gossip 协议

在 Redis Cluster 中,每个节点都会定期向部分节点 发送状态信息,以此来同步集群状态,确保各个节点了解彼此的情况。

Gossip 协议中的几种消息
  1. PING:节点定期向其他节点发送 PING 消息,询问对方状态。
  2. PONG:收到 PING 后,节点返回 PONG 作为响应,并附带自己的状态信息。
  3. MEET:新节点加入集群时,使用 MEET 消息通知集群中的其他节点。
  4. FAIL:如果某个 Master 节点被大多数节点判定为不可用,整个集群会广播 FAIL 消息,触发故障转移。
示例

假设 Redis Cluster 有 6 个节点:

A  B  C  D  E  F
  • A 发送 PING 给 B 和 C。
  • B 发送 PING 给 D 和 E。
  • C 发送 PING 给 F 和 A。
  • 经过几轮传播后,所有节点都可以获取最新的集群状态。

(3) Gossip 协议的优点
  1. 去中心化:无中心服务器,避免单点故障。
  2. 高效传播:不像传统的全网广播,Gossip 只向部分节点发送信息,网络开销更小。
  3. 容错性强:即使部分节点故障,其他节点仍可继续传播信息,保证集群健康。

总结

问题解答
Redis Cluster 的哈希槽为什么是 16384?16384 是 2¹⁴,兼顾数据分片均衡、迁移效率、CRC16 计算高效性。
Gossip 协议是什么?一种去中心化的分布式通信协议,Redis Cluster 通过 Gossip 进行节点状态同步。
Gossip 协议在 Redis Cluster 中的作用?负责集群节点状态同步、故障检测(PING/PONG)、节点加入(MEET)、故障传播(FAIL)。

Gossip 让 Redis Cluster 实现了 去中心化管理、高效容错,结合 16384 哈希槽的设计,使得 Redis Cluster 既能 高效分片存储,又能 保证集群高可用

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

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

相关文章

Matlab概率区间预测全家桶更新了,新增光伏出力区间预测,4种分布可供预测

基本介绍 适用于matlab2020及以上。可任意选择置信区间&#xff0c;区间覆盖率picp、区间平均宽度百分比等等&#xff0c;可用于预测不确定性&#xff0c;效果如图所示&#xff0c;采用KDE&#xff0c;4种分布进行预测&#xff0c;有对比&#xff0c;可以替换成自己的数据。 …

C语言【文件操作】详解中(会使用fgetc,fputc,fgets,fputs,fscanf,fprintf,fread,fwrite函数)

引言 介绍和文件操作中文件的顺序读写相关的函数 看这篇博文前&#xff0c;希望您先仔细看一下这篇博文&#xff0c;理解一下文件指针和流的概念&#xff1a;C语言【文件操作】详解上-CSDN博客文章浏览阅读606次&#xff0c;点赞26次&#xff0c;收藏4次。先整体认识一下文件是…

深入剖析Java虚拟机(JVM):从零开始掌握Java核心引擎

&#x1f4cc; 引言&#xff1a;为什么每个Java开发者都要懂JVM&#xff1f; 想象你是一名赛车手&#xff0c;Java是你的赛车&#xff0c;而JVM就是赛车的引擎。 虽然你可以不关心引擎内部构造就能开车&#xff0c;但要想在比赛中获胜&#xff0c;必须了解引擎如何工作&#…

鸿蒙harmonyOS笔记:练习CheckBoxGroup获取选中的值

除了视觉效果实现全选和反选以外&#xff0c;咱们经常需要获取选中的值&#xff0c;接下来看看如何实现。 核心步骤&#xff1a; 1. 给 CheckBoxGroup 注册 onChange。 2. CheckBox 添加 name 属性。 3. 在 onChange 的回调函数中获取 选中的 name 属性。 事件&#xff1a…

通俗易懂搞懂@RequestParam 和 @RequestBody

&#x1f4cc; 博主简介: &#x1f4bb; 努力学习的 23 级科班生一枚 &#x1f680;&#x1f3e0; 博主主页 &#xff1a; &#x1f4ce; 灰阳阳&#x1f4da; 往期回顾 &#xff1a;Session和Cookie我不允许你不懂&#x1f4ac; 每日一言&#xff1a; 「流水不争先&#xff0c…

Flink 内存管理

一、内存模型 上图是一个 Flink 程序进程总体的内存模型,其包含 Flink 使用内存、JVM 元空间以及 JVM 开销。 Flink 使用了堆上内存和堆外内存;框架内存使用了堆上内存和堆外内存的直接内存;Task 使用堆上内存和堆外内存的直接内存;管理内存、JVM 元空间以及 JVM 内存开销使…

【工具变量】中国各地级市是否属于“信息惠民国家试点城市”匹配数据(2010-2024年)

数据来源&#xff1a;国家等12部门联合发布的《关于加快实施信息惠民工程有关工作的通知》 数据说明&#xff1a;内含原始文件和匹配结果&#xff0c;当试点城市在2014年及以后&#xff0c;赋值为1&#xff1b;试点城市在2014年之前或该城市从未实施信息惠民试点工程&#x…

git的底层原理

git的底层原理 三段话总结git&#xff0c; 1. 工作原理&#xff1a;git管理是一个DAG有向无环图&#xff0c;HEAD指针指向branch或直接指向commit&#xff0c;branch指向commit&#xff0c;commit指向tree&#xff0c;tree指向别的tree或直接指向blob。 2. git所管理的一个目录…

安装React开发者工具

我们在说组件之前&#xff0c;需要先安装一下React官方推出的开发者工具&#xff0c;首先我们分享在线安装方式 首先打开谷歌网上应用商店(针对谷歌浏览器)&#xff0c;在输入框内搜索react&#xff0c;安装如下插件&#xff1a; 注意安装提供方为Facebook的插件&#xff0c;这…

排列与二进制

#include<iostream> using namespace std; int count_two(int n,int m){int count0;for(int i0;i<m;i){ //统计2的因子个数 int numn-i;while(num%20){count;num /2;}}return count; } int main(){int n,m;while(1){cin >> n >> m;if(n0 && m0)br…

鱼书--学习2

6. 与学习相关的技巧 6.1 参数的更新 &#xff08;1&#xff09; SGD的缺点&#xff1a;SGD低效的根本原因是&#xff0c;梯度的方向并没有指向最小值的方向 基于SGD的最优化的更新路径&#xff1a;呈“之”字形朝最小值(0, 0)移动&#xff0c;效率低 &#xff08;2&#x…

基于SSM框架的汽车租赁平台(源码+lw+部署文档+讲解),源码可白嫖!

摘要 时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;汽车租赁平台当然不能排除在外。汽车租赁平台是在实际应用和软件工程的开发原理之上&#xff0c;运用Java语言以及SSM框架进行开发&#x…

LangChain Chat Model学习笔记

Prompt templates: Few shot、Example selector 一、Few shot(少量示例) 创建少量示例的格式化程序 创建一个简单的提示模板&#xff0c;用于在生成时向模型提供示例输入和输出。向LLM提供少量这样的示例被称为少量示例&#xff0c;这是一种简单但强大的指导生成的方式&…

新配置了一台服务器+域名共178:整个安装步骤,恢复服务

买了一台服务器域名eesou.com&#xff1a; 服务器选的是99元最低配的&#xff0c;用免费的镜像&#xff1a;宝塔面板 eesou.com是一口价买的 79&#xff0c;原来wjsou.com卖了。 原来的配置全丢了。开始重新安装步骤。 域名备案才能用&#xff0c;提交就等着了 服务器配置 …

Netty——BIO、NIO 与 Netty

文章目录 1. 介绍1.1 BIO1.1.1 概念1.1.2 工作原理1.1.3 优缺点 1.2 NIO1.2.1 概念1.2.2 工作原理1.2.3 优缺点 1.3 Netty1.3.1 概念1.3.2 工作原理1.3.3 优点 2. Netty 与 Java NIO 的区别2.1 抽象层次2.2 API 易用性2.3 性能优化2.4 功能扩展性2.5 线程模型2.6 适用场景 3. 总…

我的uniapp自定义模板

uniapp自定义模板 如有纰漏请谅解&#xff0c;以官方文档为准后面这段时间我会学习小程序开发的知识&#xff0c;会持续更新可以查看我的github&#xff0c;后续我会上传我的uniapp相关练习代码有兴趣的话可以浏览我的个人网站&#xff0c;我会在上面持续更新内容&#xff0c;…

Wispr Flow,AI语言转文字工具

Wispr Flow是什么 Wispr Flow 是AI语音转文本工具&#xff0c;基于先进的AI技术&#xff0c;帮助用户在任何应用程序中实现快速语音转文字。 Wispr Flow支持100多种语言&#xff0c;具备自动编辑、上下文感知和低音量识别等功能&#xff0c;大幅提升写作和沟通效率。Wispr Fl…

美国国家数据浮标中心(NDBC)

No.大剑师精品GIS教程推荐0地图渲染基础- 【WebGL 教程】 - 【Canvas 教程】 - 【SVG 教程】 1Openlayers 【入门教程】 - 【源代码示例 300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3MapboxGL【入门教程】 - 【源代码图文示例150】 4Cesium 【入门教程】…

浔川社团官方联合会维权成功

在2025.3.2日&#xff0c;我社团检测文章侵权中&#xff0c;检测出3篇文章疑似遭侵权&#xff0c;随后&#xff0c;总社团联合会立即联系CSDN版权&#xff0c;经过17天的维权&#xff0c;至今日晚&#xff0c;我社团维权成功&#xff01;侵权文章全部被设置为转载。 在此&…

linux中如何修改文件的权限和拥有者所属组

目录标题 chmod指令八进制形式权限修改文件拥有者所属组的修改umask有关内容 chmod指令 chmod指令可以用来修改人员的权限其形式如下&#xff1a; u代表的是拥有者&#xff0c;g代表的是所属组&#xff0c;o代表的是其他人&#xff0c;a表示所有人&#xff0c;如果你想增加权…