跳转到内容

主从、哨兵与 Cluster

用途:选择部署形态、理解 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 缓解。
  1. slot 与 key:CRC16(key) mod 16384。多 key 操作(MSET、Lua、事务)要求同 slot,用 hash tag({user1000}.profile)强制同槽。
  2. MOVED vs ASK:MOVED 表示 slot 已永久迁移,客户端应更新映射;ASK 表示迁移进行中,本次去目标节点重试。
  3. 无数据库概念:只有 db0;SELECT 不可用。
  4. 不支持跨 slot 的 KEYS/SCAN 全库语义(需遍历节点)。
  5. 扩缩容:slot 迁移期间存在 ASK 重定向,客户端要正确处理;迁移粒度与流量峰值需协调。
  6. 热点仍在单节点:分片解决容量,不解决单 key 热点(要拆 key 或加本地缓存)。
场景 建议
数据量 < 单实例内存、可用性要求高 主从 + 哨兵
容量或带宽超单实例 Cluster(并接受多 key 操作受限)
云托管、少运维 云 Redis(多为代理模式,对客户端透明,但注意其限制)
只读缓存、允许穿透 多主无复制也可,配合本地缓存与限流
误区 修正
Cluster 一定比哨兵好 复杂度与限制显著增加,容量够就别分片
多 key 操作在 Cluster 下随意用 必须 hash tag 或改造为单 key 操作
客户端不支持重定向 用成熟客户端,并测试 MOVED/ASK 处理
忽视连接数放大 客户端会为每个节点建连接
认为哨兵能保证不丢数据 复制是异步的,仍可能丢
  • Redis 官方文档:Replication、Sentinel、Redis Cluster spec
  • 《Redis 设计与实现》集群与复制章节