【redis】分片方案

Redis分片(Sharding)是解决单机性能瓶颈的核心技术,其本质是将数据分散存储到多个Redis节点(实例)中,每个实例将只是所有键的一个子集,通过水平扩展提升系统容量和性能。

分片的核心价值

  • 性能提升
    存储扩展:突破单机内存限制,支持TB级数据存储。
    计算并行化:多节点同时处理请求,提高吞吐量(如电商大促场景下,分片集群可承载百万级QPS)。

  • 高可用性
    故障隔离:单节点故障仅影响其管理的槽,其他节点正常服务。
    主从复制:每个主节点可配置从节点,主节点宕机时从节点自动接管槽。

  • 资源优化
    冷热数据分离:高频访问数据可分配至SSD节点,低频数据存机械硬盘,降低成本。
    负载均衡:哈希槽机制确保数据均匀分布,避免“热点”问题。

分片的实现方式

按照分片的计算逻辑由谁来执行,可以分为以下几种实现方式:

  1. 客户端分片:由客户端直接计算键的槽编号,并连接对应节点。例如,使用一致性哈希算法或直接取模分配节点。

    • 优点:实现简单,无需中间代理。
    • 缺点:节点变更时需手动调整客户端逻辑,运维复杂度高。
  2. 代理分片:通过中间代理(如Twemproxy)转发请求,客户端不感知节点信息。代理根据分片规则将请求路由到目标节点。

    • 优点:客户端无需关心分片细节。
    • 缺点:代理层可能成为性能瓶颈。
  3. 服务端分片(Redis Cluster):Redis官方集群模式,节点间通过Gossip协议同步槽分配信息。客户端可连接任意节点,若请求的键不属于当前节点,服务端会返回重定向指令。

    • 特点:支持自动故障转移、数据迁移,是生产环境首选方案。

查询路由:可发送你的查询到一个随机实例,该实例会保证转发你的查询到正确节点。

Redis集群在客户端的帮助下,实现了查询路由的一种混合形式,请求不是直接从Redis实例转发到另一个,而是客户端收到重定向到正确的节点。

分片的算法

范围分区

范围分区也叫顺序分区,最简单的分区方式。通过映射对象的范围到指定的Redis实例来完成分片。

假设用户ID的范围为1100,从133进入实例Redis1,3466进入Redis2,67100进入Redis3。

范围分区增加一个节点需要迁移大部分数据:

优点

  • 支持高效的范围查询:同一范围分区内的范围查询不需要跨节点,提升查询速度。
  • 支持批量操作:支持同一范围分区内的批量操作如事务、pipeline、lua脚本等
  • 实现简单直观:分区规则逻辑清晰,开发人员易于理解和维护。

缺点

  • 数据分散度易倾斜:若分区键范围设计不合理,可能导致部分分区数据量过大
  • 分区键选择受限:范围分区要求分区键为数值型或可排序字段(如时间、ID)
  • 维护范围映射表:需额外存储和管理分区范围与节点的映射关系,增加系统复杂性
  • 数据迁移成本:调整分区范围时,需迁移大部分数据

哈希取余分区

哈希取余分区是分布式缓存中常用的数据分片策略,其核心原理是通过哈希函数和取模运算将数据均匀分布到多个节点。

对每个键(Key)使用哈希函数(如CRC16、MD5)计算哈希值,再对Redis节点总数取余,公式为:

目标节点 = hash(key) % 节点数量  

例如,3个节点的集群中,键user:100的哈希值为93024922,则93024922 % 3 = 1,该键会被分配到第2个节点(编号从 0开始)。

添加一个节点:

翻倍扩容

优点

  • 实现简单高效:仅需哈希函数和取模运算即可完成数据分布,适合快速搭建小型分布式系统。
  • 负载均衡:数据均匀分布到所有节点,每个节点处理固定比例的请求,避免单点过载。

缺点:扩容/缩容成本高,节点数量变化时,取模分母改变,导致所有数据需重新计算映射关系并迁移,引发全量数据洗牌。从 3节点扩容至4节点时,hash(key) % 3变为hash(key) % 4,75%的数据需迁移。虽然翻倍扩容可以相对减少迁移量,但是翻倍所需的成本太大。

一致性哈希分区

一致性哈希分区是一种用于分布式系统的数据分片技术,旨在解决节点动态变化时数据迁移开销大的问题。

设计如下:

  1. 设计哈希函数Hash(key),要求取值范围为[0, 2^32-1],将这个取值范围的数字头尾相连,想象成一个闭合环形,各哈希值在Hash环上的分布:时钟12点位置为0,按顺时针方向递增,临近12点的左侧位置为2^32-1。

  2. 将Redis节点映射至哈希环,如图哈希环上的绿球所示,三个节点Redis0、Redis1、Redis2,可以通过其IP地址或机器名,经过同一个Hash函数计算的结果,映射到哈希环上。

  3. 将key映射于哈希环,如图哈希环上的黄球所示,三个keyuser:100user:120user:150经过同一个Hash()计算的结果,映射到哈希环上。

  4. 将key映射至Redis节点,在对象和节点都映射至同一个哈希环之后,要确定某个对象映射至哪个节点,只需从该对象开始,沿着哈希环顺时针方向查找,找到的第一个节点,即是。

增加节点:服务器扩容时增加节点,比如要在Redis1和Redis2之间增加节点Redis3,只会影响欲新增节点Redis3与上一个(顺时针为前进方向)节点Redis1之间的对象,也就是user:300,这些对象的映射关系,按照上面的规则,调整映射至新增的节点Redis3,其他对象的映射关系,都无需调整。

优点

  • 动态扩展友好:增减节点仅影响相邻节点,迁移量减少至约1/N(N为节点数)。

缺点

  • 数据倾斜风险:节点较少时分布不均。
  • 数据丢失风险:欲新增节点与上一个节点之间的数据不可命中,丢失

虚拟一致性哈希分区

对于前面的方案,节点数越少,越容易出现节点在哈希环上的分布不均匀,导致各节点映射的对象数量严重不均衡(数据倾斜);相反,节点数越多越密集,数据在哈希环上的分布就越均匀。

但实际部署的物理节点有限,我们可以用有限的物理节点,虚拟出足够多的虚拟节点(Virtual Node),最终达到数据在哈希环上均匀分布的效果,如下图,实际只部署了3个节点Redis0、Redis1、Redis2,把每个节点都复制成2倍,结果看上去是部署了6个节点。

虚拟一致性哈希分区增加一个节点:

可以想象,当虚拟节点个数达到2^32时,就达到绝对的均匀,通常可取复制倍数为32或更高。

优点

  • 负载均衡优化:虚拟节点分散物理节点压力,减少数据倾斜。
  • 异构节点适配:根据节点性能差异分配不同数量的虚拟节点。

缺点

  • 管理复杂度高:需维护虚拟节点与物理节点的映射关系。
  • 迁移成本上升:节点变动需调整多个虚拟节点,操作复杂。

虚拟槽分区(Redis Cluster方案)

虚拟槽分区(Virtual Slot Partitioning)是Redis Cluster设计的核心分片机制,旨在解决分布式系统中数据分片、负载均衡和高可用性问题。其核心思想是将整个数据空间划分为固定数量的逻辑槽(Slot),通过动态分配槽到物理节点的方式实现数据分布。

虚拟槽分区是对一致性哈希分区进行的改造,虚拟槽中的槽就是大量的虚拟节点的抽象化,将原来的虚拟节点变成一个槽,槽的范围是0~16383,redis内置是有16384个槽也就是有16384个虚拟节点。

虚拟槽分区巧妙地使用了哈希空间,使用分散度良好的哈希函数把所有数据映射到一个固定范围的整数集合中,这个整数定义为槽(slot),这个范围一般远远大于节点数。

假设当前集群有3个节点,每个节点平均大约负责5461个槽,所有的键根据哈希函数映射到0~16383整数槽内,计算公式:slot = CRC16(key)& 16383。每一个节点负责维护一部分槽以及槽所映射的键值数据,如下图所示:

slot = CRC16(key)& 16383其实就是slot = CRC16(key)% 16384,一个数跟2^N取模的结果等于它与2^N-1按位与的结果。

在虚拟槽分区中扩展一个节点(扩容)时,需通过槽迁移将部分槽从现有节点转移到新节点,实现数据重新分布和负载均衡。

优点

  • 动态扩缩容平滑:仅迁移受影响槽的数据,迁移量可控(如删除节点时仅重分配其槽)。当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了,当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了。
  • 解耦数据与节点之间的直接关系:槽作为中间层,支持灵活调整节点与槽的映射关系。一致性hash分片需要映射key和节点的关系, 但是使用hash槽计算方式是CRC16(key) % 槽的个数, 所以就解耦了数据和节点的关系
  • 节点自身维护槽的映射关系, 不需要客户端和代理服务器进行维护处理

缺点

  • 实现复杂:需集群协议维护槽与节点状态,客户端需支持重定向逻辑。
  • 功能限制:跨槽事务、多键操作受限。

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

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

相关文章

RGB矩阵照明系统详解及WS2812配置指南

RGB矩阵照明系统详解及WS2812配置指南 一、RGB矩阵照明简介 RGB矩阵照明是一种强大的功能,允许使用外部驱动器驱动的RGB LED矩阵为键盘增添绚丽的灯光效果。该系统与RGBLIGHT功能无缝集成,因此您可以使用与RGBLIGHT相同的键码来控制它,操作…

[250509] x-cmd 发布 v0.5.11 beta:x ping 优化、AI 模型新增支持和语言变量调整

目录 X-CMD 发布 v0.5.11 beta📃Changelog🧩 ping🧩 openai🧩 gemini🧩 asdf🧩 mac✅ 升级指南 X-CMD 发布 v0.5.11 beta 📃Changelog 🧩 ping 调整 x ping 默认参数为 bing.com&a…

嵌入式开发学习日志Day17

第十一章 结构体与共用体 一、结构体 1、结构体 一般形式 【struct 标识符】 结构体中的标识符一般首字母大写; 【.】结构体成员运算符; 优先级 1 级 结合方向:从左至右; 【->】:指向结构体成员运算符&#x…

发那科机器人5(异常事件和程序备份加载+ROBOGUIDE离线仿真)

发那科机器人5(异常事件和程序备份加载+ROBOGUIDE离线仿真) 一,异常事件和程序备份加载1,常见异常事件2,零点复归介绍3,程序备份-加载(未整理)二,`ROBOGUIDE`离线仿真1,仿真软件简介及安装步骤(未整理)2,机器人==导入与工具==与==工件添加==2.1,机器人导入(未整…

青少年编程与数学 02-019 Rust 编程基础 01课题、环境准备

青少年编程与数学 02-019 Rust 编程基础 01课题、环境准备 一、Rust核心特性应用场景开发工具社区与生态 二、Rust 和 Python 比较1. **内存安全与并发编程**2. **性能**3. **零成本抽象**4. **跨平台支持**5. **社区与生态系统**6. **错误处理**7. **安全性**适用场景总结 三、…

Java反射 八股版

目录 一、核心概念阐释 1. Class类 2. Constructor类 3. Method类 4. Field类 二、典型应用场景 1. 框架开发 2. 单元测试 3. JSON序列化/反序列化 三、性能考量 四、安全与访问控制 1. 安全管理器限制 2. 打破封装性 3. 安全风险 五、版本兼容性问题 六、最佳…

操作系统的初步了解

目录 引言:什么是操作系统? 一、设计操作系统的目的 二、操作系统是做什么的: 操作系统主要有四大核心任务: 1. 管理硬件 2. 运行软件 3. 存储数据 4. 提供用户界面 如何理解操作系统的管理呢? 1. 什么是操作…

Mkdocs页面如何嵌入PDF

嵌入PDF 嵌入PDF代码 &#xff0c;注意PDF的相对地址 <iframe src"../个人简历.pdf (相对地址)" width"100%" height"800px" style"border: 1px solid #ccc; overflow: auto;"></iframe>我的完整代码&#xff1a; <d…

链表结构深度解析:从单向无头到双向循环的实现全指南

上篇博客实现动态顺序表时&#xff0c;我们会发现它存在许多弊端&#xff0c;如&#xff1a; • 中间/头部的插⼊删除&#xff0c;时间复杂度为O(N) • 增容需要申请新空间&#xff0c;拷⻉数据&#xff0c;释放旧空间。会有不⼩的消耗。 • 增容⼀般是呈2倍的增⻓&#xff0c;…

@PostConstruct @PreDestroy

PostConstruct 是 Java EE&#xff08;现 Jakarta EE&#xff09;中的一个注解&#xff0c;用于标记一个方法在对象初始化完成后立即执行。它在 Spring 框架、Java Web 应用等场景中广泛使用&#xff0c;主要用于资源初始化、依赖注入完成后的配置等操作。 1. 基本作用 执行时…

【ArcGIS微课1000例】0146:将多个文件夹下的影像移动到一个目标文件夹(以Landscan数据为例)

本文讲述将多个文件夹下的影像移动到一个目标文件夹,便于投影变换、裁剪等操作。 文章目录 一、数据准备二、解压操作三、批量移动四、查看效果五、ArcGIS操作一、数据准备 全球人口数据集Landscan2000-2023如下所示,每年数据位一个压缩包: 二、解压操作 首先将其解压,方…

专业级 GIF 制作工具深度解析:Gifski 与 GIPHY CAPTURE 的技术对比与实战指南

《Gifski 与 GIPHY CAPTURE&#xff1a;GIF 制作工具的深度对比与实战应用》 最近在尝试做一些培训文档&#xff0c;需要使用GIF图做动态效果&#xff0c;把工具选型过程给大家做一下分享。 先看一张对比表&#xff0c;具体如下&#xff1a; 场景 Windows macOS Linux 移…

selenium替代----playwright

安装 好处特点&#xff1a;这个东西不像selenium需要固定版本的驱动 pip config set global.index-url https://mirrors.aliyun.com/pypi/simplepip install --upgrade pippip install playwright playwright installplaywright install ffmpeg (处理音视频的)验证&#x…

Python代码编程基础

字符串 str.[]实现根据下标定位实现对元素的截取 for 循环可以实现遍历 while 循环可以在实现遍历的同时实现对某一下标数值的修改 字符串前加 r 可以实现对字符串的完整内容输出 字符串前加 f 可以实现对字符串内{}中包裹内容的格式化输出&#xff0c;仅在 v3.6 之后可用…

5月9号.

v-for: v-bind: v-if&v-show: v-model: v-on: Ajax: Axios: async&await: Vue生命周期: Maven: Maven坐标:

Spring 必会之微服务篇(1)

目录 引入 单体架构 集群和分布式架构 微服务架构 挑战 Spring Cloud 介绍 实现方案 Spring Cloud Alibaba 引入 单体架构 当我们刚开始学开发的时候&#xff0c;基本都是单体架构&#xff0c;就是把一个项目的所有业务的实现功能都打包在一个 war 包或者 Jar 包中。…

计算机的基本组成

#灵感# 记录下基础知识&#xff0c;此处专指计算机硬件方面&#xff0c;捎带记下芯片知识。 综述&#xff1a; 计算机硬件的基本组成包括运算器、控制器、存储器、输入设备和输出设备五大部分。其中&#xff0c;集成在一起的运算器和控制器称为 CPU&#xff08;处理器&#x…

【Python 列表(List)】

Python 中的列表&#xff08;List&#xff09;是最常用、最灵活的有序数据集合&#xff0c;支持动态增删改查操作。以下是列表的核心知识点&#xff1a; 一、基础特性 有序性&#xff1a;元素按插入顺序存储可变性&#xff1a;支持增删改操作允许重复&#xff1a;可存储重复元…

Qt 的原理及使用(1)——qt的背景及安装

1. Qt 背景介绍 1.1 什么是 Qt Qt 是⼀个 跨平台的 C 图形⽤⼾界⾯应⽤程序框架 。它为应⽤程序开发者提供了建⽴艺术级图形 界⾯所需的所有功能。它是完全⾯向对象的&#xff0c;很容易扩展。Qt 为开发者提供了⼀种基于组件的开发模 式&#xff0c;开发者可以通过简单的拖拽…

多分类问题softmax传递函数+交叉熵损失

在多分类问题中&#xff0c;Softmax 函数通常与交叉熵损失函数结合使用。 Softmax 函数 Softmax 函数是一种常用的激活函数&#xff0c;主要用于多分类问题中。它将一个实数向量转换为概率分布&#xff0c;使得每个元素的值在 0 到 1 之间&#xff0c;且所有元素的和为 1。 …