Redis 集群 - 数据分片算法

news2024/11/17 15:48:43

前言

        广义的集群:只要是多个机器构成了一个分布式系统,都可以被称为集群。

        狭义的集群:redis 的集群模式,这个集群模式下,主要是解决存储空间不足的问题。

Redis 集群

        redis 采用主从结构,可以提高系统的可用性,但是并不能解决存储空间不足的问题,因为主节点和从节点存储的都是全量数据,随着业务功能的逐步使用,存储数据的逐步增加,redis 由于内存的限制肯定会在某一时刻到达极限,无法存储过多的数据。

        我们要如何解决 redis 存储空间不足的问题呢?加机器即可!所谓 "⼤数据" 的核⼼, 其实就是⼀台机器搞不定了,⽤多台机器来搞,Redis 集群就是在上述的思路之下,引⼊多组 Master / Slave , 每⼀组 Master / Slave 存储数据全集的 ⼀部分, 从⽽构成⼀个更⼤的整体, 称为 Redis 集群。

        假定整个数据全集是 1 TB, 引⼊三组 Master / Slave 来存储. 那么每⼀组机器只需要存储整个 数据全集的 1/3 即可.

在上述图中

        • Master1 和 Slave11 和 Slave12 保存的是同样的数据.占总数据的 1/3

        • Master2 和 Slave21 和 Slave2 保存的是同样的数据.占总数据的 1/3

        • Master3 和 Slave31 和 Slave32 保存的是同样的数据.占总数据的 1/3

这三组机器存储的数据都是不同的.

        每个 Slave 都是对应 Master 的备份(当 Master 挂了, 对应的 Slave 会补位成 Master).每个红框部分都可以称为是⼀个 分⽚ (Sharding).如果全量数据进⼀步增加, 只要再增加更多的分⽚,即可解决.

数据分片算法

        Redis cluster 的核⼼思路是⽤多组机器来存数据的每个部分.那么接下来的核⼼问题就是,给定⼀个数据(⼀个具体的 key), 那么这个数据应该存储在哪个分⽚上?读取的时候⼜应该去哪个分⽚读取?

围绕这个问题,业界有三种⽐较主流的实现⽅式.

哈希求余

        借鉴了哈希表的基本思想,借助 hash 函数,将数据的 key 映射成整数,再针对分片片数求余,得到了一个下标,就可以把数据保存到该下标对应的分片上了,

ps:MD5 就是一个普遍用来将字符串映射成整数的哈希函数

        比如现在我们拥有 3 片 redis 分片,此时来了一个字符串,字符串映射为整数是 10,那么就需要将该数据保存到 10%3=1 号分片上,后续要获取该 key 所对应的数值时,也用同样的方法获取分片编号,再去编号对应的 redis 分片上获取数据即可。

优缺点

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

        缺点不方便扩容,⼀旦需要进⾏扩容, N (分片数)改变了,原有的映射规则被破坏,就需要让节点之间的数据相互传输,重新排列,以满⾜新的映射规则.此时需要搬运的数据量是⽐较多的,开销较⼤.

        ps:分片数改变以后,计算哪个数据保存到哪个分片的公式就改变了,按照新的公式,此时许多分片中现有的数据都在错误的位置,就要进行大批量的数据移动,这是非常消耗资源的行为。

用一个例子来直观的看待这个问题:

        如下图,N 为 3 的时候, [100, 120] 这 21 个 hash 值的分布 (此处假定计算出的 hash 值是⼀个简单的整数,⽅便⾁眼观察)

        当引⼊⼀个新的分⽚, N 从 3 => 4 时, ⼤量的 key 都需要重新映射.(某个key % 3 和 % 4 的结果不⼀样,就映射到不同机器上了).

        如上图可以看到,整个扩容⼀共 21 个 key, 只有 3 个 key 没有经过搬运,其他的 key 都是搬运过的,很显然搬运数据是个非常庞大的工程

⼀致性哈希算法

        为了降低上述的搬运开销,能够更⾼效扩容,业界提出了"⼀致性哈希算法". key 映射到分⽚序号的过程不再是简单求余了,⽽是改成以下过程:

第⼀步,把 0 -> 2^32-1 这个数据空间, 映射到⼀个圆环上.数据按照顺时针⽅向增⻓.

第⼆步,假设当前存在三个分⽚,就把分⽚放到圆环的某个位置上.

第三步,假定有⼀个 key, 计算得到 hash 值 H, 那么这个 key 映射到哪个分⽚呢? 规则很简单, 就是从 H 所在位置,顺时针往下找,找到的第⼀个分⽚,即为该 key 所从属的分⽚.

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

        在这个情况下, 如果扩容⼀个分⽚, 如何处理呢? 原有分⽚在环上的位置不动, 只要在环上新安排⼀个分⽚位置即可.

        此时,只需要把 0 号分片上的部分数据,搬运给 3 号分⽚即可.1 号分⽚和 2 号分⽚管理的区间都是不变的.

        但可以明显看出,我们只是减少了 0 号分片的压力,1 号分片和 2 号分片中存储的数据多于 0 号和 3 号分片。所以该方法存在数据分配不均匀的问题

优缺点

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

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

哈希槽分区算法(Redis 使用)

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

获取哈希槽编号

hash_slot = crc16(key) % 16384

其中 crc16 也是⼀种 hash 算法.

        相当于是把整个哈希值, 映射到 16384 个槽位上,也就是 [0, 16383].然后再把这些槽位⽐较均匀的分配给每个分片.每个分⽚的节点都需要记录⾃⼰持有哪些哈希槽

        假设当前有三个分⽚,⼀种可能的分配⽅式:

         • 0 号分⽚: [0, 5461], 共 5462 个槽位

        • 1 号分⽚: [5462, 10923], 共 5462 个槽位

        • 2 号分⽚: [10924,16383],共 5460 个槽位

        这⾥的分⽚规则是很灵活的.每个分⽚持有的槽位也不⼀定连续.每个分⽚的节点使⽤位图来表⽰⾃⼰持有哪些槽位.对于 16384 个槽位来说,需要 2048 个字节(2KB) ⼤⼩的内存空间表⽰.

        ⼀种可能的分配⽅式:

        • 0 号分⽚: [0,4095],共 4096 个槽位

        • 1 号分⽚:[5462,9557], 共 4096 个槽位

        • 2 号分⽚: [10924, 15019], 共 4096 个槽位

        • 3 号分⽚: [4096, 5461] + [9558, 10923] + [15019, 16383],共 4096 个槽位

        我们在实际使⽤ Redis 集群分⽚的时候, 不需要⼿动指定哪些槽位分配给某个分⽚,只需要告 诉某个分⽚应该持有多少个槽位即可,Redis 会⾃动完成后续的槽位分配, 以及对应的 key 搬运的⼯作.

此处还有两个问题:

问题⼀: Redis 集群是最多有 16384 个分⽚吗?

        并⾮如此. 如果⼀个分⽚只有⼀个槽位, 这对于集群的数据均匀其实是难以保证的. 实际上 Redis 的作者建议集群分⽚数不应该超过 1000

        ⽽且, 16000 这么⼤规模的集群, 本⾝的可⽤性也是⼀个⼤问题.⼀个系统越复杂,出现故障的概率是越⾼的.

问题⼆:为什么是 16384 个槽位?

        • 节点之间通过⼼跳包通信.⼼跳包中包含了该节点持有哪些 slots.这个是使⽤位图这样的数据结构 表⽰的.表⽰ 16384 (16k) 个 slots,需要的位图⼤⼩是 2KB. 如果给定的 slots 数更多了,⽐如 65536 个了,此时就需要消耗更多的空间,8 KB 位图表⽰了. 8 KB,对于内存来说不算什么,但是在频繁的⽹络⼼跳包中,还是⼀个不⼩的开销的

        • 另⼀⽅⾯, Redis 集群⼀般不建议超过 1000 个分⽚.所以 16k 对于最⼤ 1000 个分⽚来说是⾜够⽤ 的,同时也会使对应的槽位配置位图体积不⾄于很⼤.

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

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

相关文章

ABAP 搜索帮助F4IF_INT_TABLE_VALUE_REQUEST

F4IF_INT_TABLE_VALUE_REQUEST 一般用于在选择屏幕提供搜索帮助 可以看到设置的是物料与物料描述的对应关系,而且对话类型是立即显示值,所以才能够实现如上的效果 有两种搜索帮助,这里选择基本索引帮助即可 然后填上对应的文本表和字段即可 然后在选…

【非常实验】Android模拟x86_64系统——安装Alpine虚拟机

安卓是一款功能强大的操作系统,为什么不试试它的极限呢? 百无聊赖中,我发现了各种 Android 修补项目。这激起了我对 DevOps 的好奇心,促使我探索在该平台上运行容器。这种好奇心又把我带入了另一个兔子洞:在 Android 上运行虚拟机。这其中经历了许多曲折,也许以后有必要…

cs144 LAB1 基于滑动窗口的碎片字节流重组器

一.StreamReassembler.capacity 的意义 StreamReassembler._capacity 的含义: ByteStream 的空间上限是 capacityStreamReassembler 用于暂存未重组字符串片段的缓冲区空间 StreamReassembler.buffer 上限也是 capacity蓝色部分代表了已经被上层应用读取的已重组数…

计算机专业毕设-springboot论坛系统

1 项目介绍 基于SSM的论坛网站:后端 SpringBoot、Mybatis,前端thymeleaf,具体功能如下: 基本功能:登录注册、修改个人信息、修改密码、修改头像查看帖子列表:按热度排序、按更新时间排序、查看周榜月榜查…

棱镜七彩荣获CNNVD两项大奖,专业能力与贡献再获认可!

6月18日,国家信息安全漏洞库(CNNVD)2023年度工作总结暨优秀表彰大会在中国信息安全测评中心成功举办。棱镜七彩凭借在漏洞方面的突出贡献和出色表现,被授予“2023年度优秀技术支撑单位”与“2023年度最佳新秀奖”。 优秀技术支撑单…

Gobject tutorial 七

The GObject base class GObject是一个fundamental classed instantiatable type,它的功能如下: 内存管理构建/销毁实例set/get属性方法信号 /*** GObjectClass:* g_type_class: the parent class* constructor: the constructor function is called by g_object…

最新技术:跨境电商源码,应对多国市场需求,让您轻松开展全球业务!

随着全球化进程的不断推进,跨境电商已成为企业拓展国际市场的重要途径。为了满足不同国家和地区消费者不断增长的需求,跨境电商源码应运而生,为企业提供了便捷高效的全球化业务发展方案。 一、全球化运营的关键 跨境电商源码的核心功能在于…

极具吸引力的小程序 UI 风格

极具吸引力的小程序 UI 风格

小白速成AI大模型就看这份资源包

前言 在数字化浪潮席卷全球的今天,人工智能(AI)技术已成为推动社会进步的重要引擎。尤其是AI大模型,以其强大的数据处理能力和广泛的应用前景,吸引了无数人的目光。然而,对于初学者“小白”来说&#xff0…

ProtoBuf序列化协议简介

首先,常见的序列化方法主要有以下几种: TLV编码及其变体(tag, length, value): 比如ProtoBuf。文本流编码:XML/JSON固定结构编码:基本原理是,协议约定了传输字段类型和字段含义,和TLV类似&…

MyBatis框架基础

文章目录 1 MyBatis概述2 MyBatis入门2.1 相关依赖2.2 properties配置文件2.3 预编译SQL 3 基本操作3.1 新增操作3.2 删除操作3.3 更新操作3.4 查询操作 4 动态SQL4.1 XML映射文件4.2 if/set/where标签4.3 foreach标签4.4 sql/include标签 5 参考资料 1 MyBatis概述 MyBatis是…

入侵检测系统(IDS)

入侵检测 入侵检测(Intrusion Detection)是指发现或确定入侵行为存在或出现的动作,也就是发现、跟踪并记录计算机系统或计算机网络中的非授权行为,或发现并调查系统中可能为视图入侵或病毒感染所带来的异常活动。 入侵检测系统 …

XL5300 dTOF测距模块 加镜头后可达7.6米测距距离 ±4%测距精度

XL5300 直接飞行时间(dToF)传感器是一个整体方案dTOF 模组,应用设计简单。片内集成了单光子雪崩二极管(SPAD)接收阵列以及VCSEL激光发射器。利用自主研发的 SPAD 和独特的ToF 采集与处理技术,XL5300模块可实…

NV-Embed论文阅读笔记

这是NVIDIA的一篇论文,LLM通常使用的是GPT的decoder范式作为一个生成模型,文章探讨如何利用这样的decoder生成模型来实现BERT这样的encoder的功能,即提取有效的embedding。现有的方法提取embedding的方式无非是 1 mean pooling; 2…

无线领夹麦克风哪个牌子好用?一文揭秘哪种领夹麦性价比最高!

​无线领夹麦克风,无疑是现代音频技术的杰出代表。它摆脱了传统有线麦克风的束缚,让声音的传播更加自由、灵活。无论是追求极致音质的音乐爱好者,还是需要高效沟通的商务人士,无线领夹麦克风都能满足你的需求,让你的声…

HarmonyOS 角落里的知识 —— 状态管理

一、前言 在探索 HarmonyOS 的过程中,我们发现了许多有趣且实用的功能和特性。有些总是在不经意间或者触类旁通的找到。或者是某些开发痛点。其中,状态管理是ArkUI开发非常核心的一个东西,我们进行了大量的使用和测试遇到了许多奇奇怪怪的问…

AD层次原理图绘制

一、在原理图中添加端口 二、添加层次图 三、更新层次图 四、也可以先画层次图,再绘制原理图,这里就不做演示了

天地图 uniapp使用笔记

官网地址&#xff1a;天地图API 效果&#xff1a; <template><view><!-- 显示地图的DOM节点 --><view id"container" class"content"></view><!-- END --><!-- 数据显示 --><h3>城市名称(IP属地)&#x…

关于归一化能量与归一化功率(连续与离散+1)

前言&#xff1a; ① 周期信号 与 直流信号 都是功率信号 ②一个信号可以既不是能量信号也不是功率信号&#xff0c;但不可能既是能量信号又是功率信号 归一化能量 对于一个连续时间信号 ( x(t) )&#xff0c;归一化能量 ( E ) 的定义为&#xff1a; E lim ⁡ T → ∞ ∫ −…

某宝APP参数通过SDK把APP参数转URL参数链接方法

app里参数无法在电脑端或者在没有XX宝的手机里支付, 所以需要转成H5参数进行代付操作 出某xx宝 支付sdk转h5链接方式算法