Redis之AOF持久化

Redis之AOF持久化

Redis提供AOF(Append Only Files)持久化功能,RDB持久化通过保存数据库中键值对来记录数据库的状态,AOF持久化通过保存Redis服务器所执行的写命令来记录数据库状态。

Redis.conf配置

1
2
3
appendfsync yes   
appendfsync always #每次有数据修改发生时都会写入AOF文件。
appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略。

AOF持久化的实现

具体实现可以分为命令追加(append),文件写入,文件同步三个步骤

命令追加

当Redis服务器打开了AOF持久化时,服务器在执行完一个写命令后,会以协议的格式将被执行的写命令追加到服务器状态的aof_buf缓冲区末尾。

AOF文件的写入和同步

使用 AOF 持久化需要设置同步选项,从而确保写命令什么时候会同步到磁盘文件上。这是因为对文件进行写入并不会马上将内容同步到磁盘上,而是先存储到缓冲区,然后由操作系统决定什么时候同步到磁盘。有以下同步选项:

选项 同步频率
always 每个写命令都同步
everysec 每秒同步一次
no 让操作系统来决定何时同步
  • always 选项会严重减低服务器的性能,每个事件循环都要将aof_buf中的内容写入到AOF文件中,但是也是最安全的,因为即使Redis宕机也只会丢失一个事件循环的所有命令数据。
  • everysec 选项比较合适,可以保证系统崩溃时只会丢失一秒左右的数据,并且 Redis 每秒执行一次同步对服务器性能几乎没有任何影响;
  • no 选项并不能给服务器性能带来多大的提升,而且也会增加系统崩溃时数据丢失的数量。

AOF重写

随着保存的命令越来越多,AOF文件中的内容也越来越多,而且AOF文件中的命令很有可能是冗余的,而且数据还原的时间就会越长,这时候就需要重写AOF文件来减小AOF文件的体积。

AOF文件重写的实现

服务器为了保存数据库的状态,其实实际上不是去读取AOF文件来实现重写,而是直接读取数据库的状态,比如读取List的值并且用一条RPUSH list的命令行代替保存在AOF文件中。

AOF后台重写

在执行BGREWRITEAOF命令时,Redis服务器会维护一个AOF重写缓冲区,该缓冲区会在子进程创建AOF文件期间,记录服务器所有的写命令,当子进程完成创建后,服务器会将重写缓冲区中所有的内容追加到AOF的文件末尾。最后服务器会用新的AOF文件替换旧的AOF文件

Redis4.0新功能简介:RDB-AOF混合持久化

Redis用户常常会在RDB和AOF之间陷入两难:

  • RDB持久化能够快速的恢复数据,但是在服务器停机时会丢失大量的数据;
  • AOF持久化能够有效提高数据的安全性,但是在存储和恢复方面耗费大量的时间;

Redis 4.0 推出了一个能够“鱼和熊掌兼得”的持久化方案 —— RDB-AOF 混合持久化: 这种持久化能够通过 AOF 重写操作创建出一个同时包含 RDB 数据和 AOF 数据的 AOF 文件, 其中 RDB 数据位于 AOF 文件的开头, 它们储存了服务器开始执行重写操作时的数据库状态: 至于那些在重写操作执行之后执行的 Redis 命令, 则会继续以 AOF 格式追加到 AOF 文件的末尾, 也即是 RDB 数据之后。

参考文献

Redis持久化RDB和AOF优缺点是什么?

AOF和RDB持久化

Redis 4.0 新功能简介:RDB-AOF 混合持久化