当前位置: 首页 > news >正文

redis集群分片策略

核心概念:哈希槽(Hash Slot)

Redis 集群的分片策略并非基于一致性哈希,而是引入了一个名为 ​哈希槽(Hash Slot)​​ 的核心概念。这是理解整个机制的关键。

  1. 固定数量的槽​:Redis 集群将整个数据集划分为 ​16384​(2^14)个哈希槽。

  2. 数据映射到槽​:每个写入的键(Key)都会通过一个 CRC16 算法计算出一个哈希值,然后将这个哈希值对 16384 取模,得到的结果(0 到 16383 之间的一个数)就是这个键所属的哈希槽。

    • slot = CRC16(key) % 16384

  3. 槽分配给节点​:集群中的每个主节点(Master)负责处理一部分哈希槽。槽的分配信息(即哪个节点负责哪些槽)存储在每个节点中,并且会在集群中自动传播(使用 Gossip 协议),因此每个客户端都可以连接到任意节点并获取到最新的集群配置。


分片策略的工作原理

1. 键到槽的映射

当你执行 SET mykey myvalue时,集群会:

  1. 计算 mykey的哈希槽:CRC16("mykey") % 16384

  2. 根据本地的集群配置信息,判断这个槽由哪个节点负责。

  3. 如果该槽正好由当前连接的节点负责,则直接执行命令。

  4. 如果该槽由另一个节点负责,当前节点会向客户端返回一个 ​MOVED​ 错误重定向,并告知正确的节点地址。智能的 Redis 客户端(如 redis-cli -c)会自动根据这个重定向信息,将命令转发到正确的节点执行。

2. 哈希标签(Hash Tags)

默认的分片方式可能会导致那些本应存储在同一节点上的相关键(例如 user:1000:profileuser:1000:orders)被分散到不同的节点上,因为它们的键名不同。

为了解决这个问题,Redis 集群引入了 ​哈希标签(Hash Tags)​。你可以使用 {}来指定只计算括号内部分字符串的哈希值。

  • 没有哈希标签​:

    • user:1000:profile-> 计算 user:1000:profile的 CRC16

    • user:1000:orders-> 计算 user:1000:orders的 CRC16

    • 这两个键很可能被分配到不同的槽。

  • 使用哈希标签​:

    • user:{1000}:profile-> 计算 1000的 CRC16

    • user:{1000}:orders-> 计算 1000的 CRC16

    • 这两个键会被分配到同一个槽,从而保证存储在同一个节点上。这对于执行多键操作(如事务、Lua脚本)至关重要。


集群管理:重分片(Resharding)

Redis 集群最强大的特性之一就是在线重分片能力。你可以在集群正常运行、不停机的情况下,增加或移除节点,并重新分配哈希槽。

重分片过程:​

  1. 发起​:使用 redis-cli --cluster reshard命令工具发起重分片操作。

  2. 规划​:指定要从哪些源节点迁移槽,迁移到哪个目标节点,以及迁移多少槽。

  3. 迁移​:迁移过程是以为单位的。对于槽中的每个键:

    • 工具会向源节点和目标节点发送准备命令。

    • 源节点将指定键的数据序列化并发送给目标节点。

    • 目标节点接收并反序列化数据后,存储到本地。

    • 迁移完成后,工具会向源节点和目的节点发送确认命令。

  4. 更新配置​:将迁移的槽的所有权从源节点正式分配给目标节点。这个新的槽分配信息会通过 Gossip 协议传播到整个集群。

在迁移过程中,如果客户端访问一个已经被迁移走的键,源节点会先检查该键是否还存在本地。如果不存在,它会返回一个 ​ASK​ 重定向错误(与 MOVED 不同),引导客户端去目标节点临时获取数据。一旦迁移完成,所有请求都会通过 ​MOVED​ 重定向到新的目标节点。


与其他分片方案的对比

特性

Redis 原生集群 (哈希槽)

客户端分片 (如 ShardedJedis)

代理分片 (如 Twemproxy, Codis)

架构

去中心化(P2P),每个节点平等

在客户端库中实现逻辑

中心化代理,客户端连接代理

可扩展性

,支持在线平滑扩缩容

,扩缩容需停机、手动数据迁移

,扩缩容比客户端分片方便,但仍有开销

性能

,无代理层,直接通信

,无代理开销

,多一层网络跳转,有性能损耗

配置管理

自动 gossip 传播,客户端需支持重定向

配置在客户端,难以维护

代理层统一管理,客户端无感知

功能支持

不支持多键操作(除非在同槽)

依赖客户端实现

代理层可能屏蔽一些高级命令

复杂度

中等,需理解集群概念和运维工具

低(简单应用),高(运维复杂)

低(对客户端),高(维护代理层)

总结

Redis 集群采用基于 ​哈希槽​ 的分片策略,其核心优势在于:

  1. 易于管理和扩展​:16384 个固定槽简化了数据分布和节点管理。

  2. 在线重分片​:支持不停机地增加或移除节点,是实现高可用的基础。

  3. 高性能​:去中心化的设计避免了代理层的开销。

  4. 灵活性​:通过哈希标签可以控制相关键的分布,以支持必要的事务操作。

这种设计使得 Redis 集群成为一个成熟、稳定、高性能的分布式内存数据库解决方案。

http://www.dtcms.com/a/354394.html

相关文章:

  • 【温室气体数据集】NOAA CCGG 飞机观测温室气体
  • 2025年06月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • spring-cloud项目中gateway配置解析
  • DMA学习
  • 【0420】Postgres内核 smgr + md + vfd 实现为指定 table(CREATE TABLE)创建 disk file
  • 每日八股文8.27
  • Linux系统调优工具
  • [Sync_ai_vid] 数据处理流水线 | 配置管理系统
  • 【重学 MySQL】九十二、 MySQL8 密码强度评估与配置指南
  • mysql mvcc机制详解
  • 期权交易中的“道”:从《道德经》中汲取投资智慧
  • RHEL9部署MySQL数据库及数据库的基本使用(增删改查,数据备份恢复)
  • 基于SpringBoot的社区儿童疫苗接种预约系统设计与实现(代码+数据库+LW)
  • Vue将内容生成为二维码,并将所有二维码下载为图片,同时支持批量下载(下载为ZIP),含解决一次性生成过多时页面崩溃解决办法
  • 【雅思020】Opening a bank account
  • C语言二级考试环境配置教程【window篇】
  • 能源行业数据库远程运维安全合规实践:Web化平台的落地经验
  • 【系统分析师】高分论文:论快速应用开发方法及应用
  • Linux初始——基础指令篇
  • Libvio 访问异常排查指南​
  • List | 常见的List实现类(ArrayList、LinkedList、Vector)以及ArrayList源码解读
  • 【Redis】数据分片机制和集群机制
  • 8.28 模拟|双指针
  • 零基础-力扣100题从易到难详解(持续更新1-10题)
  • Windows 命令行:rmdir 命令
  • Qt 6 与 Qt 5 存在的兼容性差异
  • C# 数组C# 多维数组
  • QML(2) - Qt 中如何注册一个 C++ 类到 QML
  • MySQL的类split方法实现
  • Java表格处理详解以及结合实际项目使用