Redis配置AOF持久化步骤

文章导读
要把 Redis 的 AOF 持久化真正用起来,通常不是只改一个 appendonly yes 就结束。需要先确认当前实例是否已经开启 RDB 持久化、数据能否接受少量丢失、磁盘空间和写放大是否能承受,再决定采用 everysec 还是 always,最后通过运行时命令和信息字段确认 AOF 已开启、重写正常、重启后能恢复。配置改错最常见的后果是重启后数据回退到旧快照,或者 AOF 文件异常增长把
📋 目录
  1. A 先确认当前场景和目标
  2. B 按这个顺序处理
  3. C 改完后怎么验证
  4. D 容易忽略的边界
A A

要把 Redis 的 AOF 持久化真正用起来,通常不是只改一个 appendonly yes 就结束。需要先确认当前实例是否已经开启 RDB 持久化、数据能否接受少量丢失、磁盘空间和写放大是否能承受,再决定采用 everysec 还是 always,最后通过运行时命令和信息字段确认 AOF 已开启、重写正常、重启后能恢复。配置改错最常见的后果是重启后数据回退到旧快照,或者 AOF 文件异常增长把磁盘写满,这两类问题都需要在变更前预留观察窗口。

Redis 开启 AOF 的适用场景是:数据不能只依赖 RDB 快照恢复,或重启后不能接受较大时间窗口的数据丢失。操作路径是先备份现有配置和数据,再设置 appendonly yes 与 appendfsync 策略,通过 CONFIG SET 或重启使配置生效,最后用 INFO persistence 和重启演练验证 AOF 状态与恢复结果。边界在于:AOF 会带来额外磁盘写入,always 策略对延迟影响明显,磁盘空间不足或挂载点权限不正确时不能直接开启。

先确认当前场景和目标

开启 AOF 前,先确认三件事:现有持久化方式、可接受的数据丢失窗口、AOF 文件与重写过程的磁盘余量。如果实例当前只使用 RDB,那么开启 AOF 后第一次重启或重写会生成新的 AOF 文件,这段时间内磁盘占用可能同时存在 RDB 文件、AOF 文件和重写临时文件,空间要按这个峰值估算,而不只是按当前内存数据量估算。

还要确认部署方式。单机实例、主从结构、集群模式对 AOF 的打开顺序和观察点不太一样;主从结构里通常建议先在从节点完成开启和恢复演练,再处理主节点。另外要确认配置的来源:是改 redis.conf 后重启,还是通过 CONFIG SET 运行时修改。运行时修改不一定写入配置文件,重启后会失效,这一点在容器或配置管理工具托管的环境里尤其容易踩坑。

  • 数据能否接受按秒级窗口丢失:能接受通常用 everysec,不能接受才考虑 always。
  • 磁盘挂载点剩余空间是否明显大于当前数据集大小,并为重写留出余量。
  • 运行 Redis 的用户对 dir 目录是否有写权限。
  • 是否有配置管理或容器启动参数会覆盖 redis.conf。

按这个顺序处理

第一步先做备份和现场记录。把当前 redis.conf 中与持久化相关的配置留存,记录 CONFIG GET dir、CONFIG GET appendonly、CONFIG GET appendfsync 的返回值,以及 INFO persistence 中 rdb_last_bgsave_status 等字段的当前状态。这样出问题时能判断是本次变更引入的,还是原本就存在的异常。

第二步修改配置。下面是一段可替换的通用配置片段,参数值需要按自己的目录和策略调整,放入 redis.conf 中与持久化相关的区块:

# 关闭前请确认已备份原配置
appendonly yes
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
appendfsync everysec

# 重写触发条件,按数据量调整
# auto-aof-rewrite-percentage 100
# auto-aof-rewrite-min-size 64mb

# AOF 文件所在目录与 RDB 共用 dir 配置
dir /var/lib/redis

如果不想立刻重启,可以先在低峰期用运行时命令开启,观察一段时间再落盘到配置文件:

CONFIG SET appendonly yes
CONFIG SET appendfsync everysec
CONFIG REWRITE

注意 CONFIG REWRITE 是否能成功,取决于 Redis 进程是否有权限写配置文件,以及配置是否由外部工具托管。第三步是处理重写和主从同步。开启 AOF 后建议主动触发一次重写,确认后台重写能正常完成:

Redis配置AOF持久化步骤
BGREWRITEAOF

在主从结构中,先让从节点完成 AOF 开启与重写,确认从节点重启后能恢复,再对主节点做同样操作,避免主节点重写期间叠加同步压力。

改完后怎么验证

验证分两层:运行状态和恢复能力。运行状态用 INFO persistence 观察,重点看 aof_enabled 是否为 1、aof_rewrite_in_progress 是否回到 0、aof_last_bgrewrite_status 是否为 ok、aof_last_write_status 是否为 ok。如果写入状态出现 err,通常意味着磁盘满、权限不足或文件系统异常,需要先处理再继续观察。

恢复能力验证建议在从节点或测试实例上做:写入少量可识别的键,执行一次正常停机或重启,再看这些键是否还在,以及 INFO persistence 中 AOF 相关计数是否正常增长。不要只在内存态确认 AOF 已开启,因为真正决定数据能否恢复的是磁盘上的 AOF 文件和加载过程。还可以用 redis-check-aof --fix 检查文件完整性,但这一步应在备份副本上操作,不建议直接对线上文件执行修复。

  • 预期信号一:aof_enabled:1 且 aof_last_write_status:ok。
  • 预期信号二:重写结束后 aof_rewrite_in_progress:0,文件大小趋于稳定。
  • 预期信号三:重启后写入的测试键存在,日志中没有 AOF 加载失败或短写错误。

容易忽略的边界

AOF 不是无代价的持久化方案。开启后每次写入都要多一次文件写,appendfsync always 会显著增加写延迟,对延迟敏感的接口不一定适合直接采用。磁盘空间不足时,AOF 写入失败可能导致 Redis 拒绝写入,需要结合 stop-writes-on-bgsave-error 一类配置和监控一起看,不能只靠开关 AOF 解决。

版本和目录结构也需要留意。较新版本的 Redis 会把 AOF 放在 appenddirname 指定的子目录内,用多文件形式组织;旧版本的 AOF 是单文件。跨版本迁移或回退时,不能只把 appendonly 改回去,还要确认旧版本能否读取新格式目录,必要时保留 RDB 作为回退路径。回退建议是:变更前保留 RDB 文件与旧配置,确认 AOF 异常且短时间无法修复时,先恢复旧配置并依赖 RDB 快照,再排查 AOF 文件、磁盘和权限问题。容器环境中还要确认挂载卷覆盖了 AOF 目录,否则重启后文件随容器消失,开启 AOF 也不会带来实际恢复能力。