RDB & AOF #
- RDB 和 AOF 是两种独立的持久化方式
- RDB 默认开启,关闭配置
save "",对应server.saveparamsserver.saveparamslen - AOF 默认关闭,开启后默认是混合持久化
原因是AOF base文件可以是AOF也可以是RDB文件,配置为aof-use-rdb-preamble
加载 #
在 Redis 启动时候
aofLoadManifestFromDisk加载 AOF manifest 文件,内容是一个base文件和多个aof增量文件的汇总信息loadDataFromDiskloadAppendOnlyFiles如果开启 AOF,会从 manifest 中读取,先加载 base文件(rdb/aof),再加载 incr文件(aof)rdbLoad,如果没有开启 AOF,才会直接从RDB文件加载
aofOpenIfNeededOnServerStart打开最后一个aof文件用于写,server.aof_fd
写入 #
- 在事件循环
beforeSleep中,flushAppendOnlyFile会把AOF buffer写到磁盘
appendfsync 策略配置
no: don't fsync, just let the OS flush the data when it wants. Faster.
always: fsync after every write to the append only log. Slow, Safest.
everysec: fsync only one time every second. Compromise.
在
serverCron定时任务中,rdbSaveBackground将fork子进程备份server.rdb_filenameRDB 命令
save: 直接调用rdbSave,因为单线程,会阻塞其他请求bgsave: fork 子进程执行rdbSave
AOF 重写 #
- 在
serverCron定时任务中,rewriteAppendOnlyFileBackground满足条件将重写AOF - 执行
bgrewriteaof命令,调用rewriteAppendOnlyFileBackground,fork子进程执行rewriteAppendOnlyFile
rewriteAppendOnlyFile 逻辑是根据 server.aof_use_rdb_preamble 决定是用 RDB 还是 AOF 方式重写