Redis 系列(十一):高可用(二)——Redis Cluster 集群
核心目标理解 16384 个哈希槽的分片原理、gossip 通信与 MOVED/ASK 重定向能搭建三主三从集群理解集群模式的功能限制CROSSSLOT、db0 only、多 key 命令能评估哨兵 主从与集群的选型。前置知识完成 Part 10复制与故障转移——集群分片内仍依赖这些机制。验证环境Redis 8.10.0cygwin 移植版三主三从共 6 个隔离实例6380-6385redis-cli --cluster创建。最后复核日期2026-08-07。0. 本篇问题场景单主库的天花板哨兵解决了主库挂了自动切换但仍有三个上限写容量所有写都打在一个主库单线程 CPU 饱和后加机器没用内存容量数据总量受单机内存限制换大内存机器有成本上限故障半径一次主库宕机整个数据集不可写。Redis Cluster 的答案分片——把 16384 个哈希槽摊到多个主节点每个主节点只服务自己那部分槽。写能力、内存容量、故障半径随之分摊。1. 分片模型16384 个哈希槽1.1 槽的分配CLUSTER KEYSLOT order:1001 → slot 241 节点 A CLUSTER KEYSLOT user:42 → slot 15880 节点 C CLUSTER KEYSLOT product:9 → slot 264 节点 A本实验三主节点分片redis-cli --cluster create自动分配127.0.0.1:6380 master slots:[0-5460] 127.0.0.1:6381 master slots:[5461-10922] 127.0.0.1:6382 master slots:[10923-16383] 6383/6384/6385 分别为三个主的从库cluster info的健康指标cluster_state:ok cluster_slots_assigned:16384 ← 槽全部有归属 cluster_known_nodes:6 ← 主从共 6 个节点1.2 槽的计算CRC16slot CRC16(key) % 1638416384是固定值不是节点数——槽是逻辑位置节点是物理位置两者解耦后扩容/缩容只需要迁移槽不需要重新哈希全部数据。2. 请求路由MOVED 与 ASK2.1 MOVED槽在别人那客户端直连节点 A 请求一个属于节点 C 的 key节点 A 返回MOVED$ redis-cli -p 6380 GET user:42 MOVED 15880 127.0.0.1:6382MOVED 15880 127.0.0.1:6382 “slot 15880 在 6382去那里”。智能客户端redis-py 的 RedisCluster、redis-cli -c会缓存槽-节点映射并自动重定向$ redis-cli -c -p 6380 SET user:42 alice OK $ redis-cli -c -p 6380 GET user:42 alice2.2 ASK槽正在迁移槽迁移扩容/缩容期间部分 key 已搬到目标节点。源节点对已搬走的 key返回ASK——与 MOVED 的区别MOVEDASK含义槽已永久属于对方槽正在迁移这个 key 暂时在对方客户端处理更新槽映射缓存只重定向这一次不更新缓存ASK 15880 127.0.0.1:63822.3 集群模式的功能限制单节点可以跨 key 操作MGET、事务、Lua但槽不同就报 CROSSSLOT$ redis-cli -p 6380 MGET order:1001 user:42 (error) CROSSSLOT Keys in request dont hash to the same slot集群模式下的限制汇总能力限制多 key 命令MGET/MSET/SUNION…所有 key 必须同槽MULTI 事务 / Lua 脚本涉及的 key 必须同槽SELECT只有 db 0管道/发布订阅部分支持跨槽受限单 key 大对象不受限但会倾斜Part 4 大 key 危害放大2.4 hash tag把相关 key 钉进同一槽官方 7.4 支持hash tagkey 中{...}部分参与哈希其余忽略。user:{42}:name与user:{42}:cart同槽从而支持同槽 MGET/事务/Lua。⚠️ 本机 8.10.0cygwin 移植版实测 hash tag 未生效CLUSTER KEYSLOT user:{42}:name 6755、user:{42}:cart 12984不同槽官方实现cluster.c的keyHashSlot应取{}内子串做 CRC16本机移植版行为不符。该结论仅基于本机 8.10.0 移植版实测标准发行版请在目标环境用CLUSTER KEYSLOT复核。工程教训hash tag 是跨 key 操作的前提上线前必须用CLUSTER KEYSLOT实测确认 tag 生效不能默认所有发行版行为一致。若 tag 不可用跨 key 业务要么改单实例要么应用层聚合。3. 主从与故障转移集群的每个分片仍是一主一从复制机制同 Part 10。从库不参与分片只做副本主节点宕机 → 从库通过 gossip 检测cluster-node-timeout默认 15 秒→从库自动提升为新主无需哨兵哨兵是集群外的独立组件集群自带选举数据与角色转移演示本实验手动触发CLUSTER FAILOVER$ redis-cli -p 6383 CLUSTER FAILOVER # 6383 是 6380 的从 OK $ redis-cli -p 6383 cluster nodes 127.0.0.1:638316383 myself,master ← 从库接管成为主 $ redis-cli -p 6383 cluster info cluster_state:ok ← 集群仍健康 $ redis-cli -c -p 6383 GET order:1001 paid ← 数据可继续访问自动故障转移同样有检测时间 选举的不可用窗口默认 15 秒级且部分分片宕机时只有该分片的槽不可用——这是集群相对哨兵整个数据集的故障半径优势。4. 扩容缩容槽迁移扩容 加节点 → 从现有主节点迁出部分槽reshard# 交互式迁移或 --cluster-from/--cluster-to 指定源与目标 redis-cli --cluster reshard 127.0.0.1:6380 \ --cluster-from 源节点id --cluster-to 新节点id \ --cluster-slots 1000 --cluster-yes迁移期间访问中的 key 返回ASK§2.2客户端需要处理。缩容同理反向迁移。槽迁移是数据拷贝期间有内存/带宽开销——扩容要在低峰期做且新节点先以空槽主节点加入。5. 选型哨兵 主从 vs 集群维度哨兵 主从Redis Cluster数据容量单主上限横向扩展多分片写能力单主上限随分片增长故障半径整个数据集切换仅宕机分片复杂度低哨兵配置 客户端高槽、重定向、跨槽限制跨 key 操作无限制受 CROSSSLOT 限制适用数据量 单机、写 QPS 可控数据量/写 QPS 超单机结论能单机就单机需要高可用加哨兵只有当单机内存或写吞吐成为瓶颈时再上集群——集群的跨槽限制会反过来约束业务多 key 操作、事务、Lua。6. 版本与环境差异差异点官方 7.4本机 8.10.0cygwin 移植版槽分配/重定向一致一致MOVED/ASK 实测正常hash tagkeyHashSlot支持{}实测未生效§2.4——上线前必须实测故障转移gossip 从库提升一致集群命令redis-cli --cluster可用7. 测试与验收集群测试隔离环境槽全覆盖16384、MOVED/ASK 重定向、CROSSSLOT 拒绝、CLUSTER FAILOVER后数据可访问hash tag 验收CLUSTER KEYSLOT实测{tag}:a与{tag}:b同槽本机环境不满足。本篇验收清单能解释16384 槽 vs 节点数的解耦设计扩容只需迁槽能区分 MOVED永久归属与 ASK迁移中临时指向能说出集群模式下跨 key 操作的限制CROSSSLOT与 hash tag 的作用知道集群自带的从库提升机制与哨兵的差异能在哨兵 主从与集群之间给出选型依据搭建过三主三从集群并完成一次接管演练。8. 常见误区“集群 多台机器各存各的”——是槽分片不是节点分片节点只是槽的宿主扩容迁移的是槽。“集群可以替代哨兵”——集群自带故障转移但跨 key 限制让很多业务无法直接迁移小数据量上集群得不偿失§5。“hash tag 所有版本都支持”——本机 8.10 移植版实测不生效必须CLUSTER KEYSLOT验证§2.4。“MOVED 和 ASK 一样”——MOVED 永久更新路由缓存ASK 只重定向单次§2.2。“集群里随便 MGET”——跨槽报 CROSSSLOT需要同槽hash tag或应用层聚合。9. 本篇小结分片16384 槽解耦逻辑位置与物理节点扩容迁槽路由MOVED槽迁移后/ ASK槽迁移中两种重定向限制跨槽多 key 操作被 CROSSSLOT 拒绝hash tag 是解药但必须实测选型单机 → 哨兵 → 集群逐级升级集群的复杂度要用确实超单机来换取。至此高可用三件套复制、哨兵、集群讲完。最后一篇 Part 12性能、观测与生产排障 把整条知识链收拢到问题怎么查慢查询、延迟、大 key、热 key、连接治理与排障决策树。10. 官方资料Redis Cluster 文档https://redis.io/docs/latest/operate/oss_and_stack/management/scaling/Cluster 规范槽、重定向、hash taghttps://redis.io/docs/latest/operate/oss_and_stack/management/scaling/CLUSTER命令https://redis.io/docs/latest/commands/cluster/redis-py clusterhttps://redis-py.readthedocs.io/en/stable/commands.html#redis-cluster

相关新闻

最新新闻

日新闻

周新闻

月新闻