Redis三种集群方案
主从复制(Replication)
背景
在早期的 Redis 版本中,Redis 是一个单机内存数据库,所有数据存储在单个节点上。虽然 Redis 本身性能极高(单机可达 10万+ QPS (Queries Per Second)),但随着业务增长,单机架构面临以下问题:
1.单点故障(SPOF, Single Point of Failure)
- 如果 Redis 主节点宕机,整个服务不可用,影响业务连续性。
- 数据丢失风险:如果主节点崩溃且未持久化,内存中的数据会全部丢失。
2.读写压力集中
- 所有读写请求都由单个节点处理,高并发场景下容易成为瓶颈。
- 特别是读多写少的业务(如缓存、排行榜、商品详情页),单节点难以支撑高 QPS(Queries Per Second)。
3.数据备份困难
- 虽然 Redis 支持 RDB(快照)和 AOF(日志)持久化,但恢复数据需要时间,无法实现实时热备。
- 人工备份方式(如 BGSAVE)无法满足高可用需求。
主从复制的诞生:解决单机 Redis 的痛点
为了应对上述问题,Redis 在 2.8 版本 正式引入了主从复制(Replication)机制,核心目标包括:
✅ 数据冗余(Data Redundancy)
- 从节点(Slave/Replica)实时或异步复制主节点(Master)的数据,避免单点数据丢失。
✅ 读写分离(Read/Write Splitting)
- 主节点负责写操作(SET、DEL 等),从节点负责读操作(GET、LRANGE 等),提升整体吞吐量。
✅ 故障恢复(Failover)
- 虽然原生主从复制不提供自动故障转移,但结合哨兵(Sentinel)可实现自动主从切换,提高可用性。
✅ 负载均衡(Load Balancing)
- 多个从节点可以分担读请求,适用于高并发查询场景(如电商商品页、社交网络 feed 流)。
Redis 的主从数据同步分为 全量同步(Full Sync)
和 增量同步(Partial Sync)
两个阶段,核心目标是保证从节点(Replica)与主节点(Master)的数据一致性。Redis的主从复制解决了高并发读
的问题。
全量同步(Full Sync)
增量同步(Partial Sync)
哨兵模式(Sentinel)
核心作用
Redis 哨兵(Sentinel)是官方提供的 高可用(HA)解决方案,主要用于监控、管理和保护 Redis 主从架构,确保服务在故障时自动恢复
。解决了高可用
的问题。
主节点故障检测与自动故障转移(Failover)
-
持续监控主节点(Master)和从节点(Replica):哨兵会定期向所有节点发送 PING 命令,检测其存活状态。
-
判定主节点下线:
主观下线(SDOWN):单个哨兵认为主节点不可用(如超时未响应)。
客观下线(ODOWN):当多数哨兵(配置的 quorum 数量)确认主节点下线,触发故障转移。 -
选举新主节点:
哨兵集群通过 Raft 算法 协商,从从节点中选举一个最优节点(如复制偏移量最新)晋升为新主节点。 -
自动切换配置:
哨兵会通知客户端和其他从节点新的主节点地址,更新全局配置。
脑裂
在 Redis 主从架构中,当主节点(Master)与哨兵(Sentinel)/从节点(Replica)之间的网络突然断开(但客户端仍可连接主节点),系统可能错误地认为主节点已宕机,从而选举出新主节点。此时会出现:
原主节点:仍在接收写请求(但无法同步到从节点)
新主节点:开始接收新写请求
结果导致 两个主节点同时写入数据,造成严重的数据不一致。
脑裂的解决方案
# 从节点最小写入要求(主节点必须至少有 N 个从节点连接才能接受写操作)
min-replicas-to-write <number>
# 从节点最大延迟(允许从节点复制的最大延迟时间(秒))
min-replicas-max-lag <seconds>
分片集群(Cluster)
主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:
- 海量数据存储问题
- 高并发写的问题
使用分片集群可以解决上述问题,分片集群特征:
- 集群中有多个master,每个master保存不同数据
- 每个master都可以有多个slave节点
- master之间通过ping监测彼此健康状态
- 客户端请求可以访问集群任意节点,最终都会被转发到正确节点
分片集群结构——数据读写
关键点:
- 槽位计算:使用CRC16算法计算key的哈希值,取模16384得到槽位号
- 槽位检查:节点检查槽位是否由自己负责