关于Redis持久化,你了解多少?(下)-内含整理资料

原文地址:

关于Redis持久化,你了解多少?(下)-内含整理资料

AOF(append-only-file),通过保存执行命令来记录数据库状态

 

AOF的配置

# 是否开启aof
appendonly yes

# 文件名称
appendfilename "appendonly.aof"

# 同步方式
appendfsync everysec

# aof重写期间是否同步
no-appendfsync-on-rewrite no

# 重写触发配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 加载aof时如果有错如何处理
aof-load-truncated yes

# 文件重写策略
aof-rewrite-incremental-fsync yes


复制代码还是重点解释一些关键的配置:appendfsync everysec 它其实有三种模式:

  • always:把每个写命令都立即同步到aof,很慢,但是很安全
  • everysec:每秒同步一次,是折中方案
  • no:redis不处理交给OS来处理,非常快,但是也最不安全

一般情况下都采用 everysec 配置,这样可以兼顾速度与安全,最多损失1s的数据。aof-load-truncated yes 如果该配置启用,在加载时发现aof尾部不正确是,会向客户端写入一个log,但是会继续执行,如果设置为 no ,发现错误就会停止,必须修复后才能重新加载。

开启AOF

将 redis.conf 的 appendonly 配置改为yes 即可。AOF 保存文件的位置和 RDB 保存文件的位置一样,都是通过redis.conf 配置文件的 dir 配置:可以通过 config get dir 命令获取保存的路径。

AOF重写

由于AOF持久化是Redis不断将写命令记录到AOF 文件中,随着Redis不断的进行,AOF 的文件会越来越大,文件越大,占用服务器内存越大以及AOF
恢复要求时间越长。为了解决这个问题,Redis新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。可以使用命令bgrewriteaof 来重新。
如果不进行 AOF 文件重写,那么 AOF 文件将保存四条 SADD
命令,如果使用AOF 重写,那么AOF 文件中将只会保留下面一条命令:

sadd animals "dog" "tiger" "panda" "lion" "cat"

也就是说 AOF 文件重写并不是对原文件进行重新整理,而是直接读取服务器现有的键值对,然后用一条命令去代替之前记录这个键值对的多条命令,生成一个新的文件后去替换原来的 AOF 文件。

AOF 文件重写触发机制:通过 redis.conf
配置文件中的 auto-aof-rewrite-percentage:默认值为100,以及auto-aof-rewrite-min-size:64mb
配置,也就是说默认Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发。

这里再提一下,我们知道 Redis 是单线程工作,如果 重写 AOF
需要比较长的时间,那么在重写 AOF 期间,Redis将长时间无法处理其他的命令,这显然是不能忍受的。Redis为了克服这个问题,解决办法是将 AOF
重写程序放到子程序中进行,这样有两个好处:

①、子进程进行 AOF
重写期间,服务器进程(父进程)可以继续处理其他命令。
②、子进程带有父进程的数据副本,使用子进程而不是线程,可以在避免使用锁的情况下,保证数据的安全性。
使用子进程解决了上面的问题,但是新问题也产生了:因为子进程在进行
AOF 重写期间,服务器进程依然在处理其它命令,这新的命令有可能也对数据库进行了修改操作,使得当前数据库状态和重写后的 AOF 文件状态不一致。

为了解决这个数据状态不一致的问题,Redis 服务器设置了一个 AOF
重写缓冲区,这个缓冲区是在创建子进程后开始使用,当Redis服务器执行一个写命令之后,就会将这个写命令也发送到 AOF 重写缓冲区。当子进程完成 AOF
重写之后,就会给父进程发送一个信号,父进程接收此信号后,就会调用函数将 AOF 重写缓冲区的内容都写到新的 AOF 文件中。
这样将 AOF 重写对服务器造成的影响降到了最低。

AOF的原理


AOF的整个流程大体来看可以分为两步,一步是命令的实时写入(如果是 appendfsync everysec 配置,会有1s损耗),第二步是对aof文件的重写。
对于增量追加到文件这一步主要的流程是:命令写入=>追加到aof_buf =>同步到aof磁盘。那么这里为什么要先写入buf在同步到磁盘呢?如果实时写入磁盘会带来非常高的磁盘IO,影响整体性能。
aof重写是为了减少aof文件的大小,可以手动或者自动触发,关于自动触发的规则请看上面配置部分。fork的操作也是发生在重写这一步,也是这里会对主进程产生阻塞。
手动触发: bgrewriteaof,自动触发 就是根据配置规则来触发,当然自动触发的整体时间还跟Redis的定时任务频率有关系。
下面来看看重写的一个流程图:


对于上图有四个关键点补充一下:
在重写期间,由于主进程依然在响应命令,为了保证最终备份的完整性;因此它依然会写入旧的AOF file中,如果重写失败,能够保证数据不丢失。
为了把重写期间响应的写入信息也写入到新的文件中,因此也会为子进程保留一个buf,防止新写的file丢失数据。
重写是直接把当前内存的数据生成对应命令,并不需要读取老的AOF文件进行分析、命令合并。
AOF文件直接采用的文本协议,主要是兼容性好、追加方便、可读性高可认为修改修复。

不能是RDB还是AOF都是先写入一个临时文件,然后通过 rename 完成文件的替换工作。

AOF的优缺点

优点:
①、AOF持久化的方法提供了多种的同步频率,即使使用默认的同步频率每秒同步一次,Redis 最多也就丢失 1 秒的数据
②、AOF 文件使用 Redis 命令追加的形式来构造,因此,即使Redis 只能向 AOF 文件写入命令的片断,使用 redis-check-aof 工具也很容易修正AOF 文件。
③、AOF文件的格式可读性较强,这也为使用者提供了更灵活的处理方式。例如,如果我们不小心错用了 FLUSHALL 命令,在重写还没进行时,我们可以手工将最后的FLUSHALL 命令去掉,然后再使用 AOF 来恢复数据。
缺点:
①、对于具有相同数据的的 Redis,AOF 文件通常会比 RDF文件体积更大。
②、虽然 AOF提供了多种同步的频率,默认情况下,每秒同步一次的频率也具有较高的性能。但在 Redis 的负载较高时,RDB 比 AOF 具好更好的性能保证。
③、RDB 使用快照的形式来持久化整个 Redis 数据,而 AOF只是将每次执行的命令追加到 AOF 文件中,因此从理论上说,RDB 比 AOF 方式更健壮。官方文档也指出,AOF 的确也存在一些 BUG,这些 BUG 在RDB 没有存在。

AOF和RDB如何选择?

在线上我们到底该怎么做?我提供一些自己的实践经验。

  • 如果Redis中的数据并不是特别敏感或者可以通过其它方式重写生成数据,可以关闭持久化,如果丢失数据可以通过其它途径补回;
  • 自己制定策略定期检查Redis的情况,然后可以手动触发备份、重写数据;
  • 单机如果部署多个实例,要防止多个机器同时运行持久化、重写操作,防止出现内存、CPU、IO资源竞争,让持久化变为串行;
  • 可以加入主从机器,利用一台从机器进行备份处理,其它机器正常响应客户端的命令;
  • RDB持久化与AOF持久化可以同时存在,配合使用。


5.0.5版本中,如果同时开启RDB和AOF进行持久化,在重启Redis时,只会加载AOF文件!!!

关于Redis持久化,你了解多少?(上)-内含整理资料

做不到这几点,你算什么合格的技术面试官啊?!

高频面试考点:LRU缓存淘汰算法

如何构建自己的知识体系?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Redis 有以下几种持久化方式: 1. RDB(Redis DataBase):它是通过在指定的时间间隔内将数据快照写入磁盘来实现持久化的。 2. AOF(Append Only File):它是通过将每次写入操作的命令记录在 AOF 文件中来实现持久化的。 RDB 和 AOF 有以下区别: 1. 写入性能:RDB 在执行快照时会对 Redis 的写入性能造成影响,而 AOF 只会在写入操作时记录命令,所以 AOF 的写入性能比 RDB 要高。 2. 数据恢复:RDB 只能恢复到最近的快照点,而 AOF 可以通过重放 AOF 文件中的所有命令来恢复数据。 3. 数据完整性:AOF 可以保证数据的完整性,因为它记录了每一次写入操作的命令,而 RDB 可能因为快照时间间隔的设置不当而导致数据丢失。 因此,不同的场景可以选择不同的持久化方式。如果需要优先考虑写入性能,可以选择 AOF;如果需要保证数据完整性,可以选择 AOF;如果既需要考虑写入性能,又需要保证数据完整性,可以同时使用 RDB 和 AOF。 ### 回答2: Redis有两种持久化方式:RDB和AOF。 RDB(Redis Database)是一种快照持久化方式,可以将Redis在某个时间点的数据保存到磁盘上的一个二进制文件中。RDB是通过fork一个子进程来进行持久化操作的,可以设置不同的触发条件和频率。RDB的优点是性能较高,因为它是将数据直接写入二进制文件,且文件相对较小;缺点是如果Redis崩溃,可能会丢失最后一次RDB文件生成之后的更改。 AOF(Append Only File)是一种追加日志持久化方式,可以将Redis的所有写操作以日志的形式追加到AOF文件中。AOF文件是一个文本文件,记录了Redis的写命令。AOF可以通过重放日志来恢复数据,因此相对于RDB来说更加可靠,但也会造成AOF文件相对较大、恢复速度较慢等问题。 两种方式的区别主要在于数据复现和性能上。RDB方式适用于需要频繁备份、数据恢复速度较快且可以容忍少量数据丢失的场景;AOF方式适用于需要实时、持续保持数据一致性且可以接受较长恢复时间的场景。 此外,Redis还提供了两种混合持久化方式,可以同时启用RDB和AOF进行持久化,以发挥各自的优势。可以根据具体需求的数据安全性、性能要求等来选择合适的持久化方式。 ### 回答3: Redis持久化方式有两种,分别是RDB(Redis DataBase)和AOF(Append Only File)。 RDB是将Redis在指定时间间隔内的数据快照保存到磁盘上,它是将当前Redis内存中的数据以快照的形式写入磁盘中的二进制文件。RDB的优点是占用磁盘空间较小,适用于数据备份、灾难恢复等场景。而RDB的缺点是在发生故障时,可能会丢失最后一次快照之后的数据。 AOF则是将每一条对Redis执行的写命令追加到文件末尾,它会记录每次写命令的执行顺序,以文本的方式保存在磁盘中。AOF的优点是可以完全恢复数据,同时也可以通过合并多个AOF文件来减小文件的大小。而AOF的缺点是占用的磁盘空间相对较大,同时AOF文件的更新频率也会对性能产生一定影响。 两种持久化方式的区别主要体现在数据恢复和磁盘空间使用方面。RDB方式在故障恢复时可能有一定的数据丢失,但是对于磁盘空间的占用较小;而AOF方式可以完全恢复数据,但是占用的磁盘空间相对较大。因此,在选择持久化方式时需要根据具体应用场景和需求来进行权衡。例如,对于需要高可用性的场景可以选择AOF方式,而对于数据备份和恢复速度较重要的场景可以选择RDB方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值