Redis之AOF持久化

AOF

AOF( append only file )持久化:以独立日志的方式记录每次写命令,并在 Redis 重启时在重新执行 AOF 文件中的命令以达到恢复数据的目的。AOF 的主要作用是解决数据持久化的实时性。

AOF持久化实现

开启AOF功能需要设置配置appendonly yea,默认不开启。AOF文件名通过appendfilename配置设置,默认文件名是appendonly,aof。保存路径同RDB持久化方式一致,通过dir配置指定。

AOF相关配置
在这里插入图片描述
AOF的工作流程操作:命令写入(append)、文件同步(sync)、文件重新(rewrite)、重启加载(load)
在这里插入图片描述
其流程如下:

  1. 所有的写命令会追加到 AOF 缓冲中。
  2. AOF 缓冲区根据对应的策略向硬盘进行同步操作。
  3. 随着 AOF 文件越来越大,需要定期对 AOF 文件进行重写,达到压缩的目的。
  4. 当 Redis 重启时,可以加载 AOF 文件进行数据恢复。

命令写入

当 AOF 持久化功能处于打开状态时,Redis 在执行完一个写命令之后,会以文本协议格式(也就是RESP,即 Redis 客户端和服务器交互的通信协议 )将被执行的写命令追加到 Redis 服务端维护的 AOF 缓冲区末尾。

比如说 SET mykey myvalue 这条命令就以如下格式记录到 AOF 缓冲中。
在这里插入图片描述
AOF之所以直接采用文本协议格式,是因为文本协议具有很好的兼容性,开启AOF后,所有写入命令都要进行追加操作,直接采用协议格式,避免了二次处理开销。

文件同步

Redis提供了多种AOF缓冲区同步文件策略,由参数appendfsync控制,不同值的含义如下表
在这里插入图片描述
系统调用write和fsync说明:

  • write 操作会触发延迟写( delayed write )机制。Linux 在内核提供页缓存区用来提供硬盘 IO 性能。write 操作在写入系统缓冲区之后直接返回。同步硬盘操作依赖于系统调度机制,例如:缓冲区页空间写满或者达到特定时间周期。同步文件之前,如果此时系统故障宕机,缓冲区内数据将丢失。
  • fsync 针对单个文件操作(比如AOF文件),对其进行强制硬盘同步,fsync 将阻塞直到写入磁盘完成后返回,保证了数据持久化。

appendfsync的三个值代表着三种不同的调用 fsync的策略。调用fsync周期越频繁,读写效率就越差,但是相应的安全性越高,发生宕机时丢失的数据越少。

  • always:Redis 在每个事件循环都要将 AOF 缓冲区中的所有内容写入到 AOF 文件,并且同步 AOF 文件,所以 always 的效率是 appendfsync 选项三个值当中最差的一个,但从安全性来说,也是最安全的。当发生故障停机时,AOF 持久化也只会丢失一个事件循环中所产生的命令数据。
  • everysec:是建议的同步策略,也是默认配置。Redis 在每个事件循环都要将 AOF 缓冲区中的所有内容写入到 AOF 文件中,并且每隔一秒就要在子线程中对 AOF 文件进行一次同步。从效率上看,该模式足够快。当发生故障停机时,理论上只有在系统突然宕机的情况下丢失1秒的数据。
  • no:Redis 在每一个事件循环都要将 AOF 缓冲区中的所有内容写入到 AOF 文件。而 AOF 文件的同步由操作系统控制,所以周期不可控,而且会加大每次同步硬盘的数据量。这种模式下速度最快,但是同步的时间间隔较长,出现故障时可能会丢失较多数据。

重写机制

随着命令不断写入AOF,文件会越来越大,为了解决这个问题,Redis引入AOF重写机制压缩文件体积。AOF文件重写是把Redis进程内的数据转换为写命令同步到新的AOF文件的过程。

AOF重写过程可以手动触发和自动触发:

  • 手动触发:直接调用 BGREWRITEAOF命令。
  • 自动触发:根据auto-aof-rewrite-min-size 和 auto-aof-rewrite-percentage参数确定自动触发时机.
  • auto-aof-rewrite-min-size :表示AOF重写时文件最小值,默认为64MB
  • auto-aof-rewrite-percentage:当前AOF文件(aof_current_size)和上一次重写后AOF文件空间(aof_base_size)的比值
  • 自动触发时机=aof_current_size>auto-aof-rewrite-min-size&&(aof_current_size - aof_base_size)/aof_base_size>=auto-aof-rewrite-percentage
    其中aof_current_size和aof_base_size可以在info persistence统计信息中查看

重写流程:
在这里插入图片描述
流程说明:
1)执行 aof 重写请求
如果当前进程正在执行 aof 重写,请求不执行并返回如下响应

ERR Background append only file rewriting already in process

如果当前正在执行 bgsave ,重写命令等待 bgsave 完成后执行 ,返回如下响应

Background append only file rewriting shceduled

2)父进程执行 fork 创建子进程,开心等同于bgsave过程

3.1)父进程 fork 操作完毕之后,依然响应其他命令,所有修改命令依然写入 aof 缓冲区,并根据 appendfsync策略同步到硬盘,保证原有 aof 机制的有效性。

3.2)由于 fork 操作采用写时复制技术,子进程只能共享fork 操作时的内存数据,由于父进程依然响应命令,redis 使用 aof 重写缓冲区 保存这部分新数据,防止aof文件生成期间这部分数据的丢失。

4)子进程根据内存快照,按照命令合并规则写入到新的 aof 文件。每次批量写入硬盘数据量由配置aof-rewrite-incremental-fsync控制,默认为32MB,防止单次刷盘数据过多造成硬盘阻塞。

5.1)新 AOF 文件写入完成之后,子进程发送信号给父进程,父进程更新统计信息,具体见info persistence 下的aof_*相关统计。

5.2)父进程把 AOF重写缓冲区的数据写入 新的 AOF文件

5.3) 使用新AOF文件替换旧的 aof 文件,完成AOF重写

本文摘自《Redis开发与运维》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值