Cluster 是什么
Redis Cluster 是官方的分布式分片方案:把整个键空间切成 16384 个槽(slot),每个主节点负责其中一部分,键名经 CRC16 计算后对 16384 取模落到某个槽上,客户端据此把请求发到对应节点。节点之间用二进制协议互相交换状态,实现槽归属协商、故障检测与自动主从切换。相比客户端分片或代理分片,它把分片规则内置进服务端,扩容缩容通过迁移槽完成。
基本信息
| 槽总数 | 16384 个,编号 0 到 16383 |
|---|---|
| 路由算法 | CRC16(key) mod 16384,键名含 {} 时只算标签内容 |
| 最小拓扑 | 3 主 3 从:主节点投票需要多数派 |
| 端口 | 数据端口 p,集群总线端口通常为 p+10000 |
| 数据库 | 仅 db0,SELECT 非 0 会报错 |
典型使用场景
- 单机内存装不下、需要横向扩展容量的业务,按槽分摊到多个主节点
- 既要分片又要自动故障转移的场景,用从节点顶替宕掉的主节点
- 读写量增长后按槽迁移做在线扩容,避免整体停机重导数据
- 需要在同一套集群内按哈希标签把强相关键聚到同一槽,支撑多键操作与事务
- 自建替代代理型分片方案,减少一层转发与运维组件
查看拓扑与槽归属
查看拓扑与槽归属
redis-cli -p 7000 CLUSTER INFO # cluster_state 是否为 ok
redis-cli -p 7000 CLUSTER NODES # 节点列表与负责的槽区间
redis-cli -p 7000 CLUSTER SLOTS # 槽与主从对应关系
redis-cli -p 7000 CLUSTER KEYSLOT user:1001 # 键落在哪个槽
redis-cli -c -p 7000 GET user:1001 # -c 跟随重定向,集群调试几乎必开
redis-cli --cluster check 10.0.0.11:7000 # 整体一致性体检关键概念对照
| 概念 | 含义 | 判断要点 |
|---|---|---|
| 槽 slot | 键空间的最小分配单位 | 16384 个槽必须全部有主,否则集群不可用 |
| MOVED | 槽已归属别的节点 | 客户端应更新本地路由表并重发 |
| ASK | 槽正在迁移中的临时改道 | 只对本次请求改道,不动路由表 |
| 哈希标签 | {} 内的内容参与 CRC16 计算 | 让多个键稳定落在同一槽 |
| 集群总线 | 节点间握手、投票、状态广播 | 端口为数据端口加 10000 |
槽数为什么是 16384:节点间心跳会携带一个位图表示自己负责哪些槽,16384 位即 2KB,开销可控;同时集群规模在实践中很难达到上千节点,16384 个槽已足够均匀分配。这个数字是写死在协议里的,不能配置。
集群局限:只支持 db0,多键命令、事务、Lua 脚本要求涉及的键在同一槽,批量键操作需要客户端按槽拆分;跨槽的集合运算必须在业务侧完成。
上线前必须确认的四项
- 客户端支持集群:能维护路由表、跟随 MOVED 与 ASK,只给种子节点列表让其自动发现拓扑
- 槽全覆盖:扩容或迁移中途中断会留下未分配槽,此时集群整体不可写,需要补完迁移
- 故障转移可用:每主至少一从,且多数主节点在线才能完成选举,主从不要全部堆在同一台物理机上
- 键设计先行:涉及多键的操作用哈希标签把数据聚到同槽,标签粒度不能粗到只剩一个槽
Cluster 不保证强一致:主节点收到写入即向客户端返回成功,命令之后才异步复制到从节点。主节点故障时仍未同步的写入会永久丢失,不能把集群当成强一致存储用于账务类场景。