Skip to content

Redis 持久化、高可用与集群

这篇笔记专门整理 Redis 在线上运行时最关键的稳定性主线:数据怎么落盘、故障后怎么恢复、节点怎么切换、容量怎么扩展。

Redis 的优势在于快,但只要进入生产环境,真正决定系统稳不稳的,往往是:持久化策略、复制链路、故障转移和集群扩展能力。


1. 🌟 持久化在解决什么问题

Redis 虽然以内存为核心,但这并不意味着数据就不需要恢复。

这里把“持久化”这个词本身说清楚:

持久化 指的是把原本只存在内存里的数据,按某种方式落到磁盘上。这样 Redis 进程退出、机器重启,或者节点故障后,才有机会把之前的数据重新恢复回来。

如果没有持久化,那么 Redis 更像一个“纯内存临时状态容器”:

  1. 进程一重启,内存里的数据就没了
  2. 机器一故障,节点上的状态就断了
  3. 新节点启动时,只能从空数据开始

持久化主要在解决这些问题:

  1. 进程重启后如何恢复数据
  2. 节点故障后如何减少数据丢失
  3. 是否需要更快的冷启动恢复

Redis 常见持久化方式有两种:

  1. RDB
  2. AOF

它们不是谁“绝对更先进”,而是分别偏向不同目标。


2. 🌟 RDB(Redis Database):快照思路

RDB 的核心思路是:在某些时刻把当前内存数据做成一份快照。

这里的“快照”可以理解成 把某一时刻 Redis 里的整体数据状态,像拍照片一样完整保存下来

所以 RDB 保存的不是“每一次写命令发生了什么”,而是“某个时刻系统里最终长什么样”。

这也是为什么它恢复通常更快:

  1. Redis 启动时不需要一条条重放很多历史命令
  2. 只需要把这份快照直接加载回内存
  3. 更像是“直接把存档读回来”

2.1 优点

  1. 文件通常更紧凑
  2. 恢复速度通常更快
  3. 适合做备份和快速冷启动

2.2 代价

  1. 两次快照之间如果发生故障,可能丢失中间这段数据
  2. 快照本身也会带来额外开销

这里的“丢失中间这段数据”,意思是:

假设上一次快照是 10:00,下一次快照还没来得及生成,结果 10:05 机器宕机,那么 10:00 到 10:05 之间的新写入,就可能无法通过 RDB 找回来。

所以 RDB 更像是:偏恢复效率和快照备份的一种持久化方式。


3. 🌟 AOF(Append Only File):命令追加思路

AOF 的核心思路是把写命令追加记录下来,后续通过重放命令恢复数据。

这里的 Append Only 可以直译成:只追加,不在原日志中间随意改写。

也就是说,每次有写操作时,Redis 会把这条“会修改数据的命令”按顺序记到文件末尾。后面如果要恢复数据,就从头到尾把这些命令重新执行一遍。

所以 AOF 保存的不是“某一刻的数据截图”,而是:数据是一步一步怎么变成现在这个样子的操作日志。

3.1 优点

  1. 数据恢复粒度通常更细
  2. 更容易降低数据丢失窗口

3.2 代价

  1. 文件可能更大
  2. 恢复过程可能更重
  3. 需要关注重写和磁盘压力

这里的“重写”也值得单独解释一下:

因为 AOF 会持续追加命令,如果一个 Key 被反复修改,文件里就会留下很多历史写入痕迹。为了避免日志无限膨胀,Redis 会在合适的时候把当前有效数据重新整理成一份更紧凑的新 AOF 文件,这就是 AOF rewrite

所以 AOF 的成本不只是“写日志”,还包括:

  1. 持续追加带来的磁盘写压力
  2. 文件变大后的恢复成本
  3. 后台重写时的额外资源消耗

所以 AOF 更像是:偏数据完整性的一种持久化方案。


4. RDB 和 AOF 怎么理解它们之间的关系

把它们看成这样:

维度RDBAOF
核心思路周期快照追加写命令
恢复速度通常更快通常更重
数据完整性两次快照间可能丢数据通常更细粒度
文件特征更紧凑可能更大

很多线上环境会综合使用它们,不是为了“多配两个选项”,而是为了在恢复效率和数据安全之间取得平衡。

可以把它们先记成两种不同视角:

  1. RDB 关心的是“尽快拿到一份可恢复的数据存档”
  2. AOF 关心的是“尽量把每一步写操作都保留下来”

前者更像备份快照,后者更像操作流水。


5. 🌟 主从复制解决的是什么

Redis 主从复制主要解决的是:

  1. 数据副本同步
  2. 读扩展
  3. 故障切换的基础条件

最基础的理解通常是:

  1. 主节点负责主要写入
  2. 从节点复制主节点数据
  3. 部分读流量可以分担到从节点

这里的“复制”本质上是:让多个 Redis 节点维持同一份数据的副本。

主节点上的写入不会自动凭空出现在从节点里,而是通过复制链路同步过去。所以主从架构的核心意义,不只是“多开几台 Redis”,而是:

  1. 主节点是主要写入入口
  2. 从节点保存相对接近主节点的数据副本
  3. 系统因此拥有读扩展和故障切换的基础

但要注意的是:

  1. 复制存在延迟
  2. 读从节点不等于一定读到最新数据
  3. 只配主从,不等于故障切换治理已经完整

这里的“复制延迟”要特别有画面感地理解:

主节点刚完成写入的那一瞬间,从节点可能还在同步路上。如果这时读请求被打到从节点,就可能看到旧值。所以主从复制能提升可用性和读能力,但天然会引入一定程度的“主从短暂不一致”。


6. 🌟 Sentinel 和 Cluster 不是一回事

这是 Redis 很容易被混成一类的两个主题。

7.1 Sentinel

Sentinel 更偏:

  1. 监控
  2. 故障发现
  3. 主从切换
  4. 高可用治理

它更像是“主从体系的高可用管理层”。

更具体一点说,Sentinel 本身不是拿来存业务数据的 Redis 节点,而是一组专门负责“观察和协调”的哨兵进程。

它主要做三件事:

  1. 盯住主从节点是否健康
  2. 判断主节点是否真的故障
  3. 在主节点不可用时,协助把某个从节点提升为新的主节点

7.2 Cluster

Cluster 更偏:

  1. 数据分片
  2. 横向扩展
  3. 集群路由
  4. 部分高可用能力

它更像是“进入分布式分片之后的集群形态”。

更直白地说,Cluster 不是简单的“一主多从”,而是:把整个 Key 空间拆给多台 Redis 机器共同承载。

所以它解决的是单机内存和单机吞吐迟早会碰到上限的问题。业务写入某个 Key 时,需要先根据路由规则知道这个 Key 该落到哪个分片节点上。

所以把这层分工记住:

  1. Sentinel 重点是高可用和故障转移
  2. Cluster 重点是分片和扩展

7. Cluster 会带来什么新问题

只要进入 Cluster,系统关注点就不再只是“主挂了怎么办”,还要继续面对:

  1. 数据怎么分片
  2. 热点是不是集中到少数节点
  3. 某类 Key 是否造成明显倾斜
  4. 路由和扩容是否顺畅

把这些问题翻译成更具体的工程含义,就是:

  1. 某些多 Key 操作可能因为 Key 不在同一分片上而不能直接执行
  2. 热点业务如果刚好集中在同一槽位或同一节点,会出现局部过载
  3. 扩容时需要做数据迁移和重分布,过程本身也会带来波动
  4. 客户端必须理解或适配集群路由,不能再把整个 Redis 只当成一个单点地址

这意味着 Cluster 解决了容量和吞吐扩展问题,但也会把分布式复杂度一起带进系统。

所以 Cluster 不是“配置更高级”,而是系统规模继续增长后的架构选择。


8. 一份实用的持久化与高可用检查清单

可以优先检查这些问题:

  1. 数据是否需要持久化,容忍多大数据丢失窗口
  2. RDBAOF 或组合方案是否贴合业务要求
  3. 过期删除和内存淘汰策略是否分开设计
  4. 主从读写路径是否明确
  5. 是否只做了复制,却没有完整高可用治理
  6. SentinelCluster 的使用边界是否清楚
  7. 集群是否存在明显热点或分布不均

Redis 线上治理真正难的地方,不是把节点启动起来,而是能不能把恢复能力、高可用能力和扩展能力一起设计清楚。

基于 VitePress 构建的个人技术笔记。