基本特性

Redis 集群提供了非常丰富的特性供用户使用,本节将对这些特性做进一步的介绍。

复制与高可用

Redis 集群与单机版 Redis 服务器一样,也提供了主从复制功能。在 Redis 集群中,各个 Redis 服务器被称为节点(node),其中主节点(master node)负责处理客户端发送的读写命令请求,而从节点(replica/slave node)则负责对主节点进行复制。

除了复制功能之外,Redis 集群还提供了类似于单机版 Redis Sentinel 的功能,以此来为集群提供高可用特性。简单来说,集群中的各个节点将互相监视各自的运行状况,并在某个主节点下线时,通过提升该节点的从节点为新主节点来继续提供服务。

图20-1展示了一个包含 3 个节点的 Redis 集群。

image 2025 01 06 15 22 47 660
Figure 1. 图20-1 Redis集群及其节点

分片与重分片

与单机版 Redis 将整个数据库放在同一台服务器上的做法不同,Redis 集群通过将数据库分散存储到多个节点上来平衡各个节点的负载压力。

具体来说,Redis 集群会将整个数据库空间划分为 16384 个槽(slot)来实现数据分片(sharding),而集群中的各个主节点则会分别负责处理其中的一部分槽。当用户尝试将一个键存储到集群中时,客户端会先计算出键所属的槽,接着在记录集群节点槽分布的映射表中找出处理该槽的节点,最后再将键存储到相应的节点中,如图20-2所示。

image 2025 01 06 15 24 11 840
Figure 2. 图20-2 Redis集群的分片实现

当用户想要向集群添加新节点时,只需要向 Redis 集群发送几条简单的命令,集群就会将相应的槽以及槽中存储的数据迁移至新节点。与此类似,当用户想要从集群中移除已存在的节点时,被移除的节点也会将自己负责处理的槽以及槽中数据转交给集群中的其他节点负责。最重要的是,无论是向集群添加新节点还是从集群中移除已有节点,整个重分片(reshard)过程都可以在线进行,Redis 集群无须因此而停机。

高性能

Redis 集群采用无代理模式,客户端发送的所有命令都会直接交由节点执行,并且对于经过优化的集群客户端来说,客户端发送的命令在绝大部分情况下都不需要实施转向,或者仅需要一次转向,因此在 Redis 集群中执行命令的性能与在单机 Redis 服务器上执行命令的性能非常接近。

除了节点之间互通信息带来的性能损耗之外,单个 Redis 集群节点处理命令请求的性能与单个 Redis 服务器处理命令请求的性能几乎别无二致。从理论上来讲,集群每增加一倍数量的主节点,集群对于命令请求的处理性能就会提高一倍。

简单易用

Redis 为集群提供了丰富的工具和命令,用户可以通过工具快速创建测试用集群,并在之后通过命令行命令或者 Redis 内置的集群命令管理和控制集群。与此同时,因为 Redis 集群只需要非常少的配置信息,所以即使你打算手动构建自己的集群,实施起来应该也不会遇到什么困难。