redis++:Redis持久化 rdb & aof 工作原理及流程图 (三)

RDB的原理:

在Redis中RDB持久化的触发分为两种:自己手动触发与Redis定时触发。

针对RDB方式的持久化,手动触发可以使用:

  1):save:会阻塞当前Redis服务器,直到持久化完成,线上应该禁止使用。

  2):bgsave:该触发方式会fork一个子进程,由子进程负责持久化过程,因此阻塞只会发生在fork子进程的时候。

而自动触发的场景主要是有以下几点:

  1):根据我们的 save m n 配置规则自动触发;

  2):从节点全量复制时,主节点发送rdb文件给从节点完成复制操作,主节点会触发 bgsave

  3):执行 debug reload 时;

  4):执行 shutdown时,如果没有开启aof,也会触发。

由于 save 基本不会被使用到,我们重点看看 bgsave 这个命令是如何完成RDB的持久化的。流程图如下

1、Redis父进程首先判断:当前是否在执行save,或bgsave/bgrewriteaof(aof文件重写命令)的子进程,如果在执行则bgsave命令直接返回。

bgsave/bgrewriteaof 的子进程不能同时执行,主要是基于性能方面的考虑:两个并发的子进程同时执行大量的磁盘写操作,可能引起严重的性能问题。

2、父进程执行fork操作创建子进程,这个过程中父进程是阻塞的,Redis不能执行来自客户端的任何命令;

3、父进程fork后,bgsave命令返回”Background saving started”信息并不再阻塞父进程,并可以响应其他命令;

4、子进程创建RDB文件,根据父进程内存快照生成临时快照文件,完成后对原有文件进行原子替换;

5、子进程发送信号给父进程表示完成,父进程更新统计信息。

AOF的原理:

  AOF的整个流程大体来看可以分为两步,一步是命令的实时写入(如果是 appendfsync everysec 配置,会有1s损耗),第二步是对aof文件的重写。

  对于增量追加到文件这一步主要的流程是:命令写入=》追加到aof_buf =》同步到aof磁盘。

  那么这里为什么要先写入buf在同步到磁盘呢?如果实时写入磁盘会带来非常高的磁盘IO,影响整体性能。

  aof重写是为了减少aof文件的大小,可以手动或者自动触发,关于自动触发的规则请看上面配置部分。

  fork的操作也是发生在重写这一步,也是这里会对主进程产生阻塞。

  手动触发: bgrewriteaof,自动触发 就是根据配置规则来触发,当然自动触发的整体时间还跟Redis的定时任务频率有关系。

流程图如下:

对于上图有四个关键点补充一下:

1、在重写期间,由于主进程依然在响应命令,为了保证最终备份的完整性;因此它依然会写入旧的AOF file中,如果重写失败,能够保证数据不丢失。

2、为了把重写期间响应的写入信息也写入到新的文件中,因此也会为子进程保留一个buf,防止新写的file丢失数据。

3、重写是直接把当前内存的数据生成对应命令,并不需要读取老的AOF文件进行分析、命令合并。

4、AOF文件直接采用的文本协议,主要是兼容性好、追加方便、可读性高可认为修改修复。

无论是 RDB 还是 AOF 都是先写入一个临时文件,然后通过 rename 完成文件的替换工作。

持久化中恢复数据:

  数据的备份、持久化做完了,我们如何从这些持久化文件中恢复数据呢?如果一台服务器上有既有RDB文件,又有AOF文件,该加载谁呢?

  其实想要从这些文件中恢复数据,只需要重新启动Redis即可。

恢复数据流程图:

启动时会先检查AOF文件是否存在,如果不存在就尝试加载RDB。

那么为什么会优先加载AOF呢?因为AOF保存的数据更完整,通过上面的分析我们知道AOF基本上最多损失1s的数据。

性能与实践:

通过上面的分析,我们都知道RDB的快照、AOF的重写都需要fork,这是一个重量级操作,会对Redis造成阻塞。因此为了不影响Redis主进程响应,我们需要尽可能降低阻塞。

1、降低fork的频率,比如可以手动来触发RDB生成快照、与AOF重写;

2、控制Redis最大使用内存,防止fork耗时过长;

3、使用更牛逼的硬件;

4、合理配置Linux的内存分配策略,避免因为物理内存不足导致fork失败。

在线上我们到底该怎么做?我提供一些自己的实践经验。

1、如果Redis中的数据并不是特别敏感或者可以通过其它方式重写生成数据,可以关闭持久化,如果丢失数据可以通过其它途径补回;

2、自己制定策略定期检查Redis的情况,然后可以手动触发备份、重写数据;

3、单机如果部署多个实例,要防止多个机器同时运行持久化、重写操作,防止出现内存、CPU、IO资源竞争,让持久化变为串行;

4、可以加入主从机器,利用一台从机器进行备份处理,其它机器正常响应客户端的命令;

5、RDB持久化与AOF持久化可以同时存在,配合使用。

本文的内容主要是运维上的一些注意点,但我们开发者了解到这些知识,在某些时候有助于我们发现诡异的bug。

原文地址:https://www.cnblogs.com/codingmode/p/12633856.html

时间: 2024-10-13 16:36:46

redis++:Redis持久化 rdb & aof 工作原理及流程图 (三)的相关文章

Redis的持久化--RDB的工作原理及引发的问题

Redis持久化RDB模式的工作原理: Redis持久化RDB模式,Redis借助了fork命令的copy on write机制.在生成快照时,将当前进程整个复制出来,fork出一个子进程,然后在子进程中循环所有的数据,将数据写成为RDB文件. Redis持久化RDB模式引发的问题: RDB模式需要Redis服务所占内存的1倍的内存 例如一台机器总共16G内存,用了10G内存做Redis服务,假如这10G内存都占满了 这时运行save命令,这时会把10G的进程再复制一遍,变成20G,超过了16G

Redis数据持久化机制AOF原理分析二

Redis数据持久化机制AOF原理分析二 分类: Redis 2014-01-12 15:36  737人阅读  评论(0)  收藏  举报 redis AOF rewrite 目录(?)[+] 本文所引用的源码全部来自Redis2.8.2版本. Redis AOF数据持久化机制的实现相关代码是redis.c, redis.h, aof.c, bio.c, rio.c, config.c 在阅读本文之前请先阅读Redis数据持久化机制AOF原理分析之配置详解文章,了解AOF相关参数的解析,文章链

7.redis 集群模式的工作原理能说一下么?在集群模式下,redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗?

作者:中华石杉 面试题 redis 集群模式的工作原理能说一下么?在集群模式下,redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗? 面试官心理分析 在前几年,redis 如果要搞几个节点,每个节点存储一部分的数据,得借助一些中间件来实现,比如说有 codis,或者 twemproxy,都有.有一些 redis 中间件,你读写 redis 中间件,redis 中间件负责将你的数据分布式存储在多台机器上的 redis 实例中. 这两年,redis 不断在发展

003.图解分析 redis 的 RDB 和 AOF 两种持久化机制的工作原理

目录 RDB AOF 小结 参考 我们已经知道对于一个企业级的 redis 架构来说,持久化是不可减少的 tip 牢记企业级 redis 集群架构是用来支撑海量数据.高并发.高可用 持久化主要是做灾难恢复.数据恢复,也可以归类到高可用的一个环节里面去 比如你 redis 整个挂了,redis 就不可用了,你要做的事情是让 redis 变得可用,尽快变得可用你会怎么做? 你会重启 redis,尽快让它对外提供服务,但是就像上一讲说,如果你没做数据备份,这个时候 redis 就算启动了,也不可用,数

Redis的持久化--RDB

Redis提供了RDB持久化机制,即在指定的时间间隔内将内存中的数据集快照写入到磁盘中. RDB的优点: 1.这种方式,备份Redis数据库只有一个文件,一旦系统出现灾难性故障,可以非常容易进行恢复. 2.可以轻松的将一个压缩的备份文件转移到其他安全的存储介质上. 3.性能最大化,开始持久化时,只需fork出一个子进程,之后由子进程完成这些持久化的工作,可以极大的避免服务进程执行IO操作. 4.数据集很大时,启动效率高. RDB的缺点: 1.可以造成数据的丢失,因为系统一旦在定时持久化之前出现宕

Redis的持久化RDB

dbfilename redis.db  //持久化的文件dir /home/redis/6379    //文件所在目录save 900 1    // 900秒 修改一个key就保存一次save 300 10    // 300秒 修改10个key就保存一次save 60 10000    // 60秒 修改10000 个key就保存一次//上述3个save条件应该从下往上看,每个条件都是或的关系rdbcompression yes        //启用压缩rdbchecksum yes 

第十章 Redis持久化--RDB+AOF

注:本文主要参考自<Redis设计与实现> 1.Redis两种持久化方式 RDB 执行机制:快照,直接将databases中的key-value的二进制形式存储在了rdb文件中 优点:性能较高(因为是快照,且执行频率比aof低,而且rdb文件中直接存储的是key-values的二进制形式,对于恢复数据也快) 缺点:在save配置条件之间若发生宕机,此间的数据会丢失 AOF 执行机制:将对数据的每一条修改命令追加到aof文件 优点:数据不容易丢失 缺点:性能较低(每一条修改操作都要追加到aof文

(05)redis的持久化RDB和AOF的配置及比较

redis操作的数据是在内存中的,它支持两种方案将内存中的数据持久化到硬盘中,下面分别介绍. 1.RDB方式(默认方式) RDB持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘.打开redis.conf,如图: save 900 1:表示15分钟(900秒钟)内至少1个键被更改则进行快照. save 300 10:表示5分钟(300秒)内至少10个键被更改则进行快照. save 60 10000:表示1分钟(60秒)内至少1

redis的持久化 rdb和aof

1.rdb 当满足条件时,redis单独会fork(创建)一个新的线程,会先将内存中的数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次已经持久化好了的文件,整个过程中,主进程是不进行任何IO操作的,确保了极高的性能,此时的主进程还可以进行读写操作.rdb数据持久化的缺点是最后一次持久化的数据可能丢失,当在最后一次持久化的时间截点内还没有持久化,此时机器宕机了或出故障了,那么最后一次的数据就没有持久化到. Fork:fork的作用是复制一个与当前进程一样的进程,新进程的所有