首页 > 数据库 >Redis线上救命丸:01---误操作AOF、RDB恢复数据

Redis线上救命丸:01---误操作AOF、RDB恢复数据

时间:2022-11-01 14:38:53浏览次数:45  
标签:AOF 01 文件 RDB Redis flush 数据

  • Redis的flushall/flushdb命令可以做数据清除,对于Redis的开发和运维人员有一定帮助,然而一旦误操作,它的破坏性也是很明显的。怎么才能快速恢复数据,让损失达到最小呢?本文我们将结合之前学习的Redis相关知识进行分析,最后给出一个合理的方案
  • 注意:为了方便说明,下文中除了AOF文件中的flushall/flushdb以外,其他所有的flushall/flushdb都用flush代替
  • 本文假设进行flush操作的Redis是一对主从结构的主节点,其中键值对的个数是100万,每秒写入量是1000

一、缓存与存储

  • 被误操作flush后,根据当前Redis是缓存还是存储使用策略有所不同:
  • 缓存:对于业务数据的正确性可能造成损失还小一点,因为缓存中的数据可以从数据源重新进行构建,但是在前面文章介绍了缓存雪崩和缓存穿透的相关知识,当前场景也有类似的地方,如果业务方并发量很大,可能会对 后端数据源造成一定的负载压力,这个问题也是不容忽视
  • 存储:对业务方可能会造成巨大的影响,也许flush操作后的数据是重要配置,也可能是一些基础数据,也可能是业务上的重要一环,如果没有提 前做业务降级操作,那么最终反馈到用户的应用可能就是报错或者空白页面 等,其后果不堪设想。即使做了相应的降级或者容错处理,对于用户体验也有一定的影响
  • 所以Redis无论作为缓存还是作为存储,如何能在flush操作后快速恢复数据才是至关重要的。持久化文件肯定是恢复数据的媒介,下面将对AOF和RDB文件进行分析

二、借助AOF机制恢复

  • 关于AOF语法可以参阅:之前我发表的Redis使用篇里关于AOF的介绍
  • Redis执行了flush操作后,AOF持久化文件会受到什么影响呢?如下所示:
  • appendonly no:对AOF持久化没有任何影响,因为根本就不存在AOF文 件
  • appendonly yes:只不过是在AOF文件中追加了一条记录,例如下面就是AOF文件中的flush操作记录:
  1. *1
  2. $8
  3. flushall
  • 虽然Redis中的数据被清除掉了,但是AOF文件还保存着flush操作之前完整的数据,这对恢复数据是很有帮助的。注意问题如下:
  • 调大AOF重写参数auto-aof-rewrite-percentage和auto-aof-rewrite-minsize,让Redis不能产生AOF自动重写
  • 拒绝手动bgrewriteaof
  • 1)如果发生了AOF重写,Redis遍历所有数据库重新生成AOF文件,并会覆盖之前的AOF文件。所以如果AOF重写发生了,也就意味着之前的数据就丢掉了,那么利用AOF文件来恢复的办法就失效了。所以当误操作后,需要考虑如下两件事:
  • 2)如果要用AOF文件进行数据恢复,那么必须要将AOF文件中的flushall相关操作去掉,为了更加安全,可以在去掉之后使用redis-check-aof这个工具去检验和修复一下AOF文件,确保AOF文件格式正确,保证数据恢复正常

三、RDB有什么变化 

  • Redis执行了flushall操作后,RDB持久化文件会受到什么影响呢?
  • 1)如果没有开启RDB的自动策略:那么除非手动执行过save、bgsave或者发生了主从的全量复制,否则RDB文件也会保存flush操作之前的数据,可以作为恢复数据的数据源。注意问题如下:
  • RDB文件中的数据可能没有AOF实时性高,也就是说,RDB文件很可能很久以前主从全量复制生成的,或者之前用save、bgsave备份的
  • 防止手动执行save、bgsave,如果此时执行save、bgsave,新的RDB文件就不会包含flush操作之前的数据,被老的RDB文件进行覆盖
  • 2)如果开启了RDB的自动策略:由于flush涉及键值数量较多,RDB文件会被清除,意味着使用RDB恢复基本无望
  • 综上所述,如果AOF已经开启了,那么用AOF来恢复是比较合理的方式,但是如果AOF关闭了,那么RDB虽然数据不是很实时,但是也能恢复部分数据,完全取决于RDB是什么时候备份的。当然RDB并不是一无是处,它 的恢复速度要比AOF快很多,但是总体来说对于flush操作之后不是最好的恢复数据源

四、从节点有什么变化

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

五、快速恢复数据

  • 下面使用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
  • 2)去掉主从AOF文件中的flush相关内容:
  1. *1
  2. $8
  3. flushall
  • 3)重启Redis主节点服务器,恢复数据

六、总结

  • 本文通过flush误操作的数据恢复,重新梳理了持久化、复制的相关知识,这里建议运维人员提前准备shell脚本或者其他自动化的方式处理,因为故障不等人,对于flush这样的危险操作,应该通过有效的方式进行规避,下节将介绍具体的方法


标签:AOF,01,文件,RDB,Redis,flush,数据
From: https://blog.51cto.com/u_14934686/5813599

相关文章

  • Redis:10---List对象
    ​一、列表对象概述   列表类型是用来存储多个有序的字符串,一个列表最多可以存储多个元素。列表是一种比较灵活的数据结构,它可以充当栈和队列的角色,在实际开发上有......
  • vs2013配置python 安装第三方工具包
    这里以matplotlib安装为例。选择pip搜索camelcase进行安装。   ......
  • Redis:02---安装Redis(Linux+Windows+Docker)
    Linux安装:一、安装方式1(下载源码编译安装)第一步:从下面的网址中下载Redis最新稳定版本的源代码sudowgethttp://download.redis.io/redis-stable.tar.gz第二步:下载完之后解......
  • vs2013配置python_vs2013如何安装python
    vs2013如何安装python?步骤如下:1、安装PTVS:下载PTVS①找到下图位置,下载PythonToolsforVS2013地址:https://github.com/Microsoft/PTVS/releases/v2.2.2 ②安装RT......
  • 20221031&20221101 Keras
    周末长安杯加上组网实验信安数基上机计网翻转课堂核酸S12半决赛,小摆几天......
  • 代码随想录训练营第二十一天 | 530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数,236
     今天是第二十一天,还是二叉树,做了得有一周的二叉树了530.二叉搜索树的最小绝对差 classSolution{intres=Integer.MAX_VALUE;TreeNodepre=null;......
  • OpenResty+mysql+redis
    1、       ​​ad_load.lua​​  ​​nginx.conf​​1、读取mysql并缓存redis     ......
  • 2022-11-01
    棕榈:2D:下跌  2H:上涨  20F:上涨第一波 总结:2D下跌,2H上涨第二波,20F上涨第一波。做空等2F第二波结束等20F上涨第二波顶背驰 ......
  • P2569 [SCOI2010]股票交易
    通过一段时间的观察,预测到了未来n天内某只股票的走势,第i 天的股票买入价为每股a[i]​,第 ii 天的股票卖出价为每股b[i](a[i]>=b[i]),规定第 ii 天的一次买入至多只......
  • node4_01创建基本的web服务器
    //1.导入http模块consthttp=require("http")//2.创建web服务器实例constserver=http.createServer()//3.为服务器实例绑定request实例,监听客户端的请求server.......