回答
Redis Cluster 采用分片(sharding
)的方式来提供数据的水平扩展能力。
- Redis Cluster 使用哈希槽来分配数据到不同的节点。每个 key 通过
CRC16
算法得到一个哈希值,然后根据这个哈希值来确定 key 应该被放置在哪个哈希槽中。 - Redis Cluster 一共有 16384 个 哈希槽,每个节点负责管理一部分哈希槽。假如有三个 Redis 节点,那么第一个节点负责
0 ~ 5460
,第二个节点负责5461 ~ 10922
,第三个节点负责10923 ~ 16383
。 - 当一个客户端尝试访问一个 key 时,同样使用
CRC16
算法来确定访问的 key 在哪一个哈希槽中,然后直接连接到负责该槽的节点。客户端请求路由目前主流方式有三种:moved 重定向、ask 重定向以及 smart 智能客户端。 - 当 Redis Cluster 中的节点有增加时,Redis Cluster 新增节点进行上线操作,以及哈希槽的重分配,即需要将其他现有 Redis 节点负责的哈希槽迁移一部分给新的节点以保证整个 Redis Cluster 中的槽平衡。
- 当 Redis Cluster 中的节点有减少操作是,Redis Cluster 则需要对该节点进行下线操作,同时,也需要将它负责的节点分配给现存的 Redis 节点,以保证整个 Redis Cluster 中的槽完整。
扩展
哈希槽
关于 Redis Cluster 的哈希槽请阅读这篇文章:如何确定给定 key 的应该分布到哪个哈希槽中?
下图是整个过程:
Redis Cluster 扩容
当一个新的 Redis 节点加入 Redis Cluster 后,我们需要将现有节点的槽重新分配到新的节点上。整个过程分为如下几个步骤:
一、新节点添加到集群中