Redis 高可用与分布式架构

从主从复制到集群模式,全面掌握 Redis 四种核心架构设计思路与实践要点

主从复制 读写分离 哨兵 Sentinel Cluster 集群
🔄

① 主从复制(Replication)

一个主节点 + 多个从节点,实现数据实时同步备份

架构示意图
MASTER
主节点
读 & 写
全量复制
增量同步
增量同步
SLAVE 1
从节点
只读
SLAVE 2
从节点
只读
SLAVE 3
从节点
只读

🔁 同步流程详解

1

初始连接 — 全量复制(Full Resync)

从节点发送 REPLICAOF 命令,主节点执行 BGSAVE 生成 RDB 快照,并将快照发送给从节点完成全量数据加载。

2

持续同步 — 增量复制(Partial Resync)

主节点将写操作写入 replication backlog 缓冲区,并通过异步方式实时推送给从节点,从节点依次回放命令。

3

断线重连 — 部分重同步(PSYNC)

从节点断连后重新连接,携带 replId + offset,若 backlog 中仍有对应数据,主节点只补发缺失部分,避免全量重传。

4

心跳检测

从节点每秒发送 REPLCONF ACK <offset>,主节点借此确认从节点存活并掌握同步进度。

✅ 优缺点

优点

  • 数据多副本,增强容灾能力
  • 从节点可承担读请求,分摊主节点压力
  • 配置简单,易于理解和维护
  • 支持级联复制(从→从)

缺点

  • 主节点宕机需手动切换,无法自动故障转移
  • 异步复制存在数据延迟,可能丢失少量数据
  • 全量同步时主节点 I/O 压力较大
  • 写操作仍集中在主节点,写性能无法扩展

📌 适用场景

数据备份 读多写少业务 灾难恢复 作为哨兵/集群基础
↔️

② 读写分离(Read/Write Splitting)

主节点专注写操作,从节点承担读请求,合理利用集群资源

读写路由示意
🖥️ 客户端(Client)
✏️ 写操作(SET / DEL...)
MASTER
主节点
处理所有写请求
📖 读操作(GET / SCAN...)
SLAVE 1
从节点
SLAVE 2
从节点
SLAVE 3
从节点

🔧 客户端实现

应用层自己维护主从地址,根据命令类型路由:

写命令 → 主节点

SET、DEL、INCR、LPUSH 等变更操作统一发送主节点

读命令 → 从节点

GET、HGET、LRANGE 等查询操作分发至从节点,可轮询或按权重

🔩 代理层实现

通过中间件自动路由,应用无感知:

Twemproxy / Codis

代理节点解析命令,自动将读请求路由到从节点

ProxySQL / Nginx

通用代理方案,通过规则匹配实现读写路由分发

⚠️ 关键注意事项

主从延迟风险

写入主节点后立即从从节点读取,可能读到旧数据(脏读)。对强一致性要求高的场景,读操作应走主节点。

过期键问题

从节点不主动删除过期键,需等主节点 DEL 命令同步过来。读从节点时可能读到已逻辑过期的数据。

负载均衡策略

多个从节点需合理分配读请求。可按轮询、随机、权重或就近原则进行负载均衡。

🛡️

③ 哨兵模式(Sentinel)

监控 + 自动故障转移,实现 Redis 高可用,无需人工干预

哨兵架构示意(推荐 3 个哨兵节点)
SENTINEL
哨兵 1
SENTINEL
哨兵 2
SENTINEL
哨兵 3
↕ 持续监控(PING / 订阅频道)
MASTER
主节点
SLAVE 1
从节点
SLAVE 2
从节点
⚡ 主节点下线 → 自动选举新主节点

⚡ 故障转移全流程

1

主观下线(SDOWN)

哨兵向主节点发送 PING,超过 down-after-milliseconds 毫秒无响应,该哨兵标记主节点为"主观下线"。

2

客观下线(ODOWN)

哨兵询问其他哨兵是否也认为主节点已下线,当认同数量达到 quorum 阈值,标记为"客观下线",触发故障转移。

3

哨兵 Leader 选举(Raft)

多个哨兵中通过 Raft 算法选出 Leader,由 Leader 哨兵负责执行本次故障转移操作。

4

选举新主节点

Leader 哨兵按优先级(slave-priority → 复制偏移量最大 → runID 最小)从从节点中选出新主节点。

5

故障转移完成 & 通知

新主节点晋升,其余从节点重新指向新主,哨兵通过 __sentinel__:hello 频道通知客户端更新连接信息。

⚙️ 关键配置项

quorum(法定人数)

判定主节点客观下线需要多少哨兵同意,建议设为 ⌈N/2⌉+1,N 为哨兵总数。

down-after-milliseconds

超过此毫秒数无响应则认为节点下线,默认 30000ms,根据网络情况调整。

parallel-syncs

故障转移时同时向新主节点发起同步的从节点数,设 1 可降低对主节点的冲击。

✅ 优缺点

优点

  • 自动化故障转移,无需人工干预
  • 客户端可通过哨兵发现新主节点
  • 监控、通知、配置提供者三合一

缺点

  • 不支持数据分片,写瓶颈依然存在
  • 故障转移期间短暂不可用(秒级)
  • 哨兵本身也需要做高可用部署
  • 存储容量受单节点内存限制
🌐

④ 集群模式(Redis Cluster)

数据分片 + 去中心化,支持水平扩展,官方分布式解决方案

Redis Cluster 架构示意(3 主 3 从 = 最小推荐配置)
🖥️ Client 1
🖥️ Client 2
🖥️ Client 3
↕ Gossip 协议(节点间互相通信)
Shard 1
Slots:0 ~ 5460
主 Master-1
从 Slave-1
Shard 2
Slots:5461 ~ 10922
主 Master-2
从 Slave-2
Shard 3
Slots:10923 ~ 16383
主 Master-3
从 Slave-3

🔑 核心原理:Hash Slot 数据分片

Redis Cluster 将数据空间划分为 16384 个 Hash Slot,每个主节点负责其中一部分。

CRC16 计算

对 key(或 key 中 {} 括起的 hash tag)做 CRC16 运算,再 mod 16384 得到 slot 编号。

路由跳转(MOVED / ASK)

客户端访问错误节点时,收到 MOVED 重定向;迁移中收到 ASK,一次性转向目标节点。

在线扩缩容

新增节点时,通过 CLUSTER MEET 加入集群,再手动或自动迁移部分 slot,业务无感知。

Gossip 协议

节点间通过 Gossip 消息互相交换状态,发现节点故障后投票选举,自动完成故障转移。

🏥 集群内置故障自愈

1

节点探活

每个节点定期向随机节点发 PING,超时未收到 PONG 则标记对方为 PFAIL(疑似下线)。

2

确认下线(FAIL)

当集群内超过半数主节点都认为某主节点 PFAIL,则广播 FAIL 消息确认下线。

3

从节点选举并晋升

该主节点的从节点发起选举,获得超过半数主节点投票后晋升为新主节点,自动接管其 slot。

✅ 优缺点

优点

  • 水平扩展,突破单节点内存瓶颈
  • 读写均可线性扩展,高性能
  • 内置高可用,自动故障转移
  • 无中心化,无单点瓶颈

局限

  • 不支持跨 slot 的多 key 事务
  • Lua 脚本中所有 key 须在同一 slot
  • 运维复杂度较高,节点数量较多
  • 数据迁移期间性能会有所下降

🏗️ 部署建议

最少 6 个节点

3 主 3 从,满足多数派选举(majority)和高可用要求的最小配置。

跨机架/机房部署

将主从节点分布在不同物理节点,避免单机故障导致整个 shard 不可用。

合理规划 Slot 分布

扩容时提前预规划 slot 分布,使用 redis-cli --cluster rebalance 自动均衡。

📊

⑤ 四种架构横向对比

一表看清各架构的差异,快速选型

维度 🔄 主从复制 ↔️ 读写分离 🛡️ 哨兵模式 🌐 集群模式
高可用 手动切换 手动切换 自动故障转移 自动故障转移
数据分片 不支持 不支持 不支持 支持(16384 Slot)
水平扩写 不支持 不支持 不支持 支持
读扩展 手动路由 支持 手动路由 支持
配置复杂度 ⭐ 简单 ⭐⭐ 中等 ⭐⭐⭐ 中高 ⭐⭐⭐⭐ 较高
最少节点数 2(1主1从) 2(1主1从) 3 哨兵 + 2 Redis 6(3主3从)
数据一致性 最终一致 最终一致 最终一致 最终一致
典型适用场景 备份、灾恢 读密集型业务 中小规模高可用 大规模、高并发

🎯 如何选型?

数据量小 + 简单备份

直接用主从复制即可,配置最简单,成本最低。

读压力大,写压力小

主从复制 + 读写分离,利用从节点分摊读流量,性价比高。

需要自动高可用,数据量适中

哨兵模式是最经典选择,自动故障转移,配置运维相对简单。

海量数据 + 高并发写

Redis Cluster 是唯一选择,数据分片突破单节点瓶颈,支持水平扩展。