Redis 持久化

Posted by icoding168 on 2020-04-17 15:31:41

分类: Redis  

Redis支持 RDB 和 AOF 两种持久化机制,持久化能避免因进程退出造成的数据丢失问题,重启 Redis 后导入之前持久化的文件即可恢复数据。

RDB

RDB 持久化是把当前进程数据生成快照保存到硬盘,触发 RDB 持久化有手动触发和自动触发两种方式。

手动触发 RDB 持久化可以用通过执行 bgsave 命令,执行 bgsave 命令后,Redis 进程会执行 fork 操作来创建子进程,RDB 持久化过程由子
进程负责,完成后自动结束。bgsave 对 Redis 造成的阻塞只发生在 fork 阶段,一般时间很短。

自动触发 RDB 的情况:

  • 如果没有开启 AOF 持久化功能,那么执行 shutdown 命令后 Redis 会自动执行 bgsave 命令
  • 如果从节点执行全量复制操作,主节点会自动执行 bgsave 命令生成 RDB 文件并发送给从节点

Redis 默认采用 LZF 算法对生成的 RDB 文件做压缩处理,压缩后的文件远远小于内存大小。RDB 文件是一个紧凑压缩的二进制文件,代表 Redis 在某个时间点上的数据快照,非常适合用于备份,全量复制等场景。比如每 6 小时执行 bgsave 命令,并把 RDB 文件拷贝到远程机器或者文件系统中,用于灾难恢复。

AOF

AOF 持久化是把每条写入命令作为日志,以 append-only 的模式写入一个日志文件中,在 Redis 重启的时候,可以通过回放 AOF 日志中的写入指令来恢复数据。

开启 AOF 功能需要设置配置:appendonly yes,默认不开启。AOF 文件名通过 appendfilename 配置设置,默认文件名是 appendonly.aof。保存路径同 RDB 持久化方式一样通过 dir 配置指定。

随着命令不断写入 AOF 文件,文件会越来越大,为了解决这个问题,Redis 引入 AOF 重写机制压缩文件体积。

AOF 重写机制通过以下几个方式来降低文件体积:

  • 合并多条命令为一条
  • 删除无效命令
  • 过期的数据不再写入文件

AOF 重写过程可以手动触发和自动触发:

  • 手动触发:直接调用 bgrewriteaof 命令。
  • 自动触发:根据 auto-aof-rewrite-min-size 和auto-aof-rewrite-percentage 参数确定自动触发时机。auto-aof-rewrite-min-size:表示运行AOF重写时文件最小体积,默认为 64MB。auto-aof-rewrite-percentage:代表当前 AOF 文件空间(aof_current_size)和上一次重写后AOF文件空间(aof_base_size)的比值。

加载持久化文件

Redis 默认开启 RDB 持久化方式,RDB 适合大规模的数据恢复但它的数据一致性和完整性较差,AOF 的数据完整性比 RDB 高但数据恢复速度慢,而且 AOF 可能会有一些隐藏的 Bug。最安全的做法是 RDB 与 AOF 同时使用,即使 AOF 文件损坏无法修复,还可以用 RDB 来恢复数据。

Redis 加载持久化文件的流程:

  • AOF 持久化开启且存在 AOF 文件时,优先加载 AOF文件
  • AOF 关闭或者 AOF 文件不存在时,加载 RDB文件
  • 加载 AOF/RDB 文件成功后,Redis 启动成功
  • AOF/RDB 文件存在错误时,Redis 启动失败并打印错误信息