写点什么

Redis 的 AOF 方案(Redis 持久化)

发布于: 2021 年 04 月 21 日
Redis的AOF方案(Redis持久化)

上节我们谈了 Redis 的 RDB 持久化方案,今天我们来说下 AOF 持久化方案


AOF 方案介绍:


采用 AOF 持久方式时,Redis 会把每一个写请求都记录在一个日志文件里。在 Redis 重启时,会把 AOF 文件中记录的所有写操作顺序执行一遍,确保数据恢复到最新。AOF 默认是关闭的,如要开启,进行如下配置:


appendonly yes


AOF 提供了三种 fsync 配置,always/everysec/no,通过配置项[appendfsync]指定:


appendfsync no:不进行 fsync,将 flush 文件的时机交给 OS(操作系统)决定,速度最快

appendfsync always:每写入一条日志就进行一次 fsync 操作,数据安全性最高,但速度最慢

appendfsync everysec:折中的做法,交由后台线程每秒 fsync 一次


随着 AOF 不断地记录写操作日志,因为所有的操作都会记录,所以必定会出现一些无用的日志。大量无用的日志会让 AOF 文件过大,也会让数据恢复的时间过长。不过 Redis 提供了 AOFrewrite 功能,可以重写 AOF 文件,只保留能够把数据恢复到最新状态的最小写操作集。


AOF rewrite 可以通过 BGREWRITEAOF 命令触发,也可以配置 Redis 定期自动进行:


auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb


上面两行配置的含义是,Redis 在每次 AOFrewrite 时,会记录完成 rewrite 后的 AOF 日志大小,当 AOF 日志大小在该基础上增长了 100%后,自动进行 AOFrewrite。同时如果增长的大小没有达到 64mb,则不会进行 rewrite。

 

AOF 优点:

1、最安全,在启用 appendfsync always 时,任何已写入的数据都不会丢失,使用在启用 appendfsync everysec 也至多只会丢失 1 秒的数据

 

2、AOF 文件在发生断电等问题时也不会损坏,即使出现了某条日志只写入了一半的情况,也可以使用 redis-check-aof 工具轻松修复。

 

3、AOF 文件易读,可修改,在进行了某些错误的数据清除操作后,只要 AOF 文件没有 rewrite,就可以把 AOF 文件备份出来,把错误的命令删除,然后恢复数据。


AOF 的缺点:

1、AOF 文件通常比 RDB 文件更大

2、性能消耗比 RDB

3、数据恢复速度比 RDB


Redis 的数据持久化工作本身就会带来延迟,需要根据数据的安全级别和性能要求制定合理的持久化策略:

AOF + fsync always 的设置虽然能够绝对确保数据安全,但每个操作都会触发一次 fsync,会对 Redis 的性能有比较明显的影响

 

AOF + fsync every second 是比较好的折中方案,每秒 fsync 一次

 

AOF + fsync never 会提供 AOF 持久化方案下的最优性能使用 RDB 持久化通常会提供比使用 AOF 更高的性能,但需要注意 RDB 的策略配置

 

每一次 RDB 快照和 AOF Rewrite 都需要 Redis 主进程进行 fork 操作。fork 操作本身可能会产生较高的耗时,与 CPU 和 Redis 占用的内存大小有关。根据具体的情况合理配置 RDB 快照和 AOF Rewrite 时机,避免过于频繁的 fork 带来的延迟

 

Redis 在 fork 子进程时需要将内存分页表拷贝至子进程,以占用了 24GB 内存的 Redis 实例为例,共需要拷贝 24GB / 4kB * 8 = 48MB 的数据。在使用单 Xeon 2.27Ghz 的物理机上,这一 fork 操作耗时 216ms

 

AOF 方案配置

 

在 redis 中,aof 的持久化机制默认是关闭的

AOF 持久化,默认是关闭的,默认是打开 RDB 持久化

 

appendonly yes,可以打开 AOF 持久化机制,在生产环境里面,一般来说 AOF 都是要打开的,除非你说随便丢个几分钟的数据也无所谓


打开 AOF 持久化机制之后,redis 每次接收到一条写命令,就会写入日志文件中,当然是先写入 os cache 的,然后每隔一定时间再 fsync 一下


而且即使 AOF 和 RDB 都开启了,redis 重启的时候,也是优先通过 AOF 进行数据恢复的,因为 aof 数据比较完整


可以配置 AOF 的 fsync 策略,有三种策略可以选择,一种是每次写入一条数据就执行一次 fsync; 一种是每隔一秒执行一次 fsync; 一种是不主动执行 fsync


always: 每次写入一条数据,立即将这个数据对应的写日志 fsync 到磁盘上去,性能非常非常差,吞吐量很低; 确保说 redis 里的数据一条都不丢,那就只能这样了


注:在 redis 当中默认的 AOF 持久化机制都是关闭的

发布于: 2021 年 04 月 21 日阅读数: 149
用户头像

还未添加个人签名 2021.03.07 加入

还未添加个人简介

评论

发布
暂无评论
Redis的AOF方案(Redis持久化)