关于redis:Redis持久化AOF

37次阅读

共计 2008 个字符,预计需要花费 6 分钟才能阅读完成。

AOF(append of only)相似于 MySQL 的 binlog,是将 redis 操作的指令做为日志保留到文件中,做为数据的备份。应用该文件能够重放所有时刻的内存数据,当然也能够复原到最新的数据状态。
AOF 保留的默认文件名为 dump.aof,能够通过配置批改文件名称

appendfilename appendonly.4379.aof

Redis 的默认状态是敞开 AOF 的长久化性能的,应用配置开启

appendonly yes

在 AOF 性能开启后,Redis 启动时会优先应用 aof 文件复原内存,这是因为 AOF 的数据绝对于 RDB 数据保留的更残缺一些,这个咱们前面会详情介绍。

AOF 长久化实现

Redis 在执行完写命令时,会将执行命令以一种协定的形式写入到 aof 文件中。Redis 对命令的长久化提供了三种模式:AOF_FSYNC_NO、AOF_FSYNC_EVERYSEC 和 AOF_FSYNC_ALWAYS。
Redis 在写文件的时候,操作系统内核会开启一个缓冲区 buffer,文件写入缓存区,当缓冲区已满时,操作系统会刷新 buffer 真正的写入到磁盘。程序也能够强制刷新缓冲区来将数据刷到磁盘上。依据这个机制,咱们看一下 Redis 的三种长久化模式的区别。

  • AOF_FSYNC_ALWAYS 每接管一个写操作都进行一次长久化,即先执行 write()函数,写入操作系统的缓冲区,而后再调用 fsync 将数据同步到磁盘上。
    Always 模式尽管保障了数据的安全性,但频繁的 IO 也会减少磁盘的压力,从而升高 Redis 的整体效率。
  • AOF_FSYNC_NO Redis 不会被动进行 fsync 操作,只会将数据写入到缓冲区,由操作系统来管制是否写入磁盘。刷盘的操作在以下三种状况下会被触发:
    AOF 性能被敞开
    Redis 服务敞开
    超过 30 秒(操作系统默认是 30 秒刷新一次缓存区)或操作系统缓冲区已满
    这种形式升高了 IO 频繁刷盘的压力,但数据安全性上会存在一些问题,服务宕机时有可能造成一个缓冲区大小的数据失落。
  • AOF_FSYNC_EVERYSEC 联合下面两种模式做了折中,每秒都会进行一次刷盘的操作,从数据安全性上和 IO 压力上进行了均衡。
    Redis 主过程会调用 fork()函数生成一个子过程,用于 aof 文件的存盘解决。子过程会每隔一秒钟执行一次 fsync 同步文件到磁盘,在执行 fsync 时,存在三种状况
    如果子过程正在进行 save 磁盘操作,且执行工夫小于 2 秒钟时,flushAppendOnlyFile 会立刻返回;
    当子过程执行 save 的工夫超过 2 秒钟时,则只会执行写入缓冲区操作。但此时写入缓冲区依然会阻塞期待之前的 save 执行结束能力进行,而后接着执行新的 save 操作;
    以后子过程没有执行 SAVE 操作,此时须要看间隔最近一次 save 胜利的工夫距离,如果大于 1 秒,则间接执行 write,并执行 save。小于 1 秒时则只进行 write 操作。
    从下面的过程来看 Redis 失落的数据有可能在 2 秒以上。EVERYSEC 模式兼顾了安全性和性能,适应大多数的利用场景,生产上个别也会应用这种模式。
appendfsync everysec
#appendfsync aways
#appendfsync no

AOF 文件重写

随着 Redis 运行工夫的减少,aof 文件会变的越来越大,redis 提供了从新的性能来防止文件过大而产生性能问题。
AOF 重写时也利用的写时复制机制,

  • 调用 fork()函数取得一个子过程,并和父过程共享内存数据
  • 子过程将内存数据转化成对应的命令协定数据,写入长期 aof 文件;同时父过程会开拓一块内存缓存区,接管新的写操作。在此过程中父过程仍然会向现有的 aof 文件追加操作指令,以保障以后的 aof 文件可用性
  • 子过程重写结束后,父过程会失去一个信号,将重写过程中接管到的写入操作追加到长期 aof 文件开端
  • 将 aof 文件切换到新的文件上

在 redis4.0 版本之后,反对采纳 RDB 和 AOF 的混合模式进行重写。Redis 先将内存数据已 RDB 的形式写入到 AOF 文件中,而后再将新增的写操作命令追加到文件开端。在 redis 进行内存加载时,当读取到文件以 REDIS 为结尾的数据时,就做为 RDB 的模式进行内存复原,而后对前面增量的 AOF 命令数据进行执行即可。这样即利用了 RDB 占用空间小和复原快的长处,还兼顾 AOF 数据存储实时的个性。
配置文件中这样开启

aof-use-rdb-preamble yes

AOF 重写触发机制

redis 中提供了 BGREWRITEAOF 命令来手动执行 aof 的重写。在配置文件能够通过如下配置来管制主动触发

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

Redis 每次 rewrite 之后会记录下来 aof 文件的大小,当 aof 文件大小大于 64M 并且超过了上次重写完的文件大小值的 100% 时,主动进行一次 rewrite 操作。

正文完
 0