用途:选择部署形态、理解 MOVED/ASK 与跨 slot 限制
| 形态 |
能力 |
容量 |
复杂度 |
| 主从(replication) |
读扩展、故障需人工切换 |
单实例内存上限 |
低 |
| 哨兵(Sentinel) |
自动故障检测与选主、客户端发现 |
仍是单实例写容量 |
中 |
| Cluster |
数据分片(16384 slot)+ 主从 + 自动故障转移 |
水平扩展写容量 |
高 |
- 全量同步:
PSYNC 基于复制偏移量 + 运行 ID;不可续传时回退全量(fork + RDB 传输 + 缓冲命令重放)。
- 增量(部分重同步)依赖
repl-backlog-size,太小会频繁全量同步(网络抖动后尤其明显)。
- 异步复制:主库写完即返回,从库可能落后 → 故障切换丢数据。
- 读写分离风险:
min-replicas-to-write / max-lag 可限制落后副本,避免过度延迟时仍写入。
职责:监控、通知、自动故障转移、配置提供。要点:
- 哨兵本身需奇数个(≥3)才能就故障达成一致,且应部署在不同物理机/可用区。
- 故障转移会改变客户端连接目标,客户端必须支持哨兵协议(多数客户端支持)。
- “脑裂”场景下旧主恢复后可能收到过写请求,需要
min-replicas-to-write 缓解。
- slot 与 key:
CRC16(key) mod 16384。多 key 操作(MSET、Lua、事务)要求同 slot,用 hash tag({user1000}.profile)强制同槽。
- MOVED vs ASK:
MOVED 表示 slot 已永久迁移,客户端应更新映射;ASK 表示迁移进行中,本次去目标节点重试。
- 无数据库概念:只有 db0;
SELECT 不可用。
- 不支持跨 slot 的
KEYS/SCAN 全库语义(需遍历节点)。
- 扩缩容:slot 迁移期间存在 ASK 重定向,客户端要正确处理;迁移粒度与流量峰值需协调。
- 热点仍在单节点:分片解决容量,不解决单 key 热点(要拆 key 或加本地缓存)。
| 场景 |
建议 |
| 数据量 < 单实例内存、可用性要求高 |
主从 + 哨兵 |
| 容量或带宽超单实例 |
Cluster(并接受多 key 操作受限) |
| 云托管、少运维 |
云 Redis(多为代理模式,对客户端透明,但注意其限制) |
| 只读缓存、允许穿透 |
多主无复制也可,配合本地缓存与限流 |
| 误区 |
修正 |
| Cluster 一定比哨兵好 |
复杂度与限制显著增加,容量够就别分片 |
| 多 key 操作在 Cluster 下随意用 |
必须 hash tag 或改造为单 key 操作 |
| 客户端不支持重定向 |
用成熟客户端,并测试 MOVED/ASK 处理 |
| 忽视连接数放大 |
客户端会为每个节点建连接 |
| 认为哨兵能保证不丢数据 |
复制是异步的,仍可能丢 |
- Redis 官方文档:Replication、Sentinel、Redis Cluster spec
- 《Redis 设计与实现》集群与复制章节