2024-05-02
版权声明:本文为博主付费文章,严禁任何形式的转载和摘抄,维权必究。 本文链接:https://www.skjava.com/mianshi/baodian/detail/1045724333

回答

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 扩容