Redis 数据持久化

查看原文

本文是 Redis Persistence 的 tech spec,是一篇每个 Redis 用户都建议读的文章。

  • RDB 是定时存储快照
  • AOF 是增量添加写操作的日志(append-only fashion)
  • 两个都是可选关掉的,或者同时打开。AOF 优先用于重启时的数据恢复

比较:

  • RDB
    • 单文件,压缩好,适合备份做灾难恢复,恢复速度快,备份进程不影响提供服务的父进程的性能。
    • 可能会丢数据(总不能每秒都 dump 吧?一般隔几个分钟小时的),备份时 fork 会可能卡住父进程一会会儿。
    • 基本流程:Redis fork, 子进程把数据全量写到 rdb 文件,写完后替换老的 rdb 文件。
  • AOF
    • 优点:性能好!能在日志太大时自动 rewrite, 也不会影响现有的插入
    • 缺点:日志数据可能会坏掉,比如因为断电一行日志没写完,可以通过 redis-check-aof 简单修复。
    • 缺点: 日志大,速度慢,可能恢复出来的数据会不一样(bug,但可能发生)
    • 性能:根据不同 fsync 可以调整对父进程的性能影响, fsync 每次写性能差但数据更安全,隔几秒刷一次性能好一些,从不 fsync 让操作系统来管的话就更不安全然而快的飞起。一般来说每秒 fsync 足够安全。
    • 数据修复: 备份 aof 文件,运行 redis-check-aof --fix,重启 Redis。可以通过 diff 来看中间什么数据丢了。
    • Log rewriting 基本流程: fork, 子进程开写新的 AOF 文件,Redis 在内存中暂存数据,写完后把新的写操作应用到 AOF 文件去,最后替换老的 aof 文件。

使用:

  • 如果很关心数据安全,二者都开
  • 如果丢几分钟数据不打紧,开 RDB
  • 单开 AOF 不推荐,有个 RDB 在你为什么不用!