【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)

Client Master Replica 从节点启动同步 1. REPLICAOF <master_ip> <port> 2. +OK (握手确认) 发起PSYNC请求 3. PSYNC ? -1 (首次同步) 全量同步触发 4. BGSAVE (生成RDB快照) 5. 缓存新写命令到repl_buffer RDB传输阶段 6. 发送RDB文件 7. 清空旧数据,加载RDB 同步缓冲命令 8. 发送repl_buffer中的写命令 9. 执行命令,追上主节点 进入增量同步阶段 10. 持续异步传播新写命令 Client Master Replica

增量同步(Partial Sync)

Client Master Replica 正常同步阶段 持续异步传播写命令 定期ACK确认偏移量(offset) 网络中断 连接断开 记录写命令到repl_backlog(环形缓冲区) 网络恢复 重新建立连接 PSYNC <replid> <offset> +CONTINUE (允许增量同步) 发送offset之后的写命令 执行增量命令,追上主节点 +FULLRESYNC (触发全量同步) 进入全量同步流程... alt [偏移量在repl_backlog范围内] [偏移量已溢出] 恢复异步复制 持续传播新写命令 Client Master Replica

哨兵模式(Sentinel)

核心作用

Redis 哨兵(Sentinel)是官方提供的 高可用(HA)解决方案,主要用于监控、管理和保护 Redis 主从架构,确保服务在故障时自动恢复。解决了高可用的问题。

主节点故障检测与自动故障转移(Failover)

  • 持续监控主节点(Master)和从节点(Replica):哨兵会定期向所有节点发送 PING 命令,检测其存活状态。

  • 判定主节点下线:
    主观下线(SDOWN):单个哨兵认为主节点不可用(如超时未响应)。
    客观下线(ODOWN):当多数哨兵(配置的 quorum 数量)确认主节点下线,触发故障转移。

  • 选举新主节点:
    哨兵集群通过 Raft 算法 协商,从从节点中选举一个最优节点(如复制偏移量最新)晋升为新主节点。

  • 自动切换配置:
    哨兵会通知客户端和其他从节点新的主节点地址,更新全局配置。

脑裂

网络分区
quorum达成
quorum未达成
正常状态: 1个主节点 + N个从节点
网络断开
哨兵集群检测主节点失联
哨兵决策
选举新主节点
维持原状
两个主节点并存
客户端A写入原主节点
客户端B写入新主节点
数据不一致

在 Redis 主从架构中,当主节点(Master)与哨兵(Sentinel)/从节点(Replica)之间的网络突然断开(但客户端仍可连接主节点),系统可能错误地认为主节点已宕机,从而选举出新主节点。此时会出现:

原主节点:仍在接收写请求(但无法同步到从节点)

新主节点:开始接收新写请求

结果导致 两个主节点同时写入数据,造成严重的数据不一致。

脑裂的解决方案

# 从节点最小写入要求(主节点必须至少有 N 个从节点连接才能接受写操作)
min-replicas-to-write <number>
# 从节点最大延迟(允许从节点复制的最大延迟时间(秒))
min-replicas-max-lag <seconds>

分片集群(Cluster)

主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:

  • 海量数据存储问题
  • 高并发写的问题
Shard Cluster
Shard 1
Shard 2
Shard 3
Ping (心跳)
Ping (心跳)
Ping (心跳)
Ping (心跳)
Ping (心跳)
Ping (心跳)
Slave 3-1
Master 3
Slave 3-2
Slave 2-1
Master 2
Slave 2-2
Slave 1-1
Master 1
Slave 1-2

使用分片集群可以解决上述问题,分片集群特征:

  • 集群中有多个master,每个master保存不同数据
  • 每个master都可以有多个slave节点
  • master之间通过ping监测彼此健康状态
  • 客户端请求可以访问集群任意节点,最终都会被转发到正确节点

分片集群结构——数据读写

Client Master1 Master2 Slaves SET user:1001 "Alice" 计算CRC16("user:1001") mod 16384 → 槽位5798 执行写入 异步复制数据 +OK MOVED 5798 192.168.1.2:6379 SET user:1001 "Alice" +OK alt [槽位属于当前节点] [槽位不属于当前节点] Client Master1 Master2 Slaves

关键点:
​​- 槽位计算​​:使用CRC16算法计算key的哈希值,取模16384得到槽位号
​​- 槽位检查​​:节点检查槽位是否由自己负责

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值