12.2.1 缓存与存储

  • 缓存: 缓存可重建, 但是在高并发下会造成雪崩
  • 存储: 对业务可能会造成巨大影响

12.2.2 借助 AOF 机制恢复

Redis 执行了 flush 操作后, AOF 持久化文件会受到什么影响呢?

  • appendonly no: 对 AOF 持久化没有任何影响, 因为根本就不存在 AOF 文件
  • appendonly yes: 只不过是在 AOF 文件中追加了一条记录, 例如下面就是AOF文件中的 flush 操作记录:
  1. *1
  2. $8
  3. flushall

注意:

如果发生了 AOF 重写, Redis 遍历所有数据库重新生成 AOF 文件, 并会覆盖之前的 AOF 文件。所以如果 AOF 重写发生了, 也就意味着之前的数据就丢掉了, 那么利用 AOF 文件来恢复的办法就失效了。所以当误操作后, 需要考虑如下两件事:

  • 调大 AOF 重写参数 auto-aof-rewrite-percentage 和 auto-aof-rewrite-min-size, 让 Redis 不能产生 AOF 自动重写
  • 拒绝手动 bgrewriteaof

如果要用 AOF 文件进行数据恢复, 那么必须要将 AOF 文件中的 flushall 相关操作去掉, 为了更加安全, 可以在去掉之后使用 redis-check-aof 这个工具去检验和修复一下 AOF 文件, 确保 AOF 文件格式正确, 保证数据恢复正常。

12.2.3 RDB 有什么变化

Redis 执行了 flushall 操作后, RDB 持久化文件会受到什么影响呢?

  1. 如果没有开启 RDB 的自动策略, 也就是配置文件中没有类似如下配置:
  1. save 900 1
  2. save 300 10
  3. save 60 10000

那么除非手动执行过 save、bgsave 或者发生了主从的全量复制, 否则 RDB 文件也会保存 flush 操作之前的数据, 可以作为恢复数据的数据源。

注意:
**

  • 防止手动执行 save、bgsave, 如果此时执行 save、bgsave, 新的 RDB 文件就不会包含 flush 操作之前的数据, 被老的 RDB 文件进行覆盖 (这一句没理解)
  • RDB 文件中的数据可能没有 AOF 实时性高, 也就是说, RDB 文件很可能很久以前主从全量复制生成的, 或者之前用 save、bgsave 备份的
  1. 如果开启了 RDB 的自动策略, 由于 flush 涉及键值数量较多, RDB 文件会被清除, 意味着使用 RDB 恢复基本无望

12.2.4 从节点有什么变化

Redis 从节点同步了主节点的 flush 命令, 所以从节点的数据也是被清除了, 从节点的 RDB 和 AOF 的变化与主节点没有任何区别。

12.2.5 快速恢复数据

以 AOF 为例:

  1. 防止 AOF 重写。快速修改 Redis 主从的 auto-aof-rewrite-percentage 和 auto-aof-rewrite-min-size 变为一个很大的值, 从而防止了 AOF 重写的发生
  1. config set auto-aof-rewrite-percentage 1000
  2. config set auto-aof-rewrite-min-size 100000000000
  1. 去掉主从AOF文件中的flush相关内容
  1. *1
  2. $8
  3. flushall
  1. 重启 Redis 主节点服务器,恢复数据