在 Redis 的部署方案中,主从+哨兵和 Cluster 是两种主流选择。
🏛️ 主从 + 哨兵模式 (Master-Slave + Sentinel)
此方案是在主从复制基础上,增加了哨兵进程以实现自动故障转移,是官方推荐的高可用方案之一。
核心架构
- 主从复制:一个主节点(Master)处理所有写请求,多个从节点(Slave)通过异步复制同步数据,用于读负载和备份。
- 哨兵集群:部署 3 个或更多独立的哨兵进程,负责监控主从状态、执行故障转移(选举新主)并通知客户端新主地址。
适用场景
- 数据量中等:单个 Redis 实例(几十GB内)能容纳全部数据,瓶颈在于内存而非 CPU/网络。
- 高可用需求:业务不能接受手动切换主从,需要自动故障转移。
- 读多写少:希望通过读写分离提升读吞吐量。
- 运维能力中等:团队能接受哨兵带来的额外运维复杂度,但希望避免集群模式的复杂性。
配置要点
- Redis 主从配置
- 主节点:默认配置即可,建议开启持久化(RDB/AOF)。
- 从节点:在
redis.conf中设置replicaof <master_ip> <master_port>,并设为只读replica-read-only yes。
- 哨兵配置 (sentinel.conf)
- 监控:
sentinel monitor mymaster <master_ip> <master_port> <quorum>。quorum通常设为哨兵总数的一半加一(如3个哨兵设为2)。 - 超时:
sentinel down-after-milliseconds mymaster 30000(30秒无响应判为下线)。 - 故障转移:
sentinel failover-timeout mymaster 180000(故障转移超时时间)。 - 同步:
sentinel parallel-syncs mymaster 1(故障后一次只同步一个从节点,减轻新主压力)。
- 监控:
- 客户端接入
- 使用支持 Sentinel 的客户端,配置
master-name和所有sentinel节点地址。客户端会自动发现并连接当前的主节点。
- 使用支持 Sentinel 的客户端,配置
🧩 Redis Cluster 模式
这是 Redis 官方的分布式解决方案,通过数据分片(Sharding)实现存储和性能的横向扩展。
核心架构
- 数据分片:所有数据被映射到 16384 个哈希槽(Hash Slot)中,这些槽被分配给不同的主节点。
- 主从复制:每个主节点可拥有一个或多个从节点,主节点故障时,其从节点会自动提升为主节点。
- 去中心化:集群中的节点通过 Gossip 协议通信,客户端可直接连接任意节点,由节点通过
MOVED或ASK重定向到正确的目标节点。
适用场景
- 数据量大:单个实例内存无法容纳全部数据(如达到上百GB或TB级别)。
- 高并发:单个 Redis 实例的 QPS 或网络带宽达到瓶颈,需要水平扩展。
- 高可用:要求数据分片和高可用,且希望架构能随业务增长灵活扩容。
- 运维能力强:团队具备管理复杂集群的经验和能力。
配置要点
- 节点配置 (redis.conf)
- 启用集群模式:
cluster-enabled yes。 - 指定集群配置文件:
cluster-config-file nodes-6379.conf。 - 设置节点超时时间:
cluster-node-timeout 15000(毫秒)。 - 建议开启 AOF 持久化:
appendonly yes。
- 启用集群模式:
- 创建集群
使用
redis-cli --cluster create命令创建集群。例如,6个节点(3主3从)的命令如下:
bash
redis-cli --cluster create
192.168.1.10:7000 192.168.1.11:7001 192.168.1.12:7002
192.168.1.13:7003 192.168.1.14:7004 192.168.1.15:7005
–cluster-replicas 1--cluster-replicas 1表示每个主节点拥有1个从节点。
- 客户端接入
- 客户端必须使用支持 Redis Cluster 的驱动。
- 客户端会缓存槽位映射关系,直接路由请求,或在遇到
MOVED/ASK重定向时自动更新。
⚖️ 核心差异与选型指南
| 对比维度 | 主从 + 哨兵 | Redis Cluster |
|---|---|---|
| 数据分片 | ❌不支持,所有数据存于单个主节点。 | ✅支持,数据自动分片到多个主节点。 |
| 扩展方式 | 垂直扩展(升级单机硬件)。 | 水平扩展(增加新节点)。 |
| 高可用 | ✅支持,哨兵实现自动故障转移。 | ✅支持,每个分片内主从自动故障转移。 |
| 客户端复杂度 | 中等,需支持 Sentinel 协议。 | 较高,需支持 Cluster 协议和重定向。 |
| 运维复杂度 | 中等,需维护主从+哨兵两组进程。 | 高,需管理分片、槽位、迁移等。 |
| 事务/Lua 脚本 | ✅无限制。 | ⚠️受限,多 Key 操作需在同一槽位。 |
| 适用数据规模 | 中小规模(GB级)。 | 大规模(TB级)。 |
一句话选型建议:
- 数据能装下单机,但要高可用→主从 + 哨兵
- 数据量巨大或 QPS 极高,需水平扩展→Redis Cluster
🚀 针对分布式限流的实践建议
结合之前的分布式限流场景:
- 若限流规则数量不多,且 QPS 在单机可承受范围内,使用主从 + 哨兵模式,将 Lua 脚本部署在任一主节点上即可。
- 若限流维度非常细(如海量用户、接口),导致单个 Reis 实例压力过大,则应考虑使用Redis Cluster模式,将不同的 Key 分布到不同分片,实现真正的水平扩展。