跳到主要内容

Redis 持久化、复制与集群

Redis 的持久化用于进程重启后的数据恢复,复制用于保留副本并支持故障转移,Cluster 用哈希槽把 key 分布到多个主节点。三者解决的问题不同,也不能共同提供无条件的数据零丢失保证。

1. RDB 保存某个时间点的数据快照

RDB 会生成紧凑的二进制快照文件。它适合备份、灾难恢复和快速加载,也可以把生成快照的工作交给后台子进程,减少主进程直接执行磁盘 I/O。

RDB 的恢复点由快照频率决定。最近一次快照之后、故障之前的写入可能丢失。生成快照时还要考虑 fork 时间、写时复制带来的额外内存,以及磁盘写入带宽。

如果业务可以接受以分钟为单位的恢复点,RDB 配置和运维较简单;不能把定时快照理解为每条命令都已持久化。

2. AOF 记录修改数据的命令

AOF 把写命令追加到日志,并按配置策略调用 fsync。常见策略包括每次命令、每秒一次或交给操作系统决定。

  • 每次 fsync 的数据窗口最小,但磁盘延迟会直接影响写入。
  • 每秒 fsync 通常在性能与丢失窗口之间折中,进程或主机故障时可能丢失最近约一秒写入。
  • 不主动 fsync 性能较高,但恢复点依赖操作系统刷盘。

AOF 会随写入持续增长。Redis 可以在后台重写为重建当前数据集所需的较短命令序列。重写期间仍要观察内存和磁盘压力。

3. 同时启用 RDB 与 AOF 提供不同恢复手段

同时启用时,AOF 通常保存更完整的写入历史,Redis 重启会优先使用 AOF 恢复。RDB 仍可用于定期备份和更快的数据集加载场景。

持久化文件应经过实际恢复演练,并复制到独立故障域。文件存在不代表可用;磁盘损坏、错误配置和人工操作也可能同时影响运行实例与本地备份。

4. 复制默认是异步的

副本先与主节点同步数据,再持续接收主节点的写命令流。短暂断开后,若复制积压区仍保留需要的数据,可以进行部分重同步;否则需要重新传输完整数据集。

主节点向客户端确认写入时,副本可能尚未收到或落盘。若主节点随后故障并提升一个落后的副本,已经向客户端确认的写入仍可能丢失。

WAIT 可以要求写入传播到一定数量的副本后再返回,缩小数据丢失窗口,但在故障和网络分区下仍不把 Redis 变成强一致系统。

5. Sentinel 管理非分片主从故障转移

Sentinel 监控主从实例,在达到故障判定条件后选举新的主节点,并通知客户端更新地址。它提高单主数据集的可用性,但数据仍受异步复制窗口影响。

客户端必须支持 Sentinel 发现和连接切换。故障转移期间可能出现连接错误、短暂只读或旧主尚未停止服务等情况,业务仍需超时、重试和幂等处理。

6. Cluster 用 16384 个哈希槽分片

Redis Cluster 把 key 映射到 16384 个 hash slot,再把槽分配给不同主节点。每个主节点可以有副本,在主节点失败时参与故障转移。

客户端访问错误节点时,会收到 MOVED 重定向并更新槽位映射。槽迁移期间还可能收到 ASK,表示本次请求应临时转到新节点。客户端库需要正确处理拓扑刷新和重定向。

多 key 操作通常要求 key 位于同一个槽。可以用 hash tag 让 {user:42}:profile{user:42}:orders 映射到同一槽,但过度集中同一个 tag 会制造热点分片。

7. Cluster 的可用性仍受网络分区约束

Cluster 使用异步复制,不能保证已确认写入在任何故障下都保留。网络分区时,旧主可能在短窗口内接受写入,而多数派一侧随后提升副本,这部分写入可能丢失。

Cluster 还会在槽不可覆盖、达不到多数主节点或故障转移尚未完成时拒绝部分请求。业务要根据错误类型决定重试,并保证写操作幂等;不能用无限重试掩盖拓扑故障。

8. 根据恢复目标组合能力

选择配置时需要先给出:

  • RPO:故障后最多允许丢失多少数据。
  • RTO:多久必须恢复服务。
  • 数据集是否需要分片。
  • 读取副本能否接受复制延迟。
  • 单机、机架和机房故障需要覆盖到什么范围。

缓存数据可从数据库重建时,可以接受较大的恢复窗口;Redis 若保存无法重建的权威状态,就需要重新评估它是否适合作为唯一存储,并配置独立备份、核对和恢复流程。

9. 常见问题

9.1 开启 AOF 是否就不会丢数据

不会。丢失窗口取决于 fsync 策略,磁盘和文件也可能损坏;异步复制故障转移还可能提升未收到最新命令的副本。需要根据 RPO 设计持久化、复制、备份和恢复验证。

9.2 Cluster 是否自动支持所有多 key 命令

不是。涉及多个 key 的原子操作通常要求它们在同一个 hash slot。hash tag 可以主动控制共槽,但会影响数据分布,需要避免把过多流量集中到一个槽或节点。

10. 面试题

10.1 Redis 的 RDB、AOF、复制和 Cluster 分别解决什么问题

出现公司:美团

考察重点

  • 快照与命令日志的恢复点差异。
  • 异步复制和故障转移的数据窗口。
  • hash slot、重定向与多 key 限制。

相关内容:第 1 节“RDB 保存某个时间点的数据快照”至第 8 节“根据恢复目标组合能力”。

参考回答

RDB 保存某个时间点的数据集,适合备份和快速恢复,但会丢失两次快照之间的写入。AOF 记录写命令,恢复点由 fsync 策略决定,并通过重写控制文件大小。复制保留副本并支持读扩展和故障转移,但默认异步,提升落后副本时仍可能丢失已确认写入。

Redis Cluster 把 16384 个 hash slot 分给多个主节点实现分片,客户端通过 MOVED 或 ASK 处理拓扑和迁移;多 key 操作一般需要 key 同槽。最终要按 RPO、RTO 和是否可重建数据选择持久化、复制、备份与集群配置,不能把它们等同于强一致或绝对零丢失。