Redis的持久化-AOF

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010028869/article/details/51792434

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


AOF设置

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


AOF测试

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

这里写图片描述

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


AOF文件重写

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

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

扫描二维码关注公众号,回复: 3776291 查看本文章

set count 1 //初始值为1
incr count // 加1
incr count //加1
decr count //减1

这个时候结果为

get count
“2”

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

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

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


重写策略

重写策略的参数设置:

auto-aof-rewrite-percentage 100

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

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。

猜你喜欢

转载自blog.csdn.net/u010028869/article/details/51792434
今日推荐