Redis-第五章 持久化

Redis支持两种持久化机制RDB和AOF,持久化功能有效避免退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。

一 RDB机制

RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发。

1 触发机制

手动触发分别对应save和bgsave命令。

  • save命令:阻塞当前redis服务器,知道RDB过程完成为止,对于内存比较大的实例会造成长时间阻塞,线上环境不建议使用;
  • bgsave命令:Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。

显然bgsave命令是对save阻塞问题的优化。因此redis内部所有涉及RDB操作都采用bgsave方式,而save命令已经废弃。

除了执行命令手动触发之外,redis内部还存在自动触发RDB的持久化机制,例如一下场景:

  • 使用save相关配置,如”save m n“。表示m秒内数据集存在n次修改时,自动触发bgsave;
  • 如果从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件并发送给从节点;
  • 执行debug reload命令重新加载Redis,也会自动触发save操作;
  • 默认情况下执行shutdown命令时,如果没有开启AOF持久化功能则自动执行bgsave。

2 流程说明

Redis-第五章 持久化

Redis-第五章 持久化

Redis-第五章 持久化

3 RDB文件的处理

保存:RDB文件保存在dir配置指定的目录下,文件名通过dbfilename配置指定。可以通过执行config set dir {newDir} 和config set dbfilename {newFileName}运行期动态执行,当下次运行时RDB文件会保存到新目录。

Redis-第五章 持久化

压缩:Redis默认采用LZF算法对生成的RDB文件做压缩处理,压缩后的文件远远小于内存大小,默认开启。可以通过参数config set rdbcompression {yes|no}动态修改。

Redis-第五章 持久化

校验:如果Redis加载损坏的RDB文件时拒绝启动,并打印如下日志:

Redis-第五章 持久化

这时可以采用Redis提供的redis-check-dump工具检测RDB文件并获取对应的错误报告。

4 RDB的优缺点

优点:

  • 它是一个紧凑压缩的二进制文件,代表Redis在某个时间点的数据快照。非常适用于备份,全量复制等场景。比如每6小时执行bgsave备份,并把RDB文件拷贝到远程机器或者文件系统中(如hdfs),用于灾难恢复;
  • Redis加载RDB恢复数据远远快与AOF的方式。

缺点:

  • RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运行都要执行fork操作创建子进程,属于重量级操作,频繁执行成本高;
  • RDB文件使用特定二进制格式保存,redis版本演进过程中有多个格式的rdb版本,存在老版本redis服务无法兼容新版rdb格式的问题。

二 AOF机制

AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中的命令达到恢复数据的目的。AOF的主要作用是解决了数据持久化的实时性,。

1 使用AOF

开启AOF功能需要配置appendonly yes,默认不开启。AOF文件名通过appendfilename配置设置,默认文件名是appendonly.aof。保存路径同RDB持久化方式一致,通过dir配置指定。AOF的工作流程操作:命令写入、文件同步、文件重写、重启加载。

 

Redis-第五章 持久化 Redis-第五章 持久化

2 命令写入

AOF命令写入的内容采用的是文本协议格式。

为什么使用文本协议格式?

  • 文本协议有很好的兼容性;
  • 开启AOF后,所有写入命令都包含追加操作,直接采用协议格式,避免了二次处理开销;
  • 文本协议具有可读性,方便直接修改和处理。

AOF为什么要把命令追加到aof_buf中?

redis使用单线程响应命令,如果每次写AOF文件命令都直接追加到硬盘,那么性能完全取决于当前硬盘负载。先写入缓冲区aof_buf中,还有另一个好虎,redis可以提供多种缓冲区同步硬盘的策略,在性能和安全性方面做出平衡。

3 文件同步

redis提供了多种AOF缓冲区同步文件策略,由参数appendfsync控制,不同值的含义如下:

  • always:命令写入aof_buf后调用系统fsync操作同步到AOF文件,fsync完成后线程返回;
  • everysec:命令写入aof_buf后调用系统write操作,write完成后线程返回。fsync同步文件操作有专门线程每秒调用一次;
  • no:命令写入aof_buf后调用系统write操作,不对AOF文件做fsync同步,同步硬盘由操作系统负责,通常同步周期最长30s。

系统调用write和fsync说明:

  • write操作会触发延迟写(delayed write)机制。linux在内核提供页缓冲区用来提高硬盘IO性能。write操作在写入系统缓冲区后直接返回。同步硬盘操作依赖于系统调度机制,例如:缓冲区页空间写满或达到特定时间周期。同步文件之前,如果此时系统故障宕机,缓冲区内数据将丢失;
  • fsync针对单个文件操作,做强制硬盘同步,fsync将阻塞直接写入硬盘完成后返回,保证了数据持久化。

除了write、fsync,linux还提供了sync和fdatasync操作。