redis初级——持久化AOF

持久化之AOF

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

​ 开启AOF功能需要设置配置:appendonly yes,默认不开启。AOF文件名通过appendfilename配置设置,默认文件名是appendonly.aof。保存路径同RDB持久化方式一致,通过dir配置指定。AOF的工作流程操作:命令写入(append)、文件同步(sync)、文件重写(rewrite)、重启加载(load)。

(1)所有的写入命令会追加到aof_buf(缓冲区)中。

(2)AOF缓冲区根据对应的策略向硬盘做同步操作。

(3)随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目的。

(4)当Redis服务器重启时,可以加载AOF文件进行数据恢复。

AOF工作流程

1.命令写入

​ AOF命令写入的内容直接是文本协议格式。例如set hello world这条命令,在AOF缓冲区会追加如下文本:

*3\r\n$3\r\nSET\r\n$5\r\nhello\r\n$5\r\nworld\r\n

​ 关于命令写入还有两个疑问。

(1)AOF为什么直接采用文本协议格式?

​ ① 文本协议具有很好的兼容性。

​ ② 开启AOF后,所有写入命令都包含追加操作,直接采用协议格式,避免了二次处理开销。

​ ③ 文本协议具有可读性,方便直接修改和处理。

(2)AOF为什么会把命令追加到aof_bug中?

​ Redis使用单线程响应命令,如果每次写AOF文件命令都追加到硬盘,那么性能将完全取决于硬盘负载。先写入缓冲区aof_buf中,还有另一个好处,Redis可以提供多种缓冲区同步硬盘的策略,在性能和安全性方面做出平衡。

2.文件同步

​ Redis提供了三种AOF缓冲区同步文件策略,由参数appendfsync控制,分别为noalwayseverysec

fsync()的调用是为了告诉操作系统将数据实际写到硬盘上,而appendfsync配置则决定了何时调用fsync()

可配置值说明
no命令写入到aof_buf缓冲区后,调用操作系统的write操作,不调用fsync方法
always命令写入到aof_buf缓冲区后,调用fsync方法
everysec命令写入到aof_buf缓冲区后,调用操作系统的write操作,fsync方法由专门线程每秒调用一次

write是将数据写入到文件系统缓冲区,其数据还是在内存中,fsync则是强制将数据写入到硬盘中。

(1)always

​ 当配置为always时,每次写入命令都要同步AOF文件,如果使用的是SATA硬盘,Redis此时只能支持大约几百的TPS写入,性能方面大大降低。

(2)no

​ 当配置为no时,由于操作系统每次将数据实际写入到硬盘并不可控,而且会大大加大每次同步硬盘的数据量。虽然性能上会有所提上,但是数据的安全性却无法得到保障。

(3)everysec

​ 配置为everysec,是Redis的默认配置也是建议配置,兼顾了性能和数据的安全。在性能上和always配置几乎一样,在数据安全方面理论上在宕机的时候会丢失掉一秒的数据。

3.文件重写

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

​ 重写后的AOF是如何变小的?

(1)已经过时的键将不会再被记录。

(2)已经被删除不存在的键将不再会被记录。

(3)将可以合并的命令进行合并。例如:rpush a,rpush b,rpush c 合并成 rpush a b c

重写后的aof文件体积更小,可以更快的被Redis读取加载。

AOF重写可以分为手动触发和自动触发:

​ 手动触发:直接使用bgrewriteaof命令

​ 自动触发:根据配置的auto-aof-rewrite-min-sizeauto-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

重写的流程:

  • (1)bgrewriteaof触发重写,判断是否当前有bgsave或bgrewriteaof在运行,如果有,则等待该命令结束后再继续执行。
  • (2)主进程fork出子进程执行重写操作,保证主进程不会阻塞。
  • (3)子进程遍历redis内存中数据到临时文件,客户端的写请求同时写入aof_buf缓冲区和aof_rewrite_buf重写缓冲区,保证原AOF文件完整以及新AOF文件生成期间的新的数据修改动作不会丢失。
  • (4)
    • 1).子进程写完新的AOF文件后,向主进程发信号,父进程更新统计信息。
    • 2).主进程把aof_rewrite_buf中的数据写入到新的AOF文件。
  • (5)使用新的AOF文件覆盖旧的AOF文件,完成AOF重写。

4.重启加载

​ AOF和RDB文件都可以用于服务器重启时的数据恢复。下图表示Redis持久化文件的加载流程。

持久化文件加载流程

流程说明:

(1) AOF持久化开启且存在AOF文件时,优先加载AOF文件。

(2) AOF关闭或者AOF文件不存在时,加载RDB文件。

(3) 加载AOF/RDB文件成功后,Redis启动成功。

(4) AOF/RDB文件存在错误时,Redis启动失败并打印错误信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值