一.AOF(Append Only File)概述
1.所谓的Redis的AOF持久化策略,其实就是将存储在内存中的数据以文件的形式存储在硬盘上的。这个文件我们称之为AOF文件,它存储的数据是客户端连接提交给Redis执行的写命令。redis启动之初会读取该文件重新构建数据,也就是说,重启的话会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
二.AOF持久化流程具体实现
aof流程大致可以分为命令追加、文件写入、数据同步。
1.命令追加
服务器在执行完一个写命令之后,会以协议格式将被执行的写命令追加到服务器状态的aof_bug缓冲区的末尾。
2.文件写入
服务器通过不停的时间循环来调用flushAppendOnlyFile函数处理aof_buf缓冲区中内容的写入。
3.数据同步
当用户调用write函数向文件中写入数据时,操作系统为了提高性能,一般会把数据暂时保存在内存缓冲区里面,等缓冲区满或者超过了指定的时限之后,才真正把缓冲区中的数据写入磁盘
三.AOF的三种同步策略(触发机制)
appendfsync everysec
默认配置,表示每隔1秒钟,调用fsync()函数,将aof_buf缓冲区中的数据写入磁盘,这是在速度与数据安全两者之间的折中选项,就算出现了故障停机,也只丢失一秒钟的操作数据。
appendfsync always
这是3种同步中最慢的方式,不过也是最安全的方式,每次调用flushAppendOnlyFile函数都会执行fsync操作。所以当出现了故障停机时,丢失的是一个事件循环过程中产生的命令数据。
appendfsync no
这是3种同步中最不安全的方式,缓冲区中的数据何时写入磁盘完全后操作系统决定,但也因为这种方式不需要调用flushAppendOnlyFile函数,所以也是3种方式中最快的.
四.AOF的优点
(1)AOF可以更好的保护数据不丢失,一般AOF会每隔1秒,通过一个后台线程执行一次fsync操作,最多丢失1秒钟的数据。
(2)AOF日志文件没有任何磁盘寻址的开销,写入性能非常高,文件不容易破损。
(3)AOF日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写。
(4)AOF日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。比如某人不小心用flushall命令清空了所有数据,只要这个时候后台rewrite还没有发生,那么就可以立即拷贝AOF文件,将最后一条flushall命令给删了,然后再将该AOF文件放回去,就可以通过恢复机制,自动恢复所有数据
四.AOF的缺点
(1)对于同一份数据来说,AOF日志文件通常比RDB数据快照文件更大
(2)AOF开启后,支持的写QPS会比RDB支持的写QPS低,因为AOF一般会配置成每秒fsync一次日志文件,当然,每秒一次fsync,性能也还是很高的
(3)以前AOF发生过bug,就是通过AOF记录的日志,进行数据恢复的时候,没有恢复一模一样的数据出来。