从主从复制到集群模式,全面掌握 Redis 四种核心架构设计思路与实践要点
一个主节点 + 多个从节点,实现数据实时同步备份
从节点发送 REPLICAOF 命令,主节点执行 BGSAVE 生成 RDB 快照,并将快照发送给从节点完成全量数据加载。
主节点将写操作写入 replication backlog 缓冲区,并通过异步方式实时推送给从节点,从节点依次回放命令。
从节点断连后重新连接,携带 replId + offset,若 backlog 中仍有对应数据,主节点只补发缺失部分,避免全量重传。
从节点每秒发送 REPLCONF ACK <offset>,主节点借此确认从节点存活并掌握同步进度。
主节点专注写操作,从节点承担读请求,合理利用集群资源
应用层自己维护主从地址,根据命令类型路由:
SET、DEL、INCR、LPUSH 等变更操作统一发送主节点
GET、HGET、LRANGE 等查询操作分发至从节点,可轮询或按权重
通过中间件自动路由,应用无感知:
代理节点解析命令,自动将读请求路由到从节点
通用代理方案,通过规则匹配实现读写路由分发
写入主节点后立即从从节点读取,可能读到旧数据(脏读)。对强一致性要求高的场景,读操作应走主节点。
从节点不主动删除过期键,需等主节点 DEL 命令同步过来。读从节点时可能读到已逻辑过期的数据。
多个从节点需合理分配读请求。可按轮询、随机、权重或就近原则进行负载均衡。
监控 + 自动故障转移,实现 Redis 高可用,无需人工干预
哨兵向主节点发送 PING,超过 down-after-milliseconds 毫秒无响应,该哨兵标记主节点为"主观下线"。
哨兵询问其他哨兵是否也认为主节点已下线,当认同数量达到 quorum 阈值,标记为"客观下线",触发故障转移。
多个哨兵中通过 Raft 算法选出 Leader,由 Leader 哨兵负责执行本次故障转移操作。
Leader 哨兵按优先级(slave-priority → 复制偏移量最大 → runID 最小)从从节点中选出新主节点。
新主节点晋升,其余从节点重新指向新主,哨兵通过 __sentinel__:hello 频道通知客户端更新连接信息。
判定主节点客观下线需要多少哨兵同意,建议设为 ⌈N/2⌉+1,N 为哨兵总数。
超过此毫秒数无响应则认为节点下线,默认 30000ms,根据网络情况调整。
故障转移时同时向新主节点发起同步的从节点数,设 1 可降低对主节点的冲击。
数据分片 + 去中心化,支持水平扩展,官方分布式解决方案
Redis Cluster 将数据空间划分为 16384 个 Hash Slot,每个主节点负责其中一部分。
对 key(或 key 中 {} 括起的 hash tag)做 CRC16 运算,再 mod 16384 得到 slot 编号。
客户端访问错误节点时,收到 MOVED 重定向;迁移中收到 ASK,一次性转向目标节点。
新增节点时,通过 CLUSTER MEET 加入集群,再手动或自动迁移部分 slot,业务无感知。
节点间通过 Gossip 消息互相交换状态,发现节点故障后投票选举,自动完成故障转移。
每个节点定期向随机节点发 PING,超时未收到 PONG 则标记对方为 PFAIL(疑似下线)。
当集群内超过半数主节点都认为某主节点 PFAIL,则广播 FAIL 消息确认下线。
该主节点的从节点发起选举,获得超过半数主节点投票后晋升为新主节点,自动接管其 slot。
3 主 3 从,满足多数派选举(majority)和高可用要求的最小配置。
将主从节点分布在不同物理节点,避免单机故障导致整个 shard 不可用。
扩容时提前预规划 slot 分布,使用 redis-cli --cluster rebalance 自动均衡。
一表看清各架构的差异,快速选型
| 维度 | 🔄 主从复制 | ↔️ 读写分离 | 🛡️ 哨兵模式 | 🌐 集群模式 |
|---|---|---|---|---|
| 高可用 | 手动切换 | 手动切换 | 自动故障转移 | 自动故障转移 |
| 数据分片 | 不支持 | 不支持 | 不支持 | 支持(16384 Slot) |
| 水平扩写 | 不支持 | 不支持 | 不支持 | 支持 |
| 读扩展 | 手动路由 | 支持 | 手动路由 | 支持 |
| 配置复杂度 | ⭐ 简单 | ⭐⭐ 中等 | ⭐⭐⭐ 中高 | ⭐⭐⭐⭐ 较高 |
| 最少节点数 | 2(1主1从) | 2(1主1从) | 3 哨兵 + 2 Redis | 6(3主3从) |
| 数据一致性 | 最终一致 | 最终一致 | 最终一致 | 最终一致 |
| 典型适用场景 | 备份、灾恢 | 读密集型业务 | 中小规模高可用 | 大规模、高并发 |
直接用主从复制即可,配置最简单,成本最低。
主从复制 + 读写分离,利用从节点分摊读流量,性价比高。
哨兵模式是最经典选择,自动故障转移,配置运维相对简单。
Redis Cluster 是唯一选择,数据分片突破单节点瓶颈,支持水平扩展。