redis持久化AOF

介绍

AOF,append of file

redis会将所有 写命令 都 追加 到 AOF文件中

  • 读命令不记录
  • 只追加不改写AOF文件

redis启动时读取 AOF文件,通过执行 写命令 恢复数据

开启AOF备份

默认不开启,需要修改配置文件

按照下面改成yes

appendonly yes

AOF文件路径

与RDB保存路径相同

在redis.conf配置文件中:

dir ./

表示当前启动redis服务的目录,

  • 如果在linux上安装redis,需要改成固定目录
  • 如果docker redis,不需要修改

AOF文件名

appendfilename "appendonly.aof"

获取数据保存路径

config get dir

查看appendonly.aof内容

REDIS0009ú      redis-ver^E6.0.5ú
redis-bitsÀ@ú^EctimeÂa<93>ü^ú^Hused-memÂ@<85>^M^@ú^Laof-preambleÀ^Aÿ>ÊÑ]<82>â<87>|*2^M
$6^M
SELECT^M
$1^M
0^M

保存策略

一直同步(默认不开启)

每次 写命令 都会写入 AOF文件

# appendfsync always

每秒同步(默认开启)

每一秒将 写命令 写入 AOF文件,如果关机、redis崩溃,当前一秒的数据可能丢失

appendfsync everysec

不同步

# appendfsync no

文件重写rewrite

由于采用 追加 方式写 AOF文件,导致文件越来越大,为了避免这种情况,会:

fork子进程,将 整个内存中的数据 用命令方式重写入新的aof文件

bgrewriteaof

执行 bgrewriteaof 命令,会重写

自动重写

重写会消耗性能,所以要满足一定条件才会重新

系统载入时或上次重写完,会记录 AOF文件大小(base_size),当 AOF文件大小 大于等于 base_size+base_size*100%,且大于等于 64mb时,进行重新,配置如下:

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

数据恢复

  1. 关闭redis
  2. 把*.aof文件拷贝到数据保存路径,通过config get dir查看
  3. 启动redis,快照文件直接加载

aof文件损坏

通过下面命令恢复(但能力有限)

redis-check-aof --fix appendonly.aof

优点

  1. AOF可以更好的保护数据不丢失,一般AOF会每隔1秒,通过一个后台线程执行一次写操作,最多丢失1秒钟的数据。

  2. 采用追加方式,写入性能非常高,文件不容易破损。

  3. AOF日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写。

  4. AOF日志文件的命令通过 非常可读 的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。
    比如某人不小心用flushall命令清空了所有数据,只要这个时候后台rewrite还没有发生,那么就可以立即拷贝AOF文件,将最后一条flushall命令给删了,然后再将该AOF文件放回去,就可以通过恢复机制,自动恢复所有数据

缺点

  • AOF文件比RDB文件更大
  • 恢复数据慢,通过命令恢复数据
  • 当数据复杂时,存在个别bug,会造成不能完全恢复
  • AOF内容不要乱改,会造成不能完全恢复

原文出处:/show_1EF5ogEQAaRh.html