Redis教程

Redis6.x学习笔记(三)持久化之AOF

本文主要是介绍Redis6.x学习笔记(三)持久化之AOF,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

前言

最近学习Redis6.x,特做笔记以备忘,与大家共学。课程是从私塾在线下载的,他们把架构师课程都放出来了,大家可以去下载学习,不要钱的,地址是http://t.hk.uy/eK7,课程很不错,值得学习!关键是不要钱,嘻嘻!

AOF概述

默认的AOF持久化策略是每秒钟fsync一次,fsync是指把缓存中的写指令记录到磁盘中,在这种情况下,Redis仍可以保持很高的性能。

当然由于OS会在内核中缓存 write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。不过可以通过配置文件告诉Redis,想要通过fsync函数强制os写入到磁盘的时机。

AOF方式在同等数据规模的情况下,AOF文件要比RDB文件的体积大,因此AOF方式的恢复速度也要慢于RDB方式。

AOF优缺点

AOF优点:

更好的保护数据不丢失 、性能高、可做紧急恢复

AOF缺点:

文件比RDB文件大、写的QPS比RDB低

AOF的配置

1:appendonly:是否开启AOF

2:appendfilename:设置AOF的日志文件名

3:appendfsync:设置AOF日志如何同步到磁盘,fsync()调用,用来告诉操作系统立即将缓存的指令写入磁盘,有三个选项:

(1)always:每次写都强制调用fsync,这种模式下,redis会相对较慢,但数据最安全 
(2)everysec:每秒启用一次fsync
(3)no:不调用fsync()。而是让操作系统自行决定sync的时间。这种模式下,redis的性能会最快

4:no-appendfsync-on-rewrite:设置当redis在rewrite的时候,是否允许appendsync。因为redis进程在进行AOF重写的时候,fsync()在主进程中的调用会被阻止,也就是redis的持久化功能暂时失效。默认为no,这样能保证数据安全

5:auto-aof-rewrite-min-size:设置一个最小大小,是为了防止在aof很小时就触发重写

6:auto-aof-rewrite-percentage:设置自动进行AOF重写的基准值,也就是重写启动时的AOF文件大小,假如redis自启动至今还没有进行过重写,那么启动时aof文件的大小会被作为基准值。这个基准值会和当前的aof大小进行比较。如果当前aof大小超出所设置的增长比例,则会触发重写。如果设置auto-aof-rewrite-percentage为0,则会关闭此重写功能

AOF日志恢复

如果在追加日志时,恰好遇到磁盘空间满或断电等情况,导致日志写入不完整,也没有关系,Redis提供了redis-check-aof工具,可以用来进行日志修复,基本步骤如下:

1:备份被写坏的AOF文件
2:运行redis-check-aof –fix进行修复
3:用diff -u来看下两个文件的差异,确认问题点
4:重启redis,加载修复后的AOF文件

AOF重写

AOF采用文件追加方式,这会导致AOF文件越来越大.

为此,Redis提供了AOF文件重写(rewrite)机制,即当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。

可以使用命令bgrewriteaof

AOF重写的触发机制

Redis是这样工作的:

Redis会记录上次重写时的AOF大小。

假如自启动至今还没有进行过重写,那么启动时AOF文件的大小会被作为基准值,这个基准值会和当前的AOF大小进行比较,如果当前AOF大小超出所设置的增长比例,则会触发重写。

另外,你还需要设置一个最小大小,是为了防止在AOF很小时就触发重写

AOF重写的基本原理

1:在重写开始前,redis会创建一个“重写子进程”,这个子进程会读取现有的AOF文件,并将其包含的指令进行分析压缩并写入到一个临时文件中。

2:与此同时,主进程会将新接收到的写指令一边累积到内存缓冲区中,一边继续写入到原有的AOF文件中,这样做是保证原有的AOF文件的可用性,避免在重写过程中出现意外。

3:当“重写子进程”完成重写工作后,它会给父进程发一个信号,父进程收到信号后就会将内存中缓存的写指令追加到新AOF文件中

4:当追加结束后,redis就会用新AOF文件来代替旧AOF文件,之后再有新的写指令,就都会追加到新的AOF文件中

5:重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似

RDB+AOF混合方式概述

RDB+AOF的混合方式是:先使用RDB进行快照存储,然后使用AOF持久化记录所有的写操作,当重写策略满足或手动触发重写的时候,将最新的数据存储为新的RDB记录。

这样的话,重启服务的时候会从RDB和AOF两部分恢复数据,既保证了数据完整性,又提高了恢复数据的性能。

开启混合方式:

设置aof-use-rdb-preamble的值为 yes

数据的恢复顺序

1:判断是否开启AOF持久化,若开启了AOF,则使用AOF持久化文件恢复数据

2:如果AOF文件不存在,否则使用RDB持久化文件恢复数据

3:如果AOF文件和RDB文件都不存在则直接启动Redis

4:如果AOF或RDB文件出现错误,则启动失败返回错误信息

后记

我会持续的把我学习Redis6.x过程的笔记记录下来,跟大家一起学习。希望能坚持下去!


这篇关于Redis6.x学习笔记(三)持久化之AOF的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!