简述Redis的持久化-AOF「建议收藏」

2022-07-11 13:40:35 浏览数 (1)

大家好,又见面了,我是全栈君。

Redis的AOF持久化策略是将发送到Redis服务端的每一条命令都记录下来,并且保存到硬盘中的AOF文件中,类似打日志文件,来一条命令就记录一条。

AOF设置

AOF文件的位置和RDB文件的位置相同,都是通过dir参数设置,默认的文件名是appendonly.aof,可以通过appendfilename参数来修改。

AOF测试

当客户端向服务器发送一些redis命令时,Redis会将所执行的命令记录到aof文件中,如下所示:

当redis服务器重启后,会将执行该aof文件,达到数据恢复的目的。

AOF文件重写

为什么要重写?重写可以去除数据的中间执行过程,直接保留最终数据命令。

举个栗子:比如在redis客户端对key执行了一系列命令

代码语言:javascript复制
set count 1 //初始值为1
incr count // 加1
incr count //加1
decr count //减1

这个时候结果为

代码语言:javascript复制
get count
“2”

如果不进行AOF重写的话,进行AOF文件恢复的时候,Redis会执行AOF文件中的每一条命令,并最终得到 count 为2 。

进行AOF重写后,相当于把中间的计算过程略去。直接把计算得到的结果设置进redis,相当于仅执行了一条命令 set count 2。

可以使用BGREWRITEAOF命令来重写AOF文件。

重写策略

重写策略的参数设置:

代码语言:javascript复制
auto-aof-rewrite-percentage 100

当前的AOF文件大小超过上一次重写时的AOF文件大小的百分之多少时,会再次进行重写,如果之前没有重写过,则以启动时的AOF文件大小为依据。

代码语言:javascript复制
auto-aof-rewrite-min-size 64mb

限制了允许重写的最小AOF文件大小,通常在AOF文件很小的时候,即使其中有些冗余的命令也是可以忽略的。

RDB 优点

RDB 是一种表示某个即时点的 Redis 数据的紧凑文件。RDB 文件适合用于备份。例如,你可能想要每小时归档最近 24 小时的 RDB 文件,每天保存近 30 天的 RDB 快照。这允许你很容易的恢复不同版本的数据集以容灾。

RDB 非常适合于灾难恢复,作为一个紧凑的单一文件,可以被传输到远程的数据中心,或者是 Amazon S3(可能得加密)。

RDB 最大化了 Redis 的性能,因为 Redis 父进程持久化时唯一需要做的是启动(fork)一个子进程,由子进程完成所有剩余工作。父进程实例不需要执行像磁盘 IO 这样的操作。

RDB 在重启保存了大数据集的实例时比 AOF 要快。

RDB 缺点

当你需要在 Redis 停止工作(例如停电)时最小化数据丢失,RDB 可能不太好。你可以配置不同的保存点。然而,你通常每隔 5 分钟或更久创建一个 RDB 快照,所以一旦 Redis 因为任何原因没有正确关闭而停止工作,你就得做好最近几分钟数据丢失的准备了。

RDB 需要经常调用 fork()子进程来持久化到磁盘。如果数据集很大的话,fork()比较耗时,结果就是,当数据集非常大并且 CPU 性能不够强大的话,Redis 会停止服务客户端几毫秒甚至一秒。AOF 也需要 fork(),但是你可以调整多久频率重写日志而不会有损(trade-off)持久性(durability)。

AOF 优点

使用 AOF Redis 会更具有可持久性(durable):你可以有很多不同的 fsync 策略:没有 fsync,每秒 fsync,每次请求时 fsync。使用默认的每秒 fsync 策略,写性能也仍然很不错(fsync 是由后台线程完成的,主线程继续努力地执行写请求),即便你也就仅仅只损失一秒钟的写数据。

AOF 日志是一个追加文件,所以不需要定位,在断电时也没有损坏问题。即使由于某种原因文件末尾是一个写到一半的命令(磁盘满或者其他原因),redis-check-aof 工具也可以很轻易的修复。

AOF 文件里面包含一个接一个的操作,以易于理解和解析的格式存储。你也可以轻易的导出一个 AOF 文件。例如,即使你不小心错误地使用 FLUSHALL 命令清空一切,如果此时并没有执行重写,你仍然可以保存你的数据集,你只要停止服务器,删除最后一条命令,然后重启 Redis 就可以。

AOF 缺点

对同样的数据集,AOF 文件通常要大于等价的 RDB 文件。

AOF 可能比 RDB 慢,这取决于准确的 fsync 策略。通常 fsync 设置为每秒一次的话性能仍然很高,如果关闭 fsync,即使在很高的负载下也和 RDB 一样的快。不过,即使在很大的写负载情况下,RDB 还是能提供能好的最大延迟保证。

RDB和AOF如何取舍

通常来说,你应该同时使用这两种持久化方法,以达到和 PostgreSQL 提供的一样的数据安全程度。

如果你很关注你的数据,但是仍然可以接受灾难时有几分钟的数据丢失,你可以只单独使用 RDB。

有很多用户单独使用 AOF,但是我们并不鼓励这样,因为时常进行 RDB 快照非常方便于数据库备份,启动速度也较之快,还避免了 AOF 引擎的 bug。

两者的结合更完美。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/111993.html原文链接:https://javaforall.cn

0 人点赞