Redis-10数据持久化与恢复

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:/etc/redis/redis.conf/usr/local/etc/redis/redis.conf
    • Windows:C:\redis\redis.conf
    • Docker(容器内):/usr/local/etc/redis/redis.conf
  • 修改内容(持久化到配置文件):
    save 900 1
    save 300 10
    save 60 10000
    
  • 生效方式:
    • 重启 Redis 服务使配置持久生效。
    • 或使用运行时命令:redis-cli CONFIG SET save "900 1 300 10 60 10000"(重启后建议仍写入配置文件)。
  • 校验:redis-cli INFO Persistenceredis-cli CONFIG GET save
命令行编辑示例(Linux)
# 打开并编辑配置(Debian/Ubuntu 示例路径)
sudo vi /etc/redis/redis.conf
# 在 vi 中搜索 save 关键字并修改/追加以下内容:
save 900 1
save 300 10
save 60 10000
# 保存退出:按 Esc,输入 :wq 并回车

# 重启服务使配置生效(按发行版选择其一)
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

# 保存后,重启 Redis 进程
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)
# 查看当前 RDB 触发条件
# CONFIG GET <param>:查询运行时配置;这里 <param>=save 返回快照规则
CONFIG GET save
# 动态设置触发条件(示例)
# CONFIG SET save "<sec1> <changes1> <sec2> <changes2> ..."
# 含义:在 <sec> 秒内发生 <changes> 次写入则触发快照,允许多个规则组合
CONFIG SET save "900 1 300 10 60 10000"
# 触发一次后台快照
# BGSAVE:异步 fork 子进程生成 RDB 文件,不阻塞客户端写入
BGSAVE
# 校验快照状态与最近时间
# INFO Persistence:查看持久化信息,如 rdb_last_bgsave_time_sec、rdb_last_bgsave_status
INFO Persistence
# 查看数据目录与文件名
# CONFIG GET dir/dbfilename:数据目录与 RDB 文件名,用于定位备份文件
CONFIG GET dir
CONFIG GET dbfilename
# Windows 备份快照文件(根据你的路径调整)
# Copy-Item -Path <源文件> -Destination <目标文件>
# -Path:RDB 文件路径;-Destination:备份文件路径(含日期便于区分版本)
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:/etc/redis/redis.conf/usr/local/etc/redis/redis.conf
    • Windows:C:\redis\redis.conf
    • Docker(容器内):/usr/local/etc/redis/redis.conf
  • 修改内容(持久化到配置文件):
    appendonly yes
    appendfsync everysec
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    aof-use-rdb-preamble yes
    
  • 生效方式:
    • 重启 Redis 服务使配置持久生效。
    • 或使用运行时命令:redis-cli CONFIG SET appendonly yes 等(重启后建议仍写入配置文件)。
  • 校验:redis-cli INFO Persistenceredis-cli CONFIG GET appendonlyappendfsyncaof-use-rdb-preamble
命令行编辑示例(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
# 保存退出:按 Esc,输入 :wq 并回车

# 保存后,重启服务
sudo systemctl restart redis-server || sudo service redis-server restart

# 校验 AOF/混合持久化状态与关键配置
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
# 在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
    • 服务名:redisredis-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            # RDB 文件名(默认 dump.rdb)
redis-cli CONFIG GET appendfilename        # AOF 文件名(默认 appendonly.aof)

# 在 Linux 中备份(示例,按实际输出的目录替换 <DIR>)
cd <DIR>
sudo cp -a dump.rdb /backup/dump-$(date +%F).rdb
sudo cp -a appendonly.aof /backup/appendonly-$(date +%F).aof

# 在 Windows 中备份(按实际输出替换路径)
Copy-Item "C:\redis\data\dump.rdb" "C:\backup\dump-$(Get-Date -Format yyyy-MM-dd).rdb"
Copy-Item "C:\redis\data\appendonly.aof" "C:\backup\appendonly-$(Get-Date -Format yyyy-MM-dd).aof"
操作示例(在线开启 AOF + 每秒刷盘 + 重写阈值 + 混合持久化)
# 在线开启 AOF + 每秒刷盘 + 重写阈值 + 混合持久化
# CONFIG SET appendonly yes:开启 AOF(重启后也建议在配置文件中持久化该设置)
CONFIG SET appendonly yes
# CONFIG SET appendfsync <policy>:fsync策略;no/always/everysec(折中)
CONFIG SET appendfsync everysec
# CONFIG SET auto-aof-rewrite-percentage <pct>:相对膨胀百分比阈值,达到触发重写
CONFIG SET auto-aof-rewrite-percentage 100
# CONFIG SET auto-aof-rewrite-min-size <size>:最小重写文件大小,避免频繁重写
CONFIG SET auto-aof-rewrite-min-size 64mb
# CONFIG SET aof-use-rdb-preamble yes:AOF 前导使用 RDB,提升恢复速度(混合持久化)
CONFIG SET aof-use-rdb-preamble yes
# 触发一次 AOF 重写
# BGREWRITEAOF:异步重写 AOF,压缩历史命令为语义等价文件
BGREWRITEAOF
# 校验持久化状态
# INFO Persistence:关键字段 aof_enabled/aof_rewrite_in_progress/aof_last_bgrewrite_status
INFO Persistence
# 查询当前配置,确认生效
CONFIG GET appendonly
CONFIG GET appendfsync
CONFIG GET aof-use-rdb-preamble

♻️ 恢复步骤

停止写入
备份当前数据文件
替换为目标备份
重启实例
验证关键键与数据量

通俗说明

  • 恢复流程要“先停写再替换”,避免新旧数据混乱或冲突。
  • 恢复后核对关键键与总量,确认数据一致再对外开放。
详细解释
  • 恢复前停止业务写入并备份当前文件,确保可回滚与比对。
  • 替换数据文件后重启,校验关键键与数据量、延迟与错误日志。
  • 灾备演练定期进行,验证流程与脚本可靠性。
操作示例(RDB 恢复)
# 暂停客户端写入 60 秒(建议同时在应用端停写)
# CLIENT PAUSE WRITE <ms>:阻塞写操作 <ms> 毫秒,读操作不受影响
CLIENT PAUSE WRITE 60000
# 备份当前 RDB 文件
# Copy-Item <源> <目标>:复制文件;用于保留当前 RDB 以便回滚
Copy-Item "C:\\redis\\data\\dump.rdb" "C:\\backup\\dump-before-restore.rdb"
# 替换为目标快照
# -Force:覆盖同名文件;确保替换成目标备份文件
Copy-Item "C:\\backup\\dump-2025-11-20.rdb" "C:\\redis\\data\\dump.rdb" -Force
# 重启服务(按你的部署方式执行)
# Stop-Process -Name <进程名> -Force:终止进程;Start-Process 启动服务并带配置文件参数
Stop-Process -Name redis-server -Force
Start-Process "C:\\redis\\redis-server.exe" -ArgumentList "C:\\redis\\redis.conf"
# 校验关键键与总量
# DBSIZE:返回当前数据库键数量(近似,即时,不含过期清理延迟)
DBSIZE
# MGET <key1> <key2>...:批量读取关键键,验证数据正确性
MGET key1 key2 key3
# INFO Persistence:再次确认 RDB 加载状态与最近持久化记录
INFO Persistence
操作示例(AOF/混合 恢复)
# 备份当前 AOF 文件
# Copy-Item:与 RDB 相同用法,保留当前 AOF 文件以便回滚
Copy-Item "C:\\redis\\data\\appendonly.aof" "C:\\backup\\appendonly-before-restore.aof"
# 替换为目标 AOF 文件
# -Force:覆盖当前 AOF 文件;若使用混合持久化,文件包含 RDB 前导 + AOF 追加
Copy-Item "C:\\backup\\appendonly-2025-11-20.aof" "C:\\redis\\data\\appendonly.aof" -Force
# 如 AOF 文件损坏,使用 redis-check-aof 修复(Linux 环境示例)
# redis-check-aof --fix <path>:尝试修复尾部损坏,可能截断无效命令
redis-check-aof --fix /var/lib/redis/appendonly.aof
# 重启后校验状态与总量
# INFO Persistence:确认 AOF 已启用且加载成功(aof_enabled=1,aof_last_rewrite_time_sec)
INFO Persistence
# DBSIZE:总键数量核对,确保与预期一致
DBSIZE

🧹 归档与清理(HLL)

键命名分层:uv:{yyyy-MM-dd} / uv:{yyyy-MM}
按周/月汇总后归档日键
保留最近 N 周/月,定期删除旧键

通俗说明

  • HLL 键内存固定、适合分层命名与周期归档;并集后保留汇总、清理明细。
详细解释
  • 日键按 PFMERGE 合并到周/月键后,可删除过旧日键以控制总量。
  • 归档策略与备份周期一致,保持恢复后统计口径统一。
操作示例
# 合并 2025-11 的日 UV 到月 UV(示例)
# PFMERGE <dest> <source1> <source2> ...:并集合并,寄存器按位取最大值写入 <dest>
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 <key1> <key2> ...:删除键,减少存储占用;注意只在确认已汇总后删除
DEL uv:2025-11-01 uv:2025-11-02 uv:2025-11-03 uv:2025-11-04 uv:2025-11-05
# 查询月 UV 近似规模
# PFCOUNT <key>:返回 HLL 估算的基数(近似值)
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_statusaof_rewrite_in_progress 等指标。
  • 配置与治理建议
    • 快照建议结合业务低峰设置多条 save 规则;AOF 建议 everysec 作为折中,关键数据可评估 always
    • 开启混合持久化(aof-use-rdb-preamble yes)以提升冷启动恢复速度。
    • 设置 auto-aof-rewrite-percentageauto-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_"
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值