博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis 混合式持久化流程分析
阅读量:2493 次
发布时间:2019-05-11

本文共 2252 字,大约阅读时间需要 7 分钟。

前面的文章中分别介绍过了 和 两种持久化策略,这次要介绍一种新的方式—混合模式。

为什么会有混合模式?

我们知道RDB方式虽然恢复快,但是数据丢失多,而AOF相比RDB数据丢失方面几乎不存在什么问题,但是恢复时间长,体积大,重写期间还会发生阻塞问题,所以综合来看两者无论你使用哪一种都会出现一些较为麻烦的问题,所以Redis4.0开始就提出了混合模式,它结合了AOF和RDB各自的优点来解决持久化问题。

如何开启混合模式?

# When rewriting the AOF file, Redis is able to use an RDB preamble in the# AOF file for faster rewrites and recoveries. When this option is turned# on the rewritten AOF file is composed of two different stanzas:##   [RDB file][AOF tail]## When loading Redis recognizes that the AOF file starts with the "REDIS"# string and loads the prefixed RDB file, and continues loading the AOF# tail.aof-use-rdb-preamble no

aof-use-rdb-preamble:配置为yes,即表示开启混合模式。

混合模式触发方式

上面的注释中已经有了介绍,混合模式的触发条件是当调用了AOF重写时执行的,也就是调用了bgrewriteaof命令。

混合模式执行流程

1、启动服务端

在这里插入图片描述

2、客户端连接,并写入两条数据

在这里插入图片描述

3、查看aof文件

在这里插入图片描述

4、客户端执行bgrewriteaof命令,然后再次写入一条数据

在这里插入图片描述

5、查看服务端后台输出

在这里插入图片描述

1783:M 03 Nov 2020 21:27:10.109 * Background append only file rewriting started by pid 17961783:M 03 Nov 2020 21:27:10.150 * AOF rewrite child asks to stop sending diffs.1796:C 03 Nov 2020 21:27:10.150 * Parent agreed to stop sending diffs. Finalizing AOF...1796:C 03 Nov 2020 21:27:10.150 * Concatenating 0.00 MB of AOF diff received from parent.1796:C 03 Nov 2020 21:27:10.150 * SYNC append only file rewrite performed1796:C 03 Nov 2020 21:27:10.150 * AOF rewrite: 6 MB of memory used by copy-on-write1783:M 03 Nov 2020 21:27:10.250 * Background AOF rewrite terminated with success1783:M 03 Nov 2020 21:27:10.250 * Residual parent diff successfully flushed to the rewritten AOF (0.00 MB)1783:M 03 Nov 2020 21:27:10.250 * Background AOF rewrite finished successfully

6、再看aof文件

在这里插入图片描述

整个流程下来,可以看出当开启混合模式时,重写后的aof文件顶部多了一些乱码部分,而这实际上就是原本RDB文件的内容。

基本流程:

  • 首先依旧先fork一个子进程,把当前内存数据生成二进制格式写入aof文件中。
  • 服务端收到的客户端请求依旧写入到重写缓冲区中。
  • 子进程完成rdb写后同样通知父进程,此时父进程开始阻塞,并开始把重写缓冲区中的数据追加到aof文件中。
  • 最后完成新旧aof文件的替换,并继续处理客户端请求。

混合模式加载流程

根据约定的规则,当服务器重新启动加载aof文件时,如果发现文件是以“Redis”字符串开头的,则先按照RDB格式的数据进行加载,再加载后面的AOF格式中的数据。

服务器重启后,输出内容。

在这里插入图片描述

1824:M 03 Nov 2020 21:41:35.340 * Reading RDB preamble from AOF file...1824:M 03 Nov 2020 21:41:35.340 * Reading the remaining AOF tail...1824:M 03 Nov 2020 21:41:35.340 * DB loaded from append only file: 0.000 seconds1824:M 03 Nov 2020 21:41:35.340 * Ready to accept connections

优缺点

优点

  • 结合了RDB和AOF两种方式的优点,能在较短的时间内基本恢复全量的数据。

缺点

  • 同样存在可读性差、重写阻塞的问题。

转载地址:http://holrb.baihongyu.com/

你可能感兴趣的文章
都江堰很美-佩服古人_Crmhf的一天
查看>>
Linux系统资源查询命令(cpu、io、mem)
查看>>
(转)PowerHA完全手册(一,二,三)
查看>>
hdu 4391 Paint The Wall 线段树 +优化 2012 Multi-University Training Contest 10 )
查看>>
socket与socketServer通信
查看>>
Android_Layout (一)
查看>>
《过早退出是一切失败的根源》读后感
查看>>
luogu P1774 最接近神的人_NOI导刊2010提高(02)
查看>>
Dynamic Proxy
查看>>
Yii2的一些问题
查看>>
LeetCode OJ - Populating Next Right Pointers in Each Node II
查看>>
C++ wifstream读取日文方法(中文适用)
查看>>
B-树
查看>>
php计算上个月是几月份
查看>>
浅谈 trie树 及其实现
查看>>
60款很酷的 jQuery 幻灯片演示和下载
查看>>
nyoj-20-吝啬的国度(深搜)
查看>>
【NOI 2018】归程(Kruskal重构树)
查看>>
Magento--判断checkout中是否使用了coupon code
查看>>
带参数的方法
查看>>