一、是什么
以日志的形式来记录每个写操作
,将 Redis 执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以写文件,redis 启动之初会读取该文件重新构建数据,换言之,redis 重启的话就会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
二、appendonly.aof 文件
- 配置
默认关闭,开启 appendonly yes
- 优先级
同时开启了 rdb 和 aof 两种模式,aof 优先
三、AOF 启动 / 修复 / 恢复
- 正常恢复
启动:设置 Yes
将数据的 aof 文件复制一份保存到对应的目录
恢复:重启 redis 然后重新加载 - 异常恢复
启动:设置 Yes
备份被写坏的 AOF 文件
修复:Redis-check-aof –fix 进行修复
恢复:重启 redis 然后重新加载
四、Rewrite
- 是什么
AOF 采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当 AOF 文件的大小超过所设定的阀值时,Redis 就会启动 AOF 文件的内容压缩,只保留可以恢复数据的最小指令集,可以使用命令 bgrewriteaof#appendfsync always // 每次数据变更会被立即记录到磁盘,性能差数据保存完整
appendfsync everysec // 出厂默认设置,异步操作,每秒记录,一秒宕机会丢失数据
#appendfsync no
- 重写原理
AOF 文件持续增长而过大时,会 fork 出一条新进程来将文件重写(也是先写临时文件最后再 rename), 遍历新进程的内存中数据,每条记录有一条 Set 语句。重写 aof 文件的操作,并没有读取旧的 aof 文件,而是将整个内存中的数据内容用命令的方式重写了一个新的 aof 文件,这点和快照有点类似 - 触发机制
Redis 会记录上次重写时的 AOF 大小,默认配置是当 AOF 文件大小是上次 rewrite 后大小的一倍,且文件大于 64M 时触发auto-aof-rewrite-percentage 100 // 设置重写的基准值
auto-aof-rewrite-min-size 64mb // 设置重写的基准值