10 数据持久化与恢复
🎯 学习要点
RDB 快照与触发条件 AOF 追加日志与重写 混合持久化与恢复速度 备份策略与演练
📖 名词解释
RDB:快照持久化,将内存数据在某些条件下保存为二进制文件。AOF:追加日志,将每次写操作记录到日志文件,恢复时重放。混合持久化:AOF 文件以 RDB 作为前导,结合两者的启动速度与可靠性。fsync:将数据刷到磁盘的策略(always/everysec/no),影响性能与可靠性。重写(rewrite):AOF 文件过大时进行重写,压缩为更小的语义等价文件。恢复演练:按既定步骤从备份文件恢复数据的实操演练,验证流程可用性。
🧭 学习方案
了解 RDB/AOF/混合持久化的差异与适用场景,选择一种作为默认方案。 配置并验证快照与 AOF 重写策略,观察磁盘占用与启动时间。 编写标准恢复流程文档:停写、备份、替换、重启、校验,定期演练。 为关键业务数据设置备份频率与校验机制,确保恢复后数据可用。
🗺️ 应用场景说明
夜间备份:电商在低峰时做 RDB 快照,提升备份效率减少影响。 宕机恢复:服务异常退出后,用 AOF 快速恢复最近写入,减少数据丢失。 变更回滚:配置错误导致异常时,用最近一次快照快速回滚到稳定状态。
⚠️ 注意事项
AOF 策略与性能权衡 恢复流程需验证一致性 定期备份与校验
📸 RDB 快照配置示例
save 900 1 # 900 秒内有 1 次写入时保存快照
save 300 10 # 300 秒内有 10 次写入时保存快照
save 60 10000 # 60 秒内有 10000 次写入时保存快照
通俗说明
满足条件就做一次快照(满足次数+时间),适合夜间与低峰备份。 快照恢复速度快,但可能丢失最近未持久化的写入。
详细解释
save <sec> <changes> 表示在指定时间与更改次数条件满足时生成快照。RDB 文件小、恢复快,适合定期备份与灾备;但非实时写入。 结合 AOF 可获得更完整恢复能力,权衡性能与可靠性。
速记口诀
1.配置文件操作步骤(RDB)
命令行编辑示例(Linux)
sudo vi /etc/redis/redis.conf
save 900 1
save 300 10
save 60 10000
sudo systemctl restart redis-server || sudo service redis-server restart
redis-cli CONFIG GET save
redis-cli INFO Persistence | grep rdb
命令行编辑示例(Windows)
notepad C:\redis\redis. conf
save 900 1
save 300 10
save 60 10000
Stop-Process - Name redis- server - Force
Start-Process "C:\redis\redis-server.exe" - ArgumentList "C:\redis\redis.conf"
redis- cli CONFIG GET save
redis- cli INFO Persistence
2.非配置文件操作步骤(RDB)
CONFIG GET save
CONFIG SET save "900 1 300 10 60 10000"
BGSAVE
INFO Persistence
CONFIG GET dir
CONFIG GET dbfilename
Copy-Item - Path "C:\\redis\\data\\dump.rdb" - Destination "C:\\backup\\dump-$( Get-Date - Format yyyy- MM- dd) .rdb"
🧾 AOF 配置示例
appendonly yes # 开启 AOF 记录写操作
appendfsync everysec # 每秒刷盘(性能与可靠性折中)
auto-aof-rewrite-percentage 100 # 日志相对膨胀阈值,达到后触发重写
auto-aof-rewrite-min-size 64mb # 最小重写文件大小(避免小文件频繁重写)
aof-use-rdb-preamble yes # 混合持久化:RDB 作为 AOF 前导提升恢复速度
通俗说明
AOF 是“记账本”:把每次写操作记在日志里,宕机后照着日志重放恢复。 everysec 表示每秒刷盘,性能与可靠性更平衡;always 更安全但更慢。当日志太大时会“重写”,把历史操作压缩成更小的语义等价文件。
详细解释
AOF 记录命令序列,恢复时按顺序重放,保证结果一致。 刷盘策略从快到稳:no(由系统决定)< everysec < always。 重写将多次操作折叠为最简状态写入,降低磁盘占用与恢复时间。
1.配置文件操作步骤(AOF/混合)
命令行编辑示例(Linux)
sudo vi /etc/redis/redis.conf
appendonly yes
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-use-rdb-preamble yes
sudo systemctl restart redis-server || sudo service redis-server restart
redis-cli INFO Persistence | grep aof
redis-cli CONFIG GET appendonly
redis-cli CONFIG GET appendfsync
redis-cli CONFIG GET aof-use-rdb-preamble
命令行编辑示例(Windows)
notepad C:\redis\redis. conf
appendonly yes
appendfsync everysec
auto- aof- rewrite- percentage 100
auto- aof- rewrite- min- size 64mb
aof- use-rdb - preamble yes
Stop-Process - Name redis- server - Force
Start-Process "C:\redis\redis-server.exe" - ArgumentList "C:\redis\redis.conf"
redis- cli INFO Persistence
redis- cli CONFIG GET appendonly
📁 常见安装路径与服务名差异说明
Debian/Ubuntu(APT 安装)
配置:/etc/redis/redis.conf 数据目录:/var/lib/redis 服务名:redis-server(systemd)
CentOS/RHEL(YUM/DNF 安装)
配置:/etc/redis/redis.conf 数据目录:/var/lib/redis 服务名:redis 或 redis-server(按包不同)
源码安装
配置:常见示例为 /usr/local/etc/redis/redis.conf(自定义) 启动:redis-server /usr/local/etc/redis/redis.conf
Docker 官方镜像
默认数据目录:/data 推荐挂载:
-v /host/conf/redis.conf:/usr/local/etc/redis/redis.conf-v /host/data:/data
启动:redis-server /usr/local/etc/redis/redis.conf
📍 定位数据文件与对应操作
redis-cli CONFIG GET dir
redis-cli CONFIG GET dbfilename
redis-cli CONFIG GET appendfilename
cd < DIR>
sudo cp -a dump.rdb /backup/dump-$( date +%F) .rdb
sudo cp -a appendonly.aof /backup/appendonly-$( date +%F) .aof
Copy-Item "C:\r edis\data\dump.rdb" "C:\b ackup\dump-$( Get-Date -Format yyyy-MM-dd) .rdb"
Copy-Item "C:\r edis\data\a ppendonly.aof" "C:\b ackup\a ppendonly-$( Get-Date -Format yyyy-MM-dd) .aof"
操作示例(在线开启 AOF + 每秒刷盘 + 重写阈值 + 混合持久化)
CONFIG SET appendonly yes
CONFIG SET appendfsync everysec
CONFIG SET auto-aof-rewrite-percentage 100
CONFIG SET auto-aof-rewrite-min-size 64mb
CONFIG SET aof-use-rdb-preamble yes
BGREWRITEAOF
INFO Persistence
CONFIG GET appendonly
CONFIG GET appendfsync
CONFIG GET aof-use-rdb-preamble
♻️ 恢复步骤
停止写入
备份当前数据文件
替换为目标备份
重启实例
验证关键键与数据量
通俗说明
恢复流程要“先停写再替换”,避免新旧数据混乱或冲突。 恢复后核对关键键与总量,确认数据一致再对外开放。
详细解释
恢复前停止业务写入并备份当前文件,确保可回滚与比对。 替换数据文件后重启,校验关键键与数据量、延迟与错误日志。 灾备演练定期进行,验证流程与脚本可靠性。
操作示例(RDB 恢复)
CLIENT PAUSE WRITE 60000
Copy-Item "C:\\redis\\data\\dump.rdb" "C:\\backup\\dump-before-restore.rdb"
Copy-Item "C:\\backup\\dump-2025-11-20.rdb" "C:\\redis\\data\\dump.rdb" - Force
Stop-Process - Name redis- server - Force
Start-Process "C:\\redis\\redis-server.exe" - ArgumentList "C:\\redis\\redis.conf"
DBSIZE
MGET key1 key2 key3
INFO Persistence
操作示例(AOF/混合 恢复)
Copy-Item "C:\\redis\\data\\appendonly.aof" "C:\\backup\\appendonly-before-restore.aof"
Copy-Item "C:\\backup\\appendonly-2025-11-20.aof" "C:\\redis\\data\\appendonly.aof" - Force
redis-check-aof --fix /var/lib/redis/appendonly.aof
INFO Persistence
DBSIZE
🧹 归档与清理(HLL)
键命名分层:uv:{yyyy-MM-dd} / uv:{yyyy-MM}
按周/月汇总后归档日键
保留最近 N 周/月,定期删除旧键
通俗说明
HLL 键内存固定、适合分层命名与周期归档;并集后保留汇总、清理明细。
详细解释
日键按 PFMERGE 合并到周/月键后,可删除过旧日键以控制总量。 归档策略与备份周期一致,保持恢复后统计口径统一。
操作示例
PFMERGE uv:2025-11 uv:2025-11-01 uv:2025-11-02 uv:2025-11-03 uv:2025-11-04 uv:2025-11-05
DEL uv:2025-11-01 uv:2025-11-02 uv:2025-11-03 uv:2025-11-04 uv:2025-11-05
PFCOUNT uv:2025-11
🔍 小结
RDB 与 AOF 的核心差异
RDB:周期性快照,文件体积小、启动恢复快;在快照间隔内可能丢失最近写入。 AOF:实时追加命令,数据更完整;恢复较慢,需顺序重放命令;可通过重写优化文件体积。 混合:AOF 以 RDB 作为前导(preamble),启动时先加载快照,再重放最近命令,兼顾恢复速度与完整性。
恢复与数据丢失窗口
RDB 的丢失窗口由 save 规则决定;规则越密集,窗口越小但写放大越大。 AOF 的丢失窗口由 appendfsync 决定:always 基本无窗口;everysec 最多丢失 1 秒;no 取决于系统刷盘。 混合模式遵循 AOF 的窗口,但借助 RDB 前导提升恢复速度。
性能与资源影响
RDB:BGSAVE 需要 fork,会产生短暂的阻塞与额外内存开销(COW);数据量很大时需关注 I/O 峰值。 AOF:持续写日志带来磁盘 I/O 压力;重写(BGREWRITEAOF)期间同样存在 fork 与 COW 内存开销。 生产需为 fork 预留内存与磁盘吞吐,监控 rdb_last_bgsave_status、aof_rewrite_in_progress 等指标。
配置与治理建议
快照建议结合业务低峰设置多条 save 规则;AOF 建议 everysec 作为折中,关键数据可评估 always。 开启混合持久化(aof-use-rdb-preamble yes)以提升冷启动恢复速度。 设置 auto-aof-rewrite-percentage 与 auto-aof-rewrite-min-size,防止日志无限膨胀。 明确数据目录与文件名,避免多实例共享目录造成覆盖:CONFIG GET dir/dbfilename/appendfilename。
备份与恢复演练
备份前暂停写入(CLIENT PAUSE WRITE)或选低峰执行,保证文件一致性。 恢复后校验关键键与总量(DBSIZE/MGET/INFO Persistence),并观察过期键清理的延迟影响。 建立周期演练清单:停写→备份→替换→重启→校验→放行;记录操作与验证结果。
容器与路径管理
Docker 挂载配置与数据路径(/usr/local/etc/redis/redis.conf、/data),用 -v 保证配置与数据持久。 使用 redis-cli CONFIG GET dir 定位容器内实际数据目录,避免误操作宿主机路径。
常见问题与排查
BGSAVE/BGREWRITEAOF 失败:检查磁盘剩余空间、文件权限、ulimit、内存不足导致 fork 失败。恢复后数据不一致:检查是否混用旧快照与新日志、是否忘记停写、是否恢复了错误环境的文件。 性能抖动:关注重写与快照期间的 I/O 峰值与 COW 内存占用;必要时调整窗口与容量规划。
🧰 参数模板示例(可直接粘贴到 redis.conf)
小型生产环境(折中可靠性与性能)
# RDB 快照密度:较为密集,降低丢失窗口
save 900 1
save 300 10
save 60 10000
# AOF:每秒刷盘,可靠性与性能折中
appendonly yes
appendfsync everysec
# AOF 重写阈值:降低频率,避免频繁重写
auto-aof-rewrite-percentage 150
auto-aof-rewrite-min-size 128mb
# 混合持久化:提升恢复速度
aof-use-rdb-preamble yes
高吞吐环境(优先稳态吞吐与可用性)
# RDB 快照密度:降低频率,减少 fork/COW 压力
save 3600 1
save 300 10000
save 60 100000
# AOF:每秒刷盘,兼顾可靠性与性能(建议 SSD/NVMe)
appendonly yes
appendfsync everysec
# AOF 重写阈值:提高最小重写尺寸,降低重写次数
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 512mb
# 混合持久化:冷启动更快
aof-use-rdb-preamble yes
关键金融场景(可选强化,需评估硬件)
# AOF 强一致:每次写都 fsync(更稳但更慢)
appendonly yes
appendfsync always
# 重写阈值适度提高,避免重写频繁影响时延
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 256mb
# 仍建议开启混合持久化
aof-use-rdb-preamble yes
校验与观察(通用)
redis-cli CONFIG GET save
redis-cli CONFIG GET appendonly
redis-cli CONFIG GET appendfsync
redis-cli CONFIG GET aof-use-rdb-preamble
redis-cli INFO Persistence | egrep "rdb|aof_"