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
6382
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 会根据「键的哈希值」计算出对应的槽位,再根据槽位找到对应的主节点,流程如下:
  1. 客户端向任意一个集群节点发送请求(如 SET key value);
  2. 该节点计算 key 的哈希值:CRC16(key) % 16384,得到对应的槽位 slot;
  3. 节点查询「槽位-主节点」映射表,判断该槽位属于哪个主节点;
  4. 若当前节点就是该槽位的主节点,直接执行请求,返回结果;
  5. 若当前节点不是该槽位的主节点,返回「MOVED 错误」,告知客户端该槽位对应的主节点 IP 和端口;
  6. 客户端收到 MOVED 错误后,重新向目标主节点发送请求,完成读写操作。
补充:客户端可通过「集群模式连接」(如 Redis-cli -c),自动处理 MOVED 错误,无需手动切换节点。

2. 故障检测与自动故障切换机制

Redis 集群无需哨兵,自身集成故障检测和自动故障切换能力,核心依赖「心跳机制」和「投票机制」,流程与哨兵类似,但更高效:

(1)故障检测(节点下线判断)

  1. 集群中每个节点都会通过集群总线,向其他所有节点发送 PING 心跳(默认每 1 秒一次);
  2. 若某个节点(如 Master1)超过「cluster-node-timeout」时间(默认 15000 毫秒,15 秒)未响应 PING,发送方会将其标记为「疑似下线(PFAIL)」;
  3. 发送方会将「疑似下线」信息,通过集群总线同步到其他节点;
  4. 若超过「半数主节点」都将该节点标记为 PFAIL,则该节点被判定为「确定下线(FAIL)」,并将 FAIL 信息同步到所有节点。

(2)自动故障切换(主节点故障后)

当主节点被判定为 FAIL 后,其对应的从节点会自动发起选举,升级为新主节点,流程如下:
  1. 故障主节点的所有从节点,会竞争成为新主节点(类似哨兵领导者选举);
  2. 每个从节点会向集群中所有主节点发送「投票请求」,请求成为新主节点;
  3. 集群中其他主节点,会根据从节点的「同步进度」(偏移量 offset)投票,同步进度越完整,优先级越高;
  4. 获得超过半数主节点投票的从节点,升级为新主节点;
  5. 新主节点会接管原主节点的所有槽位,并通过集群总线,将「槽位-新主节点」的映射关系同步到所有节点;
  6. 其他从节点(原故障主节点的其他从节点),会自动同步新主节点的数据;
  7. 若原故障主节点后续恢复上线,会自动成为新主节点的从节点,不再作为主节点。
补充:故障切换时间通常在 15-30 秒(取决于 cluster-node-timeout 配置),期间该槽位对应的读写请求会暂时失败,客户端可通过重试机制应对。

3. 扩容与缩容机制(核心:槽位迁移)

Redis 集群支持动态扩容(新增节点)和缩容(删除节点),核心是「槽位迁移」——将原有主节点的槽位,迁移到新节点(扩容)或其他节点(缩容),全程无需停机,不影响业务正常运行。

(1)扩容流程(新增主节点)

  1. 启动新的 Redis 节点,配置集群模式(修改 redis.conf,开启 cluster-enabled yes);
  2. 将新节点加入集群(通过 cluster meet 命令,让新节点与集群中任意一个节点建立连接);
  3. 将新节点设置为主节点(默认新节点为从节点,需通过 cluster replicate 命令取消从节点身份);
  4. 执行「槽位迁移」:将原有主节点的部分槽位,迁移到新主节点(通过 cluster reshard 命令,手动或自动分配槽位);
  5. 槽位迁移完成后,更新集群中所有节点的「槽位-主节点」映射表;
  6. (可选)为新主节点添加从节点,确保高可用。

(2)缩容流程(删除主节点)

  1. 执行「槽位迁移」:将待删除主节点的所有槽位,迁移到集群中其他主节点;
  2. 槽位迁移完成后,待删除主节点不再负责任何槽位;
  3. 将待删除主节点的从节点,重新关联到其他主节点(作为其他主节点的从节点);
  4. 执行 cluster forget 命令,将待删除节点从集群中移除;
  5. 停止该节点的 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. 部署步骤

  1. 创建节点目录(用于存放每个节点的配置文件、日志、数据): mkdir -p /usr/local/redis/cluster/{6379,6380,6381,6382,6383,6384}
  2. 复制 Redis 配置文件到每个节点目录,并修改核心配置(以 6379 节点为例): # 复制配置文件 cp /etc/redis/redis.conf /usr/local/redis/cluster/6379/ # 修改配置文件(vi /usr/local/redis/cluster/6379/redis.conf) daemonize yes port 6379 dir /usr/local/redis/cluster/6379 logfile /usr/local/redis/cluster/6379/redis.log cluster-enabled yes cluster-config-file nodes-6379.conf cluster-node-timeout 15000 min-replicas-to-write 1 requirepass 123456 # 可选,推荐配置密码 masterauth 123456 # 与 requirepass 一致其他 5 个节点,按上述配置修改,仅需修改「port、dir、logfile、cluster-config-file」四个参数(对应各自端口)。
  3. 启动所有 6 个节点: redis-server /usr/local/redis/cluster/6379/redis.conf redis-server /usr/local/redis/cluster/6380/redis.conf redis-server /usr/local/redis/cluster/6381/redis.conf redis-server /usr/local/redis/cluster/6382/redis.conf redis-server /usr/local/redis/cluster/6383/redis.conf redis-server /usr/local/redis/cluster/6384/redis.conf验证启动:ps -ef | grep redis,确保 6 个进程都在运行。
  4. 创建集群(将 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 会自动分配主从关系和槽位。
  5. 验证集群状态: # 集群模式登录节点 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. 核心避坑点

  1. 节点数量要求:至少 3 个主节点,每个主节点至少 1 个从节点,否则集群无法正常工作(无法完成故障投票);
  2. 端口开放:除了 Redis 节点端口(6379-6384),还需开放集群总线端口(16379-16384),否则节点之间无法通信;
  3. 密码一致性:所有节点的 requirepass 和 masterauth 必须一致,否则主从同步失败、集群通信失败;
  4. 槽位分配完整:16384 个槽位必须全部分配给主节点,若有槽位未分配,集群状态会变为 fail,无法执行读写操作;
  5. 避免脑裂:确保 cluster-node-timeout 配置合理(推荐 15-30 秒),避免网络波动导致误判节点故障,引发脑裂;
  6. 扩容/缩容注意事项:槽位迁移时,避免大量槽位同时迁移,防止影响业务性能;迁移完成后,务必验证槽位分配和数据一致性。

2. 常见问题排查

  1. 集群状态为 fail:排查槽位是否分配完整、主节点数量是否足够、节点之间是否能正常通信(集群总线端口是否开放);
  2. 主从同步失败:检查密码是否一致、主节点是否正常运行、从节点配置的 masterauth 是否正确;
  3. 客户端无法连接集群:检查节点端口和集群总线端口是否开放、客户端是否采用集群模式连接(-c 参数)、密码是否正确;
  4. 故障切换失败:检查故障主节点的从节点是否正常、主节点数量是否足够(至少 3 个)、cluster-node-timeout 配置是否合理。

七、总结

Redis 集群是大规模 Redis 部署的核心方案,核心逻辑是「分片存储+主从复制+自动故障切换」,无需依赖哨兵,自身实现高可用和负载均衡。
核心要点总结:
  • 16384 个槽位是分片的核心,数据通过哈希计算分配到不同主节点;
  • 每个主节点对应至少 1 个从节点,主节点故障后,从节点自动升级,保证高可用;
  • 集群总线负责节点通信、故障检测和槽位同步,是集群正常运行的基础;
  • 支持动态扩容/缩容,核心是槽位迁移,全程无需停机;
  • 默认最终一致性,可通过配置提升数据一致性,适合大规模、高并发、需扩容的业务场景。
生产环境中,需根据业务数据量和并发量,合理规划主从节点数量,做好配置调优和故障排查,确保集群稳定运行。若业务规模较小,可优先选择「主从+哨兵」架构;若数据量较大、需要扩容,则首选 Redis 集群。
posted @ 2026-03-14 20:25  ConfidentLiu  阅读(102)  评论(0)    收藏  举报