Redis-持久化之AOF(Append Only File)

是什么

以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

备份文件信息

  1. AOF保存的是appendonly.aof文件
  2. 保存路径:
    • 默认在redis的安装目录下
    • config get dir 获取aof文件保存目录
  3. 获取备份文件:
    • 先通过config get dir 查询aof文件目录
    • 将*.aof的文件拷贝到别的地方

配置

配置位置:APPEND ONLY MODE

APPEND ONLY MODE

  1. appendonly
    • 是否打开AOF持久化
    • 默认为no
  2. appendfilename
    • 持久化后文件名称(备份文件名称)
    • 默认为appendonly.aof
  3. appendfsync
    • always:同步持久化 每次发生数据变更会被立即记录到磁盘,性能较差但数据完整性比较好
    • everysec:出厂默认推荐,异步操作,每秒记录 如果一秒内宕机,有数据丢失
    • no: 不主动进行同步,把同步时机交给操作系统,由操作系统自动调度刷磁盘
  4. no-appendfsync-on-rewrite
    • 重写时是否可以运用appendfsync,用默认no即可,保证数据安全性
  5. auto-aof-rewrite-percentage
    • 设置重写的基准值
    • 当前aof文件触发Rewrite时必须大于等于上次Rewrite后aof文件大小的多少倍
  6. auto-aof-rewrite-min-size
    • 设置重写的基准值
    • 当前aof文件触发Rewrite的最小文件大小

AOF启动、修复、恢复

正常恢复

  1. 启动:appendonly设置为yes
    • 修改默认的appendonly no,改为yes
  2. 将有数据的aof文件复制一份保存到对应目录(config get dir)
  3. 恢复:重启redis然后重新加载

异常恢复

  1. 启动:appendonly设置为yes
    • 修改默认的appendonly no,改为yes
  2. 备份被写坏的aof文件
  3. 修复:redis-check-aof –fix appendonly.aof进行恢复
  4. 恢复:重启redis然后重新加载

Rewrite(重写机制)

是什么

AOF采用文件追加方式,文件会越来越大,为避免出现此种情况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaof

重写原理

AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),遍历新进程的内存中的数据,每条记录有一条set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。

触发机制

  • 重写虽然可以节约大量磁盘空间,减少恢复时间。但是每次重写还是有一定的负担的,因此设定redis需要满足一定条件才会进行重写。
  • 触发规则
  • 系统载入时或者上一次重写完毕是,Redis会记录此时aof文件的大小,设为base_size,如果Redis的aof当前大小>=base_size+base_size*100%(默认)且当前大小>=64mb(默认)的情况下,Redis会对aof文件进行重写。

Redis会记录上一次重写时的aof大小,默认配置是当aof文件大小是上次rewrite后大小的一倍且文件大于64M时触发

AOF的优缺点

优势

  1. 备份机制更稳健,丢失数据概率更低
    • 每修改同步:appendfsync always 同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差,但数据完整性比较好
    • 每秒同步:appendfsync everysec 异步操作,每秒记录 如果一秒内宕机,有数据丢失
    • 不同步:appendfsync no 从不同步
  2. 可读的日志文件,通过操作aof文件,可以处理误操作(虽然rdb也可以,但是rdb不容易读)

劣势

  1. 相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb
  2. aof运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同
  3. 每次读写都同步的话,有一定的性能压力(每修改同步:appendfsync always)
  4. 存在个别BUG,造成恢复不成功

同时开启两种持久化方式

在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据

因为在通常情况下AOF文件保存的数据集要不RDB文件保存的数据集要完整。

RDB的数据不实时,同时使用两者时服务器重启也只会找AOF文件。

那要不要只使用AOF呢?

作者建议不要

因为RDB更适合用于备份数据库(AOF在不断变化不好备份),

快速重启,而且不会有AOF可能潜在的BUG,留一个作为万一的手段。

总结

AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾。

Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大。

  • aof文件是一个只进行追加的日志文件
  • redis可以在aof文件体积变得过大时,自动地在后台对aof进行重写
  • aof文件有序地保存了对数据库执行的所有写入操作,这些写入操作以redis协议的格式保存,因此aof文件的内容非常容易被人读懂,对文件分析也很轻松
  • 对于相同的数据集来说,aof文件的体积通常要大于rdb文件的体积
  • 根据所使用的fsync策略,aof的速度可能会慢于rdb

最后更新: 2020年07月19日 00:01

原始链接: http://ligangit.com/2020/07/16/Redis-持久化之AOF/

× 请我吃糖~
打赏二维码