zoukankan      html  css  js  c++  java
  • Redis的flushall/flushdb误操作

      Redis的flushall/flushdb命令可以做数据清除,对于Redis的开发和运维人员有一定帮助,然而一旦误操作,它的破坏性也是很明显的。怎么才能快速恢复数据,让损失达到最小呢?

      假设进行flush操作的Redis是一对主从结构的主节点,其中键值对的个数是100万,每秒写入量是1000。

     

    1.缓存与存储

      被误操作flush后,根据当前Redis是缓存还是存储使用策略有所不同:

    □ 缓存: 对于业务数据的正确性可能造成损失还小一点,因为缓存中的数据可以从数据源重新进行构建,但是Redis存在缓存雪崩和缓存穿透的问题,当前场景也有类似的地方,如果业务方并发量很大,可能会对后端数据源造成一定的负载压力,这个问题也是不容忽视。

    □ 存储: 对业务方可能会造成巨大的影响,也许flush操作后的数据是重要配置,也可能是一些基础数据,也可能是业务上的重要一环,如果没有提前做业务降级操作,那么最终反馈到用户的应用可能就是报错或者空白页面等,其后果不堪设想。即使做了相应的降级或者容错处理,对于用户体验也有一定的影响。

      所以Redis无论作为缓存还是作为存储,如何能在flush操作后快速恢复数据才是至关重要的。持久化文件肯定是恢复数据的媒介,下面两个小节将对AOF和 RDB文件进行分析。

     

    2.借助AOF机制恢复

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

    □ appendonly no: 对 AOF持久化没有任何影响,因为根本就不存在AOF文件。

    □ appendonly yes: 只不过是在AOF文件中追加了一条记录,例如下面就是AOF文件中的flush操作记录:

    *1
    $8
    flushall

      虽然Redis中的数据被清除掉了,但是AOF文件还保存着flush操作之前完整的数据,这对恢复数据是很有帮助的。注意问题如下:

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

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

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

     

    3.RDB有什么变化

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

    1) 如果没有开启RDB的自动策略,也就是配置文件中没有类似如下配置:

    save 900 1
    save 300 10
    save 60 10000

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

    □ 防止手动执行save、bgsave, 如果此时执行save、bgsave, 新的 RDB 文件就不会包含flush操作之前的数据,被老的RDB文件进行覆盖。

    □ RDB文件中的数据可能没有AOF实时性高,也就是说,RDB文件很可能很久以前主从全量复制生成的,或者之前用save、bgsave备份的。

    2) 如果开启了RDB的自动策略,由于flush涉及键值数量较多, RDB 文件会被清除,意味着使用RDB恢复基本无望。

      综上所述,如果AOF已经开启了,那么用AOF来恢复是比较合理的方式,但是如果AOF关闭了,那么RDB虽然数据不是很实时,但是也能恢复部分数据,完全取决于RDB是什么时候备份的。当然RDB并不是一无是处,它的恢复速度要比AOF快很多,但是总体来说对于flush操作之后不是最好的恢复数据源。

     

    4.从节点有什么变化

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

     

    5.快速恢复数据

      下面使用AOF作为数据源进行恢复演练。

    1) 防止 AOF 重写。快速修改Redis主从的 auto-aof-rewrite-percentage 和 auto-aof-rewrite-min-size变为一个很大的值,从而防止了AOF重写的发生,例如:

    config set auto-aof-rewrite-percentage 1000
    config set auto-aof-rewrite-min-size 100000000000

    2) 去掉主从AOF文件中的flush相关内容:

    *1
    $8
    flushall

      3) 重启Redis主节点服务器,恢复数据。

     

     

    作者:小家电维修

    相见有时,后会无期。

  • 相关阅读:
    页面性能
    js运行机制
    渲染机制
    通信类
    js面向对象 继承
    原型
    [HEOI2016/TJOI2016]求和
    「NOIP2018 保卫王国」
    「LGP4719【模板】动态dp」
    多项式进阶操作
  • 原文地址:https://www.cnblogs.com/lizexiong/p/14730747.html
Copyright © 2011-2022 走看看