你见过不长毛的羊吗

Redis(六)-持久化之AOF

2019.08.01

1. AOF是什么

  • AOF(append only file) :以日志的形式来将Redis执行过的所有写指令记录到文件中,且只允许追加文件但不可以更改文件。默认文件名:appendonly.aof

    flushall也会被当做写操作,记录进文件

2. 如何启动AOF备份

  • 默认是关闭AOF备份功能的,将redis.conf中的appendonly no改为appendonly yes,即可开启AOF备份

3. 如何使用AOF进行数据恢复

  1. 保证appendonly 被设置为yes
  2. 将AOF文件放在redis安装目录。(使用config get dir 命令获取目录)
  3. 启动redis

4. AOF恢复的原理

  • Redis启动之初会读取该文件重新构建数据。就是将日志文件中的指令从头到尾执行一次,以完成数据的恢复工作

5. AOF的同步策略

  • appendfsync always:每修改同步。每次发生数据变化,就立刻记录到aof文件中。性能差,但数据完整性高
  • appendfsync everysec:默认。每秒同步,异步操作。每秒将数据变化记录到aof文件中。服务器一秒内down掉,会有数据丢失。这个操作是由一个线程专门负责执行的
  • appendfsync no: 将aof缓冲区中的内容写入到AOF文件中,但并不对AOF同步,何时同步交给OS

6. AOF-Rewrite

  • 由AOF的定义,我们不难知道AOF文件只会越来越大。为了避免这种清空,增加了重写机制
  • 当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集
  • 可以使用bgrewriteaof命令异步执行一个 AOF-Rewrite操作
  • 原理
    • AOF文件大小超过设定的阈值时,Redis会fork一条新的进程来将文件重写(先写成临时文件再rename)。
    • Redis会重新遍历fork出进程的内存中的数据,记录每一个与变更数据有关的指令。
    • 重写AOF文件的操作,并不是读取就的AOF文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的AOF文件。
  • 何时触发aof-rewrite
    • 默认配置是:当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发(Redis会记录上次重写是的AOF大小)
  • 如何配置
    • auto-aof-rewrite-percentage 100:触发重写的基准值
    • auto-aof-rewrite-min-size 64mb:触发重写基准值
    • no-appendfsync-on-rewrite no:重写时是否可以运用同步策略(appendfsync)。用默认no即可,保证数据安全

7. 如何修复损坏的AOF文件

  • AOF文件存在错误时,Redis是无法启动的。使用redis-check-aof --fix appendonly.aof 命令进行修复

8. AOF优劣势

  • 优势
    • AOF可以更好的保护数据不丢失,一般AOF会以每隔1秒,通过后台的一个线程去执行一次fsync操作,如果redis进程挂掉,最多丢失1秒的数据。
    • AOF以appen-only的模式写入,所以没有任何磁盘寻址的开销,写入性能非常高。
    • AOF 文件里面包含一个接一个的操作,具有很强的易读性。例如,即使你不小心错误地使用 FLUSHALL 命令清空一切,如果此时并没有执行重写,你仍然可以保存你的数据集,你只要停止服务器,删除最后一条命令,然后重启 Redis 就可以恢复
  • 劣势
    • 相同数据集的数据而言,AOF文件远大于RDB文件,恢复速度慢与RDB
    • AOF运行效率慢与RDB,每秒同步策略效率较好,不同步效率和RDB相同

9. RDB&AOF优先级

  • 同时开启RDB和AOF持久化的情况下,Redis会优先且只载入AOF文件来恢复数据。