文章目录

  • 1. RDB内存快照的局限性
  • 2. 给哪些内存数据做快照
  • 3. 快照时数据能修改吗
  • 4. 可以每秒做一次快照吗
  • 4. 数据快速恢复

Redis 一另一种种持久化方法:内存快照。所谓内存快照,
是把某一时刻的状态以文件的形式写到磁盘上,这样一来,即使宕机,快照文件也不会丢失,数据的可靠性也就得到了保证。这个快照文件就称为 RDB 文件,其中,RDB 就是 Redis DataBase 的缩写。

1. RDB内存快照的局限性

和 AOF 相比,RDB 记录的是某一时刻的数据,并不是操作,所以,在做数据恢复时,我们可以直接把 RDB 文件读入内存,很快地完成恢复。听起来好像很不错,但内存快照也并不是最优选项。为什么这么说呢?
我们还要考虑两个关键问题:

  • 对哪些数据做快照?这关系到快照的执行效率问题;
  • 做快照时,数据还能被增删改吗?这关系到 Redis 是否被阻塞,能否同时正常处理请求。

2. 给哪些内存数据做快照

  Redis 的数据都在内存中,为了提供所有数据的可靠性保证,它执行的是全量快照,也就是说,把内存中的所有数据都记录到磁盘中,这就类似于给 100 个人拍合影,把每一个人都拍进照片里。这样做的好处是,一次性记录了所有数据,一个都不少。
  RDB 文件的生成是否会阻塞主线程,这就关系到是否会降低 Redis 的性能。Redis 提供了两个命令来生成 RDB 文件,分别是 save 和 bgsave。

  • save:在主线程中执行,会导致阻塞;
  • bgsave:创建一个子进程,专门用于写入 RDB 文件,避免了主线程的阻塞,这也是Redis RDB 文件生成的默认配置。

3. 快照时数据能修改吗

  在给别人拍照时,一旦对方动了,那么这张照片就拍糊了,我们就需要重拍,所以我们当然希望对方保持不动。对于内存快照而言,我们也不希望数据“动”。
  如果快照执行期间数据不能被修改,是会有潜在问题的。对于刚刚的例子来说,在做快照的 20s 时间里,如果这 4GB 的数据都不能被修改,Redis 就不能处理对这些数据的写操作,那无疑就会给业务服务造成巨大的影响。
  你可能会想到,可以用 bgsave 避免阻塞啊。这里我就要说到一个常见的误区了,避免阻塞和正常处理写操作并不是一回事。此时,主线程的确没有阻塞,可以正常接收请求,但是,为了保证快照完整性,它只能处理读操作,因为不能修改正在执行快照的数据。
  为了快照而暂停写操作,肯定是不能接受的。所以这个时候,Redis 就会借助操作系统提供的写时复制技术(Copy-On-Write, COW),在执行快照的同时,正常处理写操作。
  简单来说,bgsave 子进程是由主线程 fork 生成的,可以共享主线程的所有内存数据。bgsave 子进程运行后,开始读取主线程的内存数据,并把它们写入 RDB 文件。此时,如果主线程对这些数据也都是读操作(例如图中的键值对 A),那么,主线程和bgsave 子进程相互不影响。但是,如果主线程要修改一块数据(例如图中的键值对 C),那么,这块数据就会被复制一份,生成该数据的副本。然后,bgsave 子进程会把这个副本数据写入 RDB 文件,而在这个过程中,主线程仍然可以直接修改原来的数据。

4. 可以每秒做一次快照吗

  对于快照来说,所谓“连拍”就是指连续地做快照。这样一来,快照的间隔时间变得很短,即使某一时刻发生宕机了,因为上一时刻快照刚执行,丢失的数据也不会太多。但是,这其中的快照间隔时间就很关键了。
  如下图所示,我们先在 T0 时刻做了一次快照,然后又在 T0+t 时刻做了一次快照,在这期间,数据块 5 和 9 被修改了。如果在 t 这段时间内,机器宕机了,那么,只能按照 T0 时刻的快照进行恢复。此时,数据块 5 和 9 的修改值因为没有快照记录,就无法恢复了。

  在第一次做完全量快照后,T1 和 T2 时刻如果再做快照,我们只需要将被修改的数据写入快照文件就行。但是,这么做的前提是,我们需要记住哪些数据被修改了。你可不要小瞧这个“记住”功能,它需要我们使用额外的元数据信息去记录哪些数据被修改了,这会带来额外的空间开销问题。
如下图所示:

4. 数据快速恢复

  一个混合使用 AOF 日志和内存快照的方法。简单来说,内存快照以一定的频率执行,在两次快照之间,使用 AOF 日志记录这期间的所有命令操作。这样一来,快照不用很频繁地执行,这就避免了频繁 fork 对主线程的影响。而且,AOF日志也只用记录两次快照间的操作,也就是说,不需要记录所有操作了,因此,就不会出现文件过大的情况了,也可以避免重写开销。如下图所示,T1 和 T2 时刻的修改,用 AOF 日志记录,等到第二次做全量快照时,就可以清空 AOF 日志,因为此时的修改都已经记录到快照中了,恢复时就不再用日志了。

关于 AOF 和 RDB 的选择问题,我想再给你提三点建议:

  • 数据不能丢失时,内存快照和 AOF 的混合使用是一个很好的选择;
  • 如果允许分钟级别的数据丢失,可以只使用 RDB;
  • 如果只用 AOF,优先使用 everysec 的配置选项,因为它在可靠性和性能之间取了一个平衡。

04 | 内存快照:宕机后, Redis 如何实现快速恢复相关推荐

  1. 头条二面:宕机后,Redis如何实现快速恢复?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | Kaito 来源 | kaito-kidd.c ...

  2. 纪实:嵌入式Elasticsearch服务因为gc无法释放内存,导致宕机事件

    场景描述 我们电商服务中使用了Elasticsearch嵌入式服务,然后再一次错误代码提交后,导致elasticsearch服务检索了大量数据使得内存无法释放,最后服务发生stop-the-world ...

  3. RabbitMQ宕机后,消息100%不会丢失吗

    V-xin:ruyuanhadeng获得600+页原创精品文章汇总PDF 这篇文章,给不太熟悉MQ技术的同学,介绍一个生产环境中可能会遇到的问题. 目前为止,你的RabbitMQ部署在线上服务器了,对 ...

  4. 慌得一逼,Kafka宕机后不再高可用?吓死宝宝了

    你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 来源:juejin.im/post/6874957625998606344 推荐 ...

  5. 如何设计不宕机的 Redis 高可用服务?

    随着业务的不断发展和扩张我们需要更加稳定和高效的 Redis 服务,这是业务发展的必然趋势也是个人能力进阶的最高境界,我们需要一个高可用的 Redis 服务,来支撑和保证业务的正常运行. 我们本文的面 ...

  6. MySQL MGR 宕机后如何开启复制

    MGR宕机后的重启,分两种情况 整个MGR集群宕机 1.首先将所有实例开启,例如 mysqld_safe --defaults-file=/etc/my.cnf1 --user=mysql & ...

  7. 宕机后,redis如何实现快速恢复?(RDB 内存快照)

    AOF 记录的是操作命令,而不是实际的数据,所以使用 AOF 方法进行故障恢复的时候,需要逐一把操作日志都执行一遍.如果操作日志非常多,redis 就会恢复得很缓慢,影响到正常使用.所以,redis ...

  8. 内存快照:宕机后,Redis如何实现快速恢复?

    上节课,我们学习了Redis避免数据丢失的AOF方法.这个方法的好处,是每次执行只需要记录操作命令,需要持久化的数据量不大.一般而言,只要你采用的不是always的持久化策略,就不会对性能造成太大影响 ...

  9. 05 _ 内存快照:宕机后,Redis如何实现快速恢复?

    用AOF方法进行故障恢复的时候,需要逐一把操作日志都执行一遍.如果操作日志非常多,Redis就会恢复得很缓慢,影响到正常使用.这当然不是理想的结果.那么,还有没有既可以保证可靠性,还能在宕机时实现快速 ...

最新文章

  1. Crunch Bang(linux)安装Webstorm上手
  2. H5应用缓存和浏览器缓存有什么区别
  3. 遍历一个类中的每一个属性、方法、公共字段
  4. BeanUtils.copyProperties与PropertyUtils.copyProperties用法及区别
  5. VIJOS【1234】口袋的天空
  6. jps命令:查看Java进程等详细信息
  7. Selenium Web 自动化 - 项目实战(三)
  8. Fast-SCNN:多分支结构共享低级特征的语义分割网络
  9. java quartz Scheduler 操作JobDetail
  10. (转)Centos7 Nginx安装
  11. Android:学习路线总结,绝对干货
  12. mariadb修改默认字符集
  13. j3455跑mysql_看烦了千篇一律的J3455?让黑群晖显示真实的CPU信息
  14. Android开发你不知道的TIPS
  15. Spring-boot JPA笔记 Failed to create query for method public abstract 踩坑记录~
  16. 内存错误分析工具----asan(AddressSanitizer)的介绍和使用
  17. 使用插件对温度植被干旱指数进行计算
  18. python怎么批量下载图片_python批量下载照片
  19. [汇编语言 IBM-PC]寻址方式配套习题
  20. 80×60长40米的地笼_住宅走廊宽1米2,长10米,不想打波线,用80公分的砖怎么铺平均60,还是80十40,上有...

热门文章

  1. 一步步学习微软InfoPath2010和SP2010--第十三章节--SharePoint视图和仪表板(4)--基于视图的通知...
  2. hadoop学习01 网址收集
  3. 快评《19家网站内容低俗被曝光》
  4. 计算机基础7试题,大学计算机应用基础试题
  5. android点击事件禁用,android-禁用所有视图的触摸事件
  6. Linux线程时间片如何修改,请教如何修改线程时间片
  7. Android适配华为手机,华为Mate 10将适配Android P 更流畅体验
  8. bmp转换tiff c++代码_Creative Convert for Mac(文件格式转换工具)
  9. php表单服务器验证失败,php 表单验证代码(验证失败显示提示信息)
  10. 【数据结构与算法】二叉树遍历