Redis persistence Explanation - RDB and AOF
RDB
redis.conf 中配置,x
秒内大于y
次修改自动bgsave
save x y
manually trigger
# block the whole process
save
# block fork and non-block the rest
bgsave
# 最后一次生成RDB的时间戳
lastsave
auto trigger
- 触发
RDB
生成配置 - 全量复制
debug reload
重新加载- 未开启
AOF
时,执行shutdown
generate RDB process
- 判断是否有正在执行的子进程
- 父进程
fork
创建子进程 (20ms/GB) - 子进程创建
RDB
文件,根据父进程内存生成快照,并替换原RDB
文件 - 子进程发送信号给父进程,更新
info persistence
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1631974350
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:-1
rdb_current_bgsave_time_sec:-1
rdb_last_cow_size:0
Ops command
# 修改 RDB 文件目录
config set dir
# 修改 RDB 文件名
config set dbfilename
# RDB 是否压缩,默认 yes
config set rdbcompression yes|no
# 检查 RDB 文件错误
redis-check-dump
AOF
redis.conf 中配置
# 开启
appendonly yes
# 刷盘频率,默认 everysec
appendfsync everysec|no|always
generate AOF process
- 所有写命令追加到
aof_buf
中 AOF
缓冲区根据策略刷盘- 启动
Redis
时加载
AOF rewrite
# 手动触发
bgrewriteaof
# 配置触发
## 增长百分比
auto-aof-rewrite-percentage 100
## 默认64M
auto-aof-rewrite-min-size 67108864
## 批量写盘控制,默认为yes,一次写入32MB
aof-rewrite-incremental-fsync yes|no
## 是否禁止AOF重写期间fsync,默认no
no-appendfsync-on-rewrite no|yes
AOF rewrite process
- 判断是否有正在执行的子进程
- 父进程
fork
创建子进程,然后继续响应请求,并将写请求保存到AOF重写缓冲区 - 子进程根据内存快照,合并写请求到新的
AOF
文件 - 子进程发信号给父进程更新
info persistence
- 父进程把AOF重写缓冲区数据写入新的
AOF
文件 - 使用新的
AOF
文件替换原有AOF
文件
aof_enabled:1
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:0
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_last_cow_size:311296
fix broken aof
修复损坏aof
redis-check-aof --fix appendonly.aof
Load order
AOF
开启且存在AOF
文件时,加载AOF
后启动AOF
开启且不存在AOF
文件时,加载RDB
后启动AOF
未开启,加载RDB
后启动
Disclaimer
- License under
CC BY-NC 4.0
- Copyright issue feedback
me#imzye.me
, replace # with @ - Not all the commands and scripts are tested in production environment, use at your own risk
- No privacy information is collected here