Redis Cluster 槽位统计辅助容量规划的方法
Redis Cluster 做容量规划时,不能只看每台机器的 used_memory。更稳妥的做法是先确认 16384 个 hash slot 是否完整覆盖,再把槽位区间映射到主节点,最后补充每个槽位的键数量和热点分布。这样得到的是一张“拓扑—槽位—数据量”统计表,而不是只看节点平均值。
官方地址:https://redis.io/
槽位数量适合判断分片拓扑是否均衡,槽位键数适合发现数据倾斜,迁移窗口还要结合单节点内存、业务写入和迁移批次一起评估。统计结果可以辅助容量决策,但不能单凭一项指标自动决定扩容。
CLUSTER INFO回答“集群是否完整可服务”。CLUSTER SLOTS回答“哪些槽位由哪个主节点和副本节点负责”。CLUSTER COUNTKEYSINSLOT回答“某个槽位在当前节点本地有多少键”。
先确认 16384 个槽位是否完整覆盖
Redis Cluster 的第一层统计是全局健康边界。官方的 CLUSTER INFO 会返回 cluster_slots_assigned、cluster_slots_ok、cluster_slots_pfail、cluster_slots_fail 和 cluster_size 等字段。规划容量前,至少把这些字段保存下来:如果槽位没有全部分配,先处理拓扑问题,不要把“不完整集群”当成容量基线。
# 从任意集群命令端口读取全局覆盖状态;示例只展示命令,不代表本文已连接实例 redis-cli -c -h 127.0.0.1 -p 7000 CLUSTER INFO | grep -E '^(cluster_state|cluster_slots_|cluster_size):' # 读取槽位区间和主、副本地址,用于后续建立节点映射 redis-cli -c -h 127.0.0.1 -p 7000 CLUSTER SLOTS
CLUSTER SLOTS返回的是槽位范围及其服务节点,适合建立“起始槽—结束槽—主节点—副本节点”的映射。槽位范围均匀,不代表键数量均匀;反过来,键数量接近也不代表副本、内存和流量已经满足生产要求。

按主节点汇总槽位数量和键数量
完成覆盖检查后,再统计每个主节点拥有的槽位数。平均值可以用 16384 ÷ 主节点数 得到,但这只是拓扑上的平均槽位数,不是容量上限。一个槽位里可能只有少量小键,也可能聚集大量大对象,所以还要对槽位键数做采样或完整采集。
CLUSTER COUNTKEYSINSLOT slot 的复杂度是 O(1),但它只查询接收命令节点的本地数据集。如果把命令发给不负责该槽位的节点,得到的数量会是 0。因此脚本必须先用 CLUSTER SLOTS 找到槽位所属主节点,再把计数请求发到该节点,不能固定连接一个 seed 节点循环所有槽位。
# 这是统计脚本骨架:读取槽位归属后,把每个槽位发给对应主节点。
# 真实项目中还应补充认证、TLS、超时、重试和结果落盘;这里不执行连接。
from collections import defaultdict
def summarize_slot_counts(slot_ranges, count_keys):
# slot_ranges: [(master_id, start_slot, end_slot)]
per_master = defaultdict(lambda: {"slots": 0, "keys": 0, "max_slot_keys": 0})
for master_id, start_slot, end_slot in slot_ranges:
row = per_master[master_id]
for slot in range(start_slot, end_slot + 1):
# count_keys 必须路由到该 slot 的主节点,不能在任意节点上调用
slot_keys = count_keys(master_id, slot)
row["slots"] += 1
row["keys"] += slot_keys
row["max_slot_keys"] = max(row["max_slot_keys"], slot_keys)
return dict(per_master)
表格建议至少保留四列:主节点、槽位数、槽位键总数、单槽最大键数。前两列更偏拓扑,后两列更偏数据分布。采集全量槽位会产生额外命令开销,生产环境可以先按固定间隔采样,再对疑似热点槽位做补采;采样周期和采样比例要与业务峰值分开记录。
识别热点并估算迁移窗口
容量规划的关键不是追求每个槽位的键数绝对相等,而是找出会限制扩容、迁移或故障转移的少数热点。可以把“单槽最大键数 ÷ 节点平均槽位键数”作为内部比较指标,但它不是 Redis 官方阈值,也不能代替内存占用、对象大小和命令流量。
如果发现某个主节点槽位数接近平均值,却拥有明显更多键或更大内存,说明仅调整槽位数量可能不够。迁移前要确认热点槽位对应的业务键是否持续写入,并把迁移批次、客户端重定向、网络带宽和可接受的业务抖动纳入窗口。Redis 官方将 resharding 描述为在节点之间移动 hash slot;redis-cli --cluster reshard 可以辅助执行,但不会替你理解业务热点。
# 先查看指定槽位的部分键名,slot 参数应来自前面的统计表 # 这是规划阶段的示例;生产环境要限制返回数量并避免把敏感键名写入日志 redis-cli -c -h 127.0.0.1 -p 7000 CLUSTER GETKEYSINSLOT 8123 20 # 规划后由管理员在维护窗口执行迁移;--cluster-yes 只跳过交互确认 # 目标节点、迁移槽位数和回滚安排必须先经过人工评估 redis-cli --cluster reshard 127.0.0.1:7000 \ --cluster-from SOURCE_NODE_ID \ --cluster-to TARGET_NODE_ID \ --cluster-slots 128 \ --cluster-yes

用小工具输出可复查的统计表
实际落地时,可以把统计分成三份输出:第一份保存 CLUSTER INFO 的全局状态,第二份保存 CLUSTER SLOTS 的拓扑快照,第三份保存按主节点聚合后的槽位键数。每份记录都要带采集时间、连接入口、节点 ID 和是否为采样结果,便于和扩容前后的数据比较。
| 指标 | 回答的问题 | 不能直接推出 |
|---|---|---|
| cluster_slots_assigned / ok | 槽位是否完整可服务 | 节点内存是否足够 |
| 主节点槽位数 | 拓扑分片是否大致均衡 | 业务键是否均匀 |
| 单槽键数与节点键总数 | 是否存在数据倾斜 | 单键大小和访问流量 |
| 迁移槽位数 | 本次计划移动多少槽位 | 迁移耗时和业务影响 |
这张表可以作为容量评审的输入:先排除覆盖异常,再观察节点和槽位的离散程度,最后结合内存、连接数、命令延迟和业务峰值决定是否扩容或重分片。若只是看到某一天的单槽键数偏高,不要立即执行迁移;先重复采集,确认热点是稳定业务特征还是临时批处理。
常见问题
槽位数平均就代表容量平均吗?
不代表。槽位只表达分片归属,键数量、对象大小、访问流量和过期策略仍可能严重不均衡。
为什么 COUNTKEYSINSLOT 返回 0?
该命令只查询接收节点的本地数据集;如果请求发到了不负责该槽位的节点,返回 0 不能证明槽位没有键。
采集全部槽位会不会影响线上 Redis?
命令本身是轻量统计,但全量循环仍会产生请求量。应控制采集频率、超时和并发,并把采样与峰值时段分开安排。
发现热点槽位后能直接 reshard 吗?
不能只看一个指标就迁移。还要确认业务写入、对象大小、带宽、客户端重定向和回滚窗口,并由管理员在维护窗口执行。
Redis MULTI EXEC 无回滚时的业务补偿方案
- 上一篇
- Redis MULTI EXEC 无回滚时的业务补偿方案
- 下一篇
- Redis EXPIRE 条件参数如何避免覆盖更长 TTL
-
- 数据库 · Redis | 58分钟前 |
- Redis EXPIRE 条件参数如何避免覆盖更长 TTL
- 207浏览 收藏
-
- 数据库 · Redis | 1小时前 |
- Redis Pipeline 降低往返延迟的批量边界
- 321浏览 收藏
-
- 数据库 · Redis | 1小时前 |
- Redis ACL 按命令类别限制应用权限的配置
- 115浏览 收藏
-
- 数据库 · Redis | 1小时前 | Redis · cluster · redis Redis Cluster CROSSSLOT Hash Tag hash slot
- Redis Cluster 多 key 操作的哈希标签设计
- 246浏览 收藏
-
- 数据库 · Redis | 1小时前 |
- Redis GEOSEARCH 查询附近地点的范围条件
- 116浏览 收藏
-
- 数据库 · Redis | 1天前 |
- Redis BZPOPMIN 怎样等待最小成员
- 454浏览 收藏
-
- 数据库 · Redis | 1天前 |
- Redis BLMOVE 超时后怎样判断源列表状态
- 108浏览 收藏
-
- 数据库 · Redis | 1天前 |
- Redis 客户端缓存怎样使用广播失效
- 332浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 497次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 553次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 579次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 532次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 343次使用
-
- Redis Stream XTRIM 如何避免消费组积压无限增长
- 2026-09-12 501浏览
-
- Redis AOF rewrite 期间如何判断磁盘与内存压力
- 2026-09-12 501浏览
-
- Redis RDB 和 AOF 怎么按可接受数据丢失量选择
- 2026-09-08 501浏览
-
- Redis XAUTOCLAIM 之后为什么仍有 pending:JUSTID、PEL 与消息删除边界
- 2026-08-29 501浏览
-
- Redis SET 的 GET 与 KEEPTTL 怎么一起验收:旧值返回、续期与回滚边界
- 2026-08-20 501浏览
