美文网首页
Redis持久化之AOF

Redis持久化之AOF

作者: 猪儿打滚 | 来源:发表于2021-02-09 07:05 被阅读0次

    AOF是什么?

    AOF是redis持久化的策略之一。
    它以日志的形式来记录每个redis的写操作,将redis执行过的所有写指令记录下来(读操作不记录),并且它只允许往文件追加内容,而不可以改写文件。
    redis在启动时,会读取该文件重新构建数据。也就是,redis重启时,会根据AOF日志文件的内容将写指令从头到尾执行一次,来完成数据的恢复工作
    AOF保存的是appendonly.aof文件,redis.conf配置中,默认是no,不开启

    配置

    查看Redis配置中的第8点:APPEND ONLY MODE/追加

    AOF启动/修复/恢复

    • 启动
      启动:redis.conf文件中,把appendonly.aof no改成为yes
    • 正常恢复(aof文件正常)
      1.首先已经启动了aof策略
      2.把有数据的aof文件复制一份保存到redis的启动目录config get dir
      3.重启redis,redis会主动读取aof文件恢复数据

    注意.如果aof文件已损坏,那么在redis-cli启动时就会报错,比如Could not connect tot Redis at 127.0.0.1:6379: Connection refused

    • 异常恢复(aof文件已损坏)
      1.首先已经启动了aof策略
      2.备份此时损坏的aof文件(以防以后可能需要)
      3.cd到redis根目录,找到redis-check-aof脚本;执行修复命令:redis-check-aof --fix appendonly.aof进行修复
      4.重启redis,redis会主动读取aof文件恢复数据

    rewrite/重写

    1、是什么?

    由于AOF采用文件内容追加的方式,随着时间的增长,文件肯定会越来越大。为了避免出现这种情况,新增了rewrite/重写机制。
    也就是当AOF文件的大小超过所设定的阙值时,redis2.4以后,就会自动对AOF文件的内容压缩,只保留可以恢复数据的最小指令集。但是也可以使用命令bgrewriteaof来手动启动。

    2、触发机制

    Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发(实际应用肯定会调大这个值)

    3、重写原理
    • 在redis2.4以后,当AOF文件持续增长而过大,达到设定的阙值时,redis会自动fork一条新进程来讲aof文件进行重写,会遍历新进程的内存中数据,每条记录都有一条set语句。(采用先写个临时文件,最后再rename的方式)
    • 重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件(但是体积会比之前的小),和快照有些类似
    • redis2.4以后,也可以使用bgrewriteaof来手动启动重写
    • 即使重写执行失败,也不会有任何数据丢失,因为旧的AOF文件在bgrewriteaof成功之前不会被修改。

    优势

    有三种同步策略可选

    • 每次修改都同步:appendfsync always
      同步持久化,每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好
    • 每秒都同步:appendfsync everysec
      异步操作每秒记录,如果一秒内宕机,那么会有数据丢失
    • 不同步:appendfsync no
      不进行aof同步

    劣势

    • 相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb
    • Aof运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同

    appendonly.aofdump.rdb共存

    如果appendonly.aofdump.rdb共存,那么在恢复数据时,会先读取appendonly.aof

    小总结

    aof小总结

    相关文章

      网友评论

          本文标题:Redis持久化之AOF

          本文链接:https://www.haomeiwen.com/subject/qlmfxltx.html