redis集群模式
Redis 集群(Cluster)模式完整详解
Redis 集群(Redis Cluster)是 Redis 官方提供的「分布式高可用解决方案」,核心用于解决「单节点性能瓶颈」和「大规模数据存储」问题。它基于「分片存储」+「主从复制」+「自动故障切换」,实现了数据的分布式存储、读写负载均衡和高可用,是生产环境中大规模 Redis 部署的首选模式。
前文已讲解「主从复制+哨兵」架构,其局限性在于:所有数据都存储在单个 Master 节点,无法突破单节点的内存、CPU、IO 瓶颈,仅能实现高可用,无法应对大规模数据场景。而 Redis 集群完美解决这一问题,同时集成了主从复制和故障切换的核心能力,无需依赖哨兵,自身具备完整的高可用机制。
本文将从「核心定位、架构组成、分片机制、核心流程、部署实战、常见问题」六个维度,彻底讲透 Redis 集群模式,兼顾理论与实战,适配面试和生产落地需求。
一、Redis 集群的核心定位与核心价值
1. 核心定位
Redis 集群是一种「分布式架构」,将数据分片存储在多个节点(Node)上,每个节点负责一部分数据,同时通过主从复制保证每个分片的高可用,无需哨兵介入,自身完成故障检测和自动切换。
2. 核心价值(解决的痛点)
- 突破单节点瓶颈:数据分片存储,单个节点仅存储部分数据,突破单节点内存(如最大16GB、32GB)、CPU、IO 限制,支持 TB 级数据存储;
- 负载均衡:读写请求会均匀分发到不同节点,避免单节点压力过大,提升整体并发能力(支持万级甚至十万级 QPS);
- 高可用:每个分片都有主从复制,主节点故障后,从节点自动升级为新主节点,无需人工干预,可用性高于「主从+哨兵」;
- 扩展性强:支持动态扩容/缩容,新增节点时无需停机,自动分片数据;删除节点时,数据自动迁移到其他节点。
3. 与「主从+哨兵」的区别(关键对比)
|
对比维度
|
主从+哨兵
|
Redis 集群
|
|---|---|---|
|
数据存储
|
所有数据存储在单个 Master, Slave 仅备份
|
数据分片存储,多个主节点各存一部分数据
|
|
性能瓶颈
|
单节点瓶颈,无法突破内存/CPU限制
|
无单节点瓶颈,可通过扩容节点提升性能
|
|
高可用机制
|
依赖哨兵实现故障切换
|
自身集成故障检测和切换,无需哨兵
|
|
扩展性
|
差,无法动态扩容(需手动配置)
|
强,支持动态扩容/缩容,自动数据迁移
|
|
适用场景
|
中小规模数据,高可用需求,读多写少
|
大规模数据,高并发,需要扩容的场景
|
二、Redis 集群的核心架构组成
Redis 集群采用「主从分片」架构,核心由「节点(Node)」「分片(Slot)」「主从复制」「集群总线」四部分组成,标准生产环境架构如下:
1. 核心组件说明
(1)节点(Node)
集群中的每个 Redis 实例都是一个节点,分为「主节点(Master Node)」和「从节点(Slave Node)」:
- 主节点(Master):负责「数据存储」和「读写请求处理」,每个主节点对应一个分片,存储一部分数据;
- 从节点(Slave):不存储独立数据,仅同步对应主节点的数据,作为主节点的备份,主节点故障时,自动升级为新主节点;
- 节点数量要求:至少 3 个主节点,每个主节点至少 1 个从节点(推荐架构:3 主 3 从,共 6 个节点),确保高可用和分片均衡。
(2)分片(Slot,槽位)
分片是 Redis 集群实现数据分布式存储的核心,Redis 集群将整个数据空间划分为 16384 个槽位(Slot,编号 0-16383),每个槽位对应一部分数据,核心规则:
- 每个主节点负责一部分槽位(如 3 主节点,每个主节点负责约 5461 个槽位);
- 数据存储时,Redis 会根据「键(Key)的哈希值」计算出对应的槽位,将数据存储到负责该槽位的主节点;
- 槽位与主节点的对应关系,会同步到集群中所有节点,确保每个节点都知道「哪个槽位属于哪个主节点」。
补充:槽位分配是 Redis 集群分片的核心,扩容/缩容的本质就是「槽位的迁移」(将某个主节点的槽位迁移到新节点)。
(3)主从复制(与前文主从复制一致,集成到集群)
集群中每个主节点都有至少 1 个从节点,核心作用:
- 数据备份:从节点同步主节点数据,避免主节点故障导致数据丢失;
- 故障切换:主节点宕机后,其从节点会自动选举为新主节点,接管该主节点的所有槽位和读写请求;
- 读负载分担:客户端可将读请求发送到从节点(需配置只读),分担主节点的读压力。
(4)集群总线(Cluster Bus)
集群中所有节点之间通过「集群总线」(TCP 连接,默认端口为节点端口+10000,如节点端口 6379,集群总线端口 16379)进行通信,核心作用:
- 节点状态同步:每个节点定期向其他节点发送自身状态(在线/离线、槽位分配、主从关系);
- 故障检测:节点之间通过心跳机制(默认每 1 秒发送一次 PING)检测对方状态,判断节点是否故障;
- 槽位信息同步:槽位与主节点的对应关系,通过集群总线同步到所有节点;
- 故障切换协调:主节点故障后,通过集群总线协调从节点选举新主节点。
2. 标准架构示例(3 主 3 从)
生产环境最常用的架构(6 个节点,3 主 3 从),槽位分配和主从对应关系如下:
|
主节点(Master)
|
端口
|
负责槽位
|
对应从节点(Slave)
|
从节点端口
|
|---|---|---|---|---|
|
Master1
|
6379
|
0-5460
|
Slave1
|
6380
|
|
Master2
|
6381
|
5461-10922
|
Slave2
|
|
|
Master3
|
6383
|
10923-16383
|
Slave3
|
6384
|
说明:每个主节点的槽位数量基本均衡(16384/3≈5461),确保负载均衡;每个主节点对应一个从节点,确保高可用。
三、Redis 集群的核心机制(必掌握)
1. 槽位分配与数据存储机制
Redis 集群通过「槽位」实现数据分布式存储,核心流程分为「槽位分配」和「数据定位」两步:
(1)槽位分配(集群初始化/扩容时执行)
集群创建时,需手动将 16384 个槽位分配给各个主节点(可通过命令或工具自动分配),分配后:
- 每个主节点会记录自己负责的槽位范围;
- 槽位分配信息会通过集群总线同步到所有节点,确保每个节点都有完整的「槽位-主节点」映射表;
- 示例命令(给 Master1 分配 0-5460 槽位):
# 登录 Master1 节点,执行槽位分配命令
127.0.0.1:6379> cluster addslots {0..5460}
(2)数据定位(客户端写入/读取数据时)
客户端发送读写请求时,Redis 会根据「键的哈希值」计算出对应的槽位,再根据槽位找到对应的主节点,流程如下:
- 客户端向任意一个集群节点发送请求(如 SET key value);
- 该节点计算 key 的哈希值:
CRC16(key) % 16384,得到对应的槽位 slot; - 节点查询「槽位-主节点」映射表,判断该槽位属于哪个主节点;
- 若当前节点就是该槽位的主节点,直接执行请求,返回结果;
- 若当前节点不是该槽位的主节点,返回「MOVED 错误」,告知客户端该槽位对应的主节点 IP 和端口;
- 客户端收到 MOVED 错误后,重新向目标主节点发送请求,完成读写操作。
补充:客户端可通过「集群模式连接」(如 Redis-cli -c),自动处理 MOVED 错误,无需手动切换节点。
2. 故障检测与自动故障切换机制
Redis 集群无需哨兵,自身集成故障检测和自动故障切换能力,核心依赖「心跳机制」和「投票机制」,流程与哨兵类似,但更高效:
(1)故障检测(节点下线判断)
- 集群中每个节点都会通过集群总线,向其他所有节点发送 PING 心跳(默认每 1 秒一次);
- 若某个节点(如 Master1)超过「cluster-node-timeout」时间(默认 15000 毫秒,15 秒)未响应 PING,发送方会将其标记为「疑似下线(PFAIL)」;
- 发送方会将「疑似下线」信息,通过集群总线同步到其他节点;
- 若超过「半数主节点」都将该节点标记为 PFAIL,则该节点被判定为「确定下线(FAIL)」,并将 FAIL 信息同步到所有节点。
(2)自动故障切换(主节点故障后)
当主节点被判定为 FAIL 后,其对应的从节点会自动发起选举,升级为新主节点,流程如下:
- 故障主节点的所有从节点,会竞争成为新主节点(类似哨兵领导者选举);
- 每个从节点会向集群中所有主节点发送「投票请求」,请求成为新主节点;
- 集群中其他主节点,会根据从节点的「同步进度」(偏移量 offset)投票,同步进度越完整,优先级越高;
- 获得超过半数主节点投票的从节点,升级为新主节点;
- 新主节点会接管原主节点的所有槽位,并通过集群总线,将「槽位-新主节点」的映射关系同步到所有节点;
- 其他从节点(原故障主节点的其他从节点),会自动同步新主节点的数据;
- 若原故障主节点后续恢复上线,会自动成为新主节点的从节点,不再作为主节点。
补充:故障切换时间通常在 15-30 秒(取决于 cluster-node-timeout 配置),期间该槽位对应的读写请求会暂时失败,客户端可通过重试机制应对。
3. 扩容与缩容机制(核心:槽位迁移)
Redis 集群支持动态扩容(新增节点)和缩容(删除节点),核心是「槽位迁移」——将原有主节点的槽位,迁移到新节点(扩容)或其他节点(缩容),全程无需停机,不影响业务正常运行。
(1)扩容流程(新增主节点)
- 启动新的 Redis 节点,配置集群模式(修改 redis.conf,开启 cluster-enabled yes);
- 将新节点加入集群(通过 cluster meet 命令,让新节点与集群中任意一个节点建立连接);
- 将新节点设置为主节点(默认新节点为从节点,需通过 cluster replicate 命令取消从节点身份);
- 执行「槽位迁移」:将原有主节点的部分槽位,迁移到新主节点(通过 cluster reshard 命令,手动或自动分配槽位);
- 槽位迁移完成后,更新集群中所有节点的「槽位-主节点」映射表;
- (可选)为新主节点添加从节点,确保高可用。
(2)缩容流程(删除主节点)
- 执行「槽位迁移」:将待删除主节点的所有槽位,迁移到集群中其他主节点;
- 槽位迁移完成后,待删除主节点不再负责任何槽位;
- 将待删除主节点的从节点,重新关联到其他主节点(作为其他主节点的从节点);
- 执行 cluster forget 命令,将待删除节点从集群中移除;
- 停止该节点的 Redis 服务,完成缩容。
补充:槽位迁移是扩容/缩容的核心,迁移过程中,数据会逐步从原节点迁移到目标节点,期间该槽位的读写请求会正常响应(Redis 会自动处理迁移中的数据一致性)。
4. 集群的一致性保证
Redis 集群默认采用「最终一致性」,而非强一致性,核心原因:
- 主节点执行写操作后,会异步将数据同步到从节点(与主从复制一致);
- 若主节点故障时,数据未同步到从节点,会导致少量数据丢失;
- 可通过配置「min-replicas-to-write」和「min-replicas-max-lag」,提升数据一致性(要求主节点至少有 N 个从节点,且同步延迟不超过 M 秒,才允许执行写操作)。
四、Redis 集群核心配置(redis.conf)
集群模式的核心配置的如下(注释清晰,生产环境可直接参考):
# 开启集群模式(必开)
cluster-enabled yes
# 集群配置文件(自动生成,无需手动修改,存储槽位分配、主从关系等信息)
cluster-config-file nodes-6379.conf
# 集群节点超时时间(毫秒),用于故障检测,默认 15000 毫秒(15 秒)
cluster-node-timeout 15000
# 当主节点的从节点数量少于该值时,禁止主节点执行写操作(提升一致性)
# 推荐配置为 1(至少有 1 个从节点同步正常,才允许写)
min-replicas-to-write 1
# 主节点与从节点的最大同步延迟(毫秒),超过该值,视为从节点同步异常
min-replicas-max-lag 10
# 开启从节点只读(默认开启,避免从节点误写)
slave-read-only yes
# 集群总线端口(默认节点端口+10000,如节点端口 6379,总线端口 16379)
# 无需手动配置,自动生成,需确保防火墙开放该端口
# cluster-port 16379
# 允许集群节点之间的地址重定向(默认开启,支持 MOVED 错误处理)
cluster-redirect-to-slave yes
五、Redis 集群部署实战(3 主 3 从,Linux 环境)
以 Redis 6.2 版本为例,讲解 3 主 3 从集群的部署步骤,可直接落地生产环境(单机多实例部署,也可多服务器部署):
1. 环境准备
- 服务器:1 台 Linux 服务器(推荐 4GB 以上内存,生产环境建议多服务器部署);
- Redis 版本:6.2.x(需支持集群模式,Redis 3.0+ 支持);
- 端口规划:6 个节点,端口 6379-6384(6379、6381、6383 为主节点;6380、6382、6384 为从节点)。
2. 部署步骤
- 创建节点目录(用于存放每个节点的配置文件、日志、数据):
mkdir -p /usr/local/redis/cluster/{6379,6380,6381,6382,6383,6384} - 复制 Redis 配置文件到每个节点目录,并修改核心配置(以 6379 节点为例):
# 复制配置文件cp /etc/redis/redis.conf /usr/local/redis/cluster/6379/# 修改配置文件(vi /usr/local/redis/cluster/6379/redis.conf)daemonize yesport 6379dir /usr/local/redis/cluster/6379logfile /usr/local/redis/cluster/6379/redis.logcluster-enabled yescluster-config-file nodes-6379.confcluster-node-timeout 15000min-replicas-to-write 1requirepass 123456 # 可选,推荐配置密码masterauth 123456 # 与 requirepass 一致其他 5 个节点,按上述配置修改,仅需修改「port、dir、logfile、cluster-config-file」四个参数(对应各自端口)。 - 启动所有 6 个节点:
redis-server /usr/local/redis/cluster/6379/redis.confredis-server /usr/local/redis/cluster/6380/redis.confredis-server /usr/local/redis/cluster/6381/redis.confredis-server /usr/local/redis/cluster/6382/redis.confredis-server /usr/local/redis/cluster/6383/redis.confredis-server /usr/local/redis/cluster/6384/redis.conf验证启动:ps -ef | grep redis,确保 6 个进程都在运行。 - 创建集群(将 6 个节点加入集群,并分配槽位):
# 登录任意一个节点,执行集群创建命令(Redis 5.0+ 支持 --cluster 参数)redis-cli -a 123456 --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1说明:--cluster-replicas 1 表示「每个主节点对应 1 个从节点」,Redis 会自动分配主从关系和槽位。 - 验证集群状态:
# 集群模式登录节点redis-cli -a 123456 -c -p 6379# 查看集群信息127.0.0.1:6379> cluster info# 查看节点信息(主从关系、槽位分配)127.0.0.1:6379> cluster nodes若输出中「cluster_state:ok」,且每个主节点都有对应的从节点、槽位分配完整,即为部署成功。
六、常见问题与避坑要点
1. 核心避坑点
- 节点数量要求:至少 3 个主节点,每个主节点至少 1 个从节点,否则集群无法正常工作(无法完成故障投票);
- 端口开放:除了 Redis 节点端口(6379-6384),还需开放集群总线端口(16379-16384),否则节点之间无法通信;
- 密码一致性:所有节点的 requirepass 和 masterauth 必须一致,否则主从同步失败、集群通信失败;
- 槽位分配完整:16384 个槽位必须全部分配给主节点,若有槽位未分配,集群状态会变为 fail,无法执行读写操作;
- 避免脑裂:确保 cluster-node-timeout 配置合理(推荐 15-30 秒),避免网络波动导致误判节点故障,引发脑裂;
- 扩容/缩容注意事项:槽位迁移时,避免大量槽位同时迁移,防止影响业务性能;迁移完成后,务必验证槽位分配和数据一致性。
2. 常见问题排查
- 集群状态为 fail:排查槽位是否分配完整、主节点数量是否足够、节点之间是否能正常通信(集群总线端口是否开放);
- 主从同步失败:检查密码是否一致、主节点是否正常运行、从节点配置的 masterauth 是否正确;
- 客户端无法连接集群:检查节点端口和集群总线端口是否开放、客户端是否采用集群模式连接(-c 参数)、密码是否正确;
- 故障切换失败:检查故障主节点的从节点是否正常、主节点数量是否足够(至少 3 个)、cluster-node-timeout 配置是否合理。
七、总结
Redis 集群是大规模 Redis 部署的核心方案,核心逻辑是「分片存储+主从复制+自动故障切换」,无需依赖哨兵,自身实现高可用和负载均衡。
核心要点总结:
- 16384 个槽位是分片的核心,数据通过哈希计算分配到不同主节点;
- 每个主节点对应至少 1 个从节点,主节点故障后,从节点自动升级,保证高可用;
- 集群总线负责节点通信、故障检测和槽位同步,是集群正常运行的基础;
- 支持动态扩容/缩容,核心是槽位迁移,全程无需停机;
- 默认最终一致性,可通过配置提升数据一致性,适合大规模、高并发、需扩容的业务场景。
生产环境中,需根据业务数据量和并发量,合理规划主从节点数量,做好配置调优和故障排查,确保集群稳定运行。若业务规模较小,可优先选择「主从+哨兵」架构;若数据量较大、需要扩容,则首选 Redis 集群。

浙公网安备 33010602011771号