Redis 集群分片策略 hash tag 怎么配置避免倾斜?

文章导读
Redis 集群中配置 Hash Tag 避免倾斜的核心在于合理使用大括号{}。Hash Tag 强制将包含相同标签的键映射到同一槽,若所有键使用相同标签会导致数据集中单节点。避免倾斜需确保标签分散,避免全集群共用单一标签,同时结合业务逻辑将热点数据拆分。不应滥用 Hash Tag 导致槽分配不均,需监控槽分布情况,确保各节点负载均衡。对于必须聚合的数据才使用标签,普通数据应依靠默认哈希分布。
📋 目录
  1. | 数据分布优化:如何应对数据倾斜?
  2. Redis 数据倾斜
  3. Redis 数据倾斜?别慌!从成因到解决方案,一文帮你搞定
  4. FAQ
A A

Redis 集群中配置 Hash Tag 避免倾斜的核心在于合理使用大括号{}。Hash Tag 强制将包含相同标签的键映射到同一槽,若所有键使用相同标签会导致数据集中单节点。避免倾斜需确保标签分散,避免全集群共用单一标签,同时结合业务逻辑将热点数据拆分。不应滥用 Hash Tag 导致槽分配不均,需监控槽分布情况,确保各节点负载均衡。对于必须聚合的数据才使用标签,普通数据应依靠默认哈希分布。

| 数据分布优化:如何应对数据倾斜?

本文探讨了切片集群中数据倾斜的两种形式:数据量倾斜和数据访问倾斜,分析了其产生原因,如 bigkey、Slot 分配不均衡和 HashTag,并提供了应对策略,包括数据迁移和实例资源调整。在切片集群中,数据会按照一定的分布规则分散到不同的实例上保存。比如,在使用 RedisCluster 或 Codis 时,数据都会先按照 CRC 算法的计算值对 Slot(逻辑槽) 取模,同时,所有的 Slot 又会由运维管理员分配到不同的实例上。这样,数据就被保存到相应的实例上了。虽然这种方法实现起来比较简单,但是很容易导致一个问题:数据倾斜。数据倾斜有两类。数据量倾斜:在某些情况下,实例上的数据分布不均衡,某个实例上的数据特别多。数据访问倾斜:虽然每个集群实例上的数据量相差不大,但是某个实例上的数据是热点数据,被访问得非常频繁。如果发生了数据倾斜,那么保存了大量数据,或者是保存了热点数据的实例的处理压力就会增大,速度变慢,甚至还可能会引起这个实例的内存资源耗尽,从而崩溃。这是我们在应用切片集群时要避免的。今天这节,就来聊聊,这两种数据倾斜是怎么发生的,我们又该怎么应对。数据量倾斜的成因和应对方法 首先,我们来看数据量倾斜的成因和应对方案。当数据量倾斜发生时,数据在切片集群的多个实例上分布不均衡,大量数据集中到了一个或几个实例上,如下图所示:那么,数据量倾斜是怎么产生的呢?这主要有三个原因,分别是某个实例上保存了 bigkey、Slot 分配不均衡以及 HashTag。接下来,我们就一个一个来分析,同时还会讲解相应的解决方案。

Redis 数据倾斜

Redis 数据倾斜指的是在 Redis 集群模式下,数据 (以及相应的访问请求和负载) 在各个分片 (Shard) 之间分布严重不均匀的现象。这会导致部分节点成为热点或超载,而其他节点资源闲置,最终引发性能瓶颈、高延迟、内存溢出、主从切换失败甚至节点宕机。以下是 Redis 数据倾斜的常见原因、检测方法以及解决方案:📊 常见原因 键分布不均:​​ 哈希槽映射不均:​​ Redis 集群使用 CRC16 算法计算键的哈希槽 (Slot)。如果键的设计不合理,导致大量键被映射到同一个或少量几个哈希槽中 (这些槽恰好在同一节点)。键名使用特定模式:​​ 例如大量键使用相同的固定前缀 + 流水号 (user:1000:order:1,user:1000:order:2)。如果 CRC16 算法对这类前缀敏感,可能导致哈希槽集中。哈希标签 (Hash Tag) 滥用:​​ Redis 允许用{}定义哈希标签,确保带相同标签的键分配到同一个槽。如果标签过于集中或所有键都使用同一个标签,所有数据会被打到一个节点上。正确使用能聚合数据,滥用则导致严重倾斜。大 Key(Big Key):​​ 单个 Key 的大小远超平均值 (如几百 KB、几 MB 甚至更大)。常见于:大字符串 (大缓存对象、序列化数据) 元素数量巨大的集合 (Set/Hash/List/Sorted Set) 这个大 Key 及其相关操作会消耗所在节点不成比例的内存、网络带宽和 CPU。热 Key(Hot Key):​​ 某个或某几个特定 Key 的访问频率 (QPS) 远高于其他键。即使数据大小正常,极高的并发访问也会使其所在节点成为计算和网络流量的瓶颈。配置或路由问题:​​ 集群配置错误 (如节点数少、槽分配不均) 客户端使用非集群感知的驱动或不正确路由逻辑

Redis 集群分片策略 hash tag 怎么配置避免倾斜?

Redis 数据倾斜?别慌!从成因到解决方案,一文帮你搞定

分片集群中,数据会按一定分布规则分散到不同实例保存。如使用 RedisCluster,数据先 CRC 计算值对 Slot(逻辑槽) 取模,同时,所有 Slot 又会由运维管理员分配到不同实例。这样,数据就被保存到相应实例。这种方法实现简单,但易导致数据倾斜。1 数据倾斜 数据量倾斜 实例数据分布不均衡,某实例上的数据太多 数据访问倾斜 虽然每个集群实例上的数据量差别不大,但某实例上的数据是热点数据,被访问得很频繁 若数据倾斜了,则保存大量数据或保存热点数据的实例的处理压力就会增大,速度变慢,甚至可能引起该实例的内存耗尽。2 数据倾斜成因 数据倾斜时,数据在分片集群的多个实例上分布不均衡,大量数据集中到 1 或多个实例。主要原因:某实例保存了 bigkey、Slot 分配不均衡及 HashTag。(消息于 2025 年 7 月 27 日发布)

FAQ

什么是 Redis Hash Tag 及其作用?

Redis 允许用{}定义哈希标签,确保带相同标签的键分配到同一个槽。正确使用能聚合数据,滥用则导致严重倾斜。

Redis 集群分片策略 hash tag 怎么配置避免倾斜?

数据倾斜的主要成因有哪些?

这主要有三个原因,分别是某个实例上保存了 bigkey、Slot 分配不均衡以及 HashTag。

Redis 集群分片策略 hash tag 怎么配置避免倾斜?

如何检测 Redis 实例中的大 Key?

可以使用 redis-cli --bigkeys 找出实例中的大 Key,需谨慎在线上使用,避免阻塞。