针对Redis主从架构的缺点:所有节点都存储着相同的数据副本,整体存储容量受限于单点的存储容量。
Redis集群则是成功实现了数据的分片式存储:Redis 集群有16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽。集群的每个节点负责一部分 hash 槽,举个例子,比如当前集群有3个节点,那么可能的一种情况为:节点 A 包含 0 到 5460 号哈希槽,节点 B 包含 5461 到 10922 号哈希槽,节点 C 包含 10923 到 16383 号哈希槽。 对于 key 为`my_name`, CRC16(‘my_name’)%16384 = 2412,则被分配在节点 A 上;如果获取这个key,都会转移到节点 A 上。
其特性在于:
- 所有节点互联(PING-PONG),集群内部使用二进制协议优化传输速度。
- 节点失效(fail)需要集群中超过半数的节点连接失效才生效。
- 实现了数据的分布式存储,每台 Redis 主节点上存储的内容不同,解决了主从架构中都存在的存储性能受限。
- 每一个节点都支持读写操作,可以直接连接,不需要代理。
- 不支持那些需要同时处理多个键的 Redis 命令,可能涉及在多个节点中移动数据。
- 支持主从架构,主节点宕机自动选举从节点升级为主节点(需要一半以上的主节点确认),通常采用三主三从。
- 槽的分配和节点的增加/删除可以动态执行,不会影响集群可用性。