RDB 持久化是什么
RDB 是某一时刻的全量内存快照,默认写成 dir 目录下的 dump.rdb。BGSAVE 通过 fork 子进程写盘,父进程继续处理请求(写时复制 COW),线上环境只用这一种;SAVE 在进程内同步写盘,大实例上会阻塞数秒到数十秒。LASTSAVE 返回上次成功保存的 Unix 时间戳,与 date +%s 对比就能判断快照新鲜度。
基本信息
| 适用版本 | Bgsave 全版本;rdb_last_cow_size 需 Redis 4.0+ |
|---|---|
| 关键配置 | save / dbfilename / dir / stop-writes-on-bgsave-error |
| fork 开销 | 与实例数据量同量级,取决于 COW 写入量 |
| 权限要求 | CONFIG 系列需 admin 权限 |
| 文件位置 | dir 参数指向的目录,默认 /var/lib/redis |
典型使用场景
- 定时快照做冷备:dump.rdb 可直接拷走,用于恢复或测试环境建库
- 主从首次全量同步:从库接入时主库自动触发一次 BGSAVE 传输 RDB
- 版本升级前的保险:升级前手动 BGSAVE 并确认状态为 ok
- 容量评估:对比 dump.rdb 大小与 used_memory,估算落盘与传输成本
- 排查延迟毛刺:fork 与 COW 造成的调用耗时能在 INFO 里看到
- 纯缓存实例:可关闭持久化,但必须接受重启后全量回源
示例
示例
BGSAVE # 返回 Background saving started
LASTSAVE # 上次成功保存的 Unix 时间戳,例:1758451234
date +%s # 与上面相减即为快照年龄
INFO persistence | grep -E 'rdb_last_bgsave_status|rdb_bgsave_in_progress' # ok / 0
CONFIG GET save # 查看自动快照规则,如 3600 1 300 100 60 10000
CONFIG GET dir # 确认 dump.rdb 落盘目录及磁盘余量
df -h $(redis-cli CONFIG GET dir | tail -1) # 检查写盘目录空间关键字段读法
| 字段 | 含义 | 异常表现 |
|---|---|---|
| rdb_last_bgsave_status | 上次后台保存最终状态 | err 说明写盘失败,需查磁盘与权限 |
| rdb_bgsave_in_progress | 是否正在保存 | 长时间为 1 说明写盘慢或被阻塞 |
| rdb_last_save_time | 上次成功保存时间戳 | 与当前时间差过大说明快照过期 |
| latest_fork_usec | 最近一次 fork 耗时(微秒) | 过大说明实例大或受 THP 影响 |
| rdb_last_cow_size | 上次保存期间 COW 占用字节 | 接近数据量说明写多,需留足内存 |
SAVE 在大库上可能阻塞数秒到数十秒,任何在线库都不要用;只在拷数据文件的维护窗口使用 SHUTDOWN SAVE,或在 BGSAVE 完成后等状态变 ok 再拷。
BGSAVE 期间 fork 与 COW 会额外占用内存,写密集实例可能瞬间接近物理内存上限;同时建议关闭透明大页(THP),否则 fork 延迟与 COW 开销会被放大。