Redis数据持久化,及实现方式( 三 )


有三个选项:
每次有新命令追加到 AOF 文件时就执行一次 fsync :非常慢,也非常安全 。
每秒 fsync 一次:足够快(和使用 RDB 持久化差不多),并且在故障时只会丢失 1 秒钟的数据 。
从不 fsync :将数据交给操作系统来处理 。更快,也更不安全的选择 。
推荐(并且也是默认)的措施为每秒 fsync 一次,这种 fsync 策略可以兼顾速度和安全性 。
总是 fsync 的策略在实际使用中非常慢,即使在 Redis 2.0 对相关的程序进行了改进之后仍是如此 —— 频繁调用 fsync 注定了这种策略不可能快得起来 。
如果 AOF 文件出错了,怎么办?
服务器可能在程序正在对 AOF 文件进行写入时停机,如果停机造成了 AOF 文件出错(corrupt),那么 Redis 在重启时会拒绝载入这个 AOF 文件,从而确保数据的一致性不会被破坏 。
当发生这种情况时,可以用以下方法来修复出错的 AOF 文件:

  • 为现有的 AOF 文件创建一个备份 。
  • 使用 Redis 附带的 redis-check-aof 程序,对原来的 AOF 文件进行修复 。
  • $ redis-check-aof --fix
  • (可选)使用 diff -u 对比修复后的 AOF 文件和原始 AOF 文件的备份,查看两个文件之间的不同之处 。
  • 重启 Redis 服务器,等待服务器载入修复后的 AOF 文件,并进行数据恢复 。
? AOF运作方式
AOF 重写和 RDB 创建快照一样,都巧妙地利用了写时复制机制 。
以下是 AOF 重写的执行步骤:
  • Redis 执行 fork(),现在同时拥有父进程和子进程 。
  • 子进程开始将新 AOF 文件的内容写入到临时文件 。
  • 对于所有新执行的写入命令,父进程一边将它们累积到一个内存缓存中,一边将这些改动追加到现有 AOF 文件的末尾: 这样即使在重写的中途发生停机,现有的 AOF 文件也还是安全的 。
  • 当子进程完成重写工作时,它给父进程发送一个信号,父进程在接收到信号之后,将内存缓存中的所有数据追加到新 AOF 文件的末尾 。
  • 搞定!现在 Redis 原子地用新文件替换旧文件,之后所有命令都会直接追加到新 AOF 文件的末尾 。

Redis数据持久化,及实现方式

文章插图
图片来源于网络,侵删 。
回到顶部
vRDB和AOF合讲
? RDB VS AOF,选哪个好?
一般来说,如果想达到足以媲美 PostgreSQL 的数据安全性,你应该同时使用两种持久化功能 。
如果你非常关心你的数据,但仍然可以承受数分钟以内的数据丢失,那么你可以只使用 RDB 持久化 。
有很多用户都只使用 AOF 持久化,但我们并不推荐这种方式: 因为定时生成 RDB 快照(snapshot)非常便于进行数据库备份,并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快,除此之外,使用 RDB 还可以避免之前提到的 AOF 程序的 bug。
怎么从 RDB 持久化切换到 AOF 持久化
在 Redis 2.2 或以上版本,可以在不重启的情况下,从 RDB 切换到 AOF :
  • 为最新的 dump.rdb 文件创建一个备份 。
  • 将备份放到一个安全的地方 。
  • 执行以下两条命令:
redis-cli> CONFIG SET appendonly yesredis-cli> CONFIG SET save ""
  • 确保命令执行之后,数据库的键的数量没有改变 。
  • 确保写命令会被正确地追加到 AOF 文件的末尾 。
步骤 3 执行的第一条命令开启了 AOF 功能: Redis 会阻塞直到初始 AOF 文件创建完成为止,之后 Redis 会继续处理命令请求,并开始将写入命令追加到 AOF 文件末尾 。
步骤 3 执行的第二条命令用于关闭 RDB 功能 。这一步是可选的,如果你愿意的话,也可以同时使用 RDB 和 AOF 这两种持久化功能 。
别忘了在 redis.conf 中打开 AOF 功能! 否则的话,服务器重启之后,之前通过 CONFIG SET 设置的配置就会被遗忘,程序会按原来的配置来启动服务器 。
? RDB 和 AOF 之间的相互作用
在版本号大于等于 2.4 的 Redis 中,BGSAVE 执行的过程中,不可以执行 BGREWRITEAOF。反过来说,在 BGREWRITEAOF 执行的过程中,也不可以执行 BGSAVE。
这可以防止两个 Redis 后台进程同时对磁盘进行大量的 I/O 操作 。
如果 BGSAVE 正在执行,并且用户显示地调用 BGREWRITEAOF 命令,那么服务器将向用户回复一个 OK 状态,并告知用户,BGREWRITEAOF 已经被预定执行: 一旦 BGSAVE 执行完毕,BGREWRITEAOF 就会正式开始 。
当 Redis 启动时,如果 RDB 持久化和 AOF 持久化都被打开了,那么程序会优先使用 AOF 文件来恢复数据集,因为 AOF 文件所保存的数据通常是最完整的 。


推荐阅读