redis数据持久化

数据持久化

redis数据持久化策略有 AOFRDB 两种方案,其中 AOF为增量日志,RDB为全量内存快照。一般会使用两种方式一起实现redis数据持久化。

AOF

AOF (Append Only File) 是redis提供的一种增量形式的数据持久化形式,相对于RDB而言,操作更为轻量。在redis配置文件 redis.conf 中,默认开启了AOF,其配置为 appendonly no。同时,可以通过修改 appendfilename 来修改AOF文件保存的位置。

在不同的操作系统中,对于写数据的操作可能会有不同的处理方式。有些操作系统会立即将数据写入到磁盘上,而有些系统会先将数据写入到缓冲区,并在适当的时机将其写入到磁盘上。对于后一种实现,如果数据写入到缓冲区之后出现系统掉电关机,会导致缓冲区的数据丢失。对于以上情况,redis通过调用 fsync() 函数通知操作系统将数据写入到磁盘,保证数据安全。

在redis配置文件中,提供了三种fsync函数的调用策略:

  • appendfsync no: 不执行fsync,由操作系统决定什么时候写入数据到磁盘。这种情况下速度最快,但是可能会存在数据丢失的风险。
  • appendfsync always:在每次写入AOF日志后都执行fsync。这种情况速度最慢,但是可以保证数据安全。但是这种情况下会存在一些问题,加入系统正在执行大量的磁盘IO操作,这种情况下redis调用fsync可能会被长时间阻塞。
  • appendfsync everysec:每秒执行一次fsync,这是一种折中的方案。这也是redis提供的默认的方案。

AOF自动重写功能

AOF文件记录的是redis数据库所有的更新和写入操作,在经过一段时间之后,可能在文件中的数据已经过期或者被删除了,此时这种数据记录在AOF文件中是没有意义的。而随着运行时间的推移,这种这种数据的操作记录是不可避免地会被写入到AOF文件中,导致AOF文件中记录了大量的无效的数据操作,对性能会产生影响。针对以上情况,redis提供了AOF文件重写功能用于优化和压缩AOF文件。

在redis中,提供了 auto-aof-rewrite-percentageauto-aof-rewrite-min-size两个参数用于控制AOF文件重写的触发大小。第一个参数是一个百分比的数值,第二个参数是一个文件大小数值。默认配置如下:

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

如上的配置中,当AOF文件的大小到达上次重写时文件大小的100%,且当前AOF文件大小大于64mb时,触发AOF重写。

在AOF重写过程中,假如说有大量新的操作触发AOF写入。这种情况下,在AOF重写期间会有大量的磁盘IO,可能会导致磁盘负载增大而产生延迟增加响应时间。为了解决这个问题,redis提供 no-appendfsync-on-rewrite 参数用于控制是否在AOF重写期间将AOF写入请求写入到磁盘中。当设置参数值为no时,AOF重写期间会继续将AOF写入请求写入到磁盘中,这种情况下可以有效地避免数据的丢失。当设置参数值为yes时,在AOF重写期间,新来的AOF请求会被保存在缓冲区,在等待AOF重写完成之后再被写入到磁盘,这种情况下可以有效地提高redis性能,但是可能存在部分数据丢失。

当redis运行过程中由于系统崩溃导致AOF文件被中途截断时,再次启动redis时,redis会根据 aof-load-truncated 参数决定如何处理AOF文件。当设置值为yes时,将加载被截断的 AOF 文件,并且 Redis 服务器开始发出日志以通知用户事件。否则,如果选项设置为 no,服务器将退出并显示错误,并拒绝启动。当选项设置为 no 时,用户需要使用 "redis-check-aof" 工具修复 AOF 文件然后重新启动服务器。

RDB

RDB是直接保存某一时刻的内存快照,即将整个内存数据保存到文件中。与AOF不同的是,RDB记录的是实际的数据,而AOF记录的是操作数据的命令。

在数据恢复时,RDB的速度会高于AOF。RDB只需要将文件读入内存即可,而AOF需要解析文件之后逐行执行。

在redis中,可以通过配置save来设置RDB保存策略,配置方式如下:

save 900 1
save 300 10
save 60 10000

以上设置的含义为:当在900秒内执行1次数据修改时保存快照、当在300秒内执行10次数据修改时保存快照、当在60秒内执行10000次数据修改时保存快照。

类似文章