详解redis(4):集群
一、为什么需要 Redis Cluster单机 Redis哪怕主从 Sentinel都有硬上限内存受限于单机 RAMCPU、网络 I/O 有瓶颈单实例 QPS 有天花板当出现以下情况之一就必须走向集群数据量大到一台机器内存装不下写入 / 读取并发太高不希望再人为拆业务 keyRedis Cluster 的目标通过“分片”实现水平扩展Scale Out二、Redis Cluster 的核心思想分片Sharding一旦启用 Redis Cluster就意味着整个 Key 空间被切分成多份每个 Redis 实例只负责其中一部分Cluster 多个 Redis 主节点每个主节点 一个分片三、关键问题Key 到底落在哪个节点这是集群设计的第一性问题。方案一简单取模不可行hash(key) % 节点数问题节点数一变扩容 / 缩容几乎所有 key 都要重新映射导致大规模数据迁移长时间不可用这正是你文中提到的“不切实际”问题Redis Cluster 的解决方案Hash Slot哈希槽什么是 Hash SlotRedis Cluster不直接把 key 映射到节点而是key → hash slot → Redis 节点一共1638416K个 hash slot每个 slot 属于某一个主节点Key 是如何映射的公式是slot CRC16(key) % 16384然后查 slot 属于哪个节点请求就发给哪个节点四、为什么 Hash Slot 能解决“重新分片”问题没有 Hash Slot 会发生什么灾难节点数变化 → hash 公式变化 →所有 key 重算位置全量数据迁移服务抖动甚至不可用有了 Hash Slot 后发生了什么Key永远只和 slot 绑定扩容 / 缩容时只移动 slot而不是重算 key 的 hashkey 的 hash 不变slot 归属变五、Redis Cluster 如何做到高可用Redis Cluster不使用 Sentinel。每个分片都有副本Master Replica(s)例如M1 ─ R1 M2 ─ R2 M3 ─ R3故障转移是“集群内置”的节点之间通过Gossip 协议通信多数主节点同意某主节点不可用自动提升其副本为新主不需要 Sentinel集群可用的前提条件非常重要集群中所有 16384 个 slot 必须有归属如果有 slot 无主集群进入FAIL状态所有写入被拒绝这是为了防止“数据不完整”六、Redis Cluster vs Sentinel本质区别对比项SentinelCluster数据分片❌✅水平扩展❌✅自动故障转移✅✅架构复杂度低高强一致性❌❌