004.redis 的 RDB 和 AOF 两种持久化机制的优劣势对比

目录

  • RDB 持久化机制的优点
  • RDB 持久化机制的缺点
  • AOF 持久化机制的优点
  • AOF 持久化机制的缺点
  • RDB 和 AOF 到底该如何选择
  • 参考

RDB 持久化机制的优点

  1. 适合做冷备

    RDB 会生成多个数据文件,每个数据文件都代表了某一个时刻中 redis 的数据,这种多个数据文件的方式,非常适合做冷备,可以将这种完整的数据文件发送到一些远程的安全存储上去,如云上,以预定好的备份策略来定期备份 redis 中的数据

  2. 性能影响小

    能让 redis 对外提供的读写服务不受影响,因为 redis 主进程只需要 fork 一个子进程,让子进程执行磁盘 IO 操作来进行 RDB 持久化即可

  3. 数据恢复快

    相对于 AOF 持久化机制来说,直接基于 RDB 数据文件来重启和恢复 redis 进程,更加快速。

    因为 AOF,存放的指令日志,做数据恢复的时候,其实是要回放和执行所有的指令日志,来恢复出来内存中的所有数据的

    RDB 就是一份数据文件,恢复的时候,直接加载到内存中即可

RDB 做冷备的优点?

  • RDB 生成多个文件,每个文件都代表了某一个时刻的完整的数据快照
  • AOF 只有一个文件,但是你可以,每隔一定时间,去 copy 一份这个文件出来

那么 RDB 做冷备,优势在哪儿呢?由 redis 去控制固定时长生成快照文件的事情,比较方便; 而 AOF,还需要自己写一些脚本去做这个事情,且在最坏的情况下,提供数据恢复的时候,速度比 AOF 快,所以 RDB 特别适合做冷备份,冷备

RDB 持久化机制的缺点

  1. 在故障时,数据丢得多

    一般来说,RDB 数据快照文件,都是每隔 5 分钟,或者更长时间生成一次,一旦 redis 进程宕机,那么会丢失最近 5 分钟的数据(因为在内存中还未来得及导出到磁盘)

    这个问题也是 rdb 最大的缺点,就是不适合做第一优先的恢复方案,如果你依赖 RDB 做第一优先恢复方案,会导致数据丢失的比较多

  2. 性能影响?

    什么鬼?上面说优点的时候说是性能影响小,这里缺点又提到了?

    以下一段话根本理解不了,

    RDB 每次在 fork 子进程来执行 RDB 快照数据文件生成的时候,如果数据文件特别大,可能会导致对客户端提供的服务暂停数毫秒,或者甚至数秒。一般不要让 RDB 的间隔太长,否则每次生成的 RDB 文件太大了,对 redis 本身的性能可能会有影响的

AOF 持久化机制的优点

  1. 在故障时,数据丢得少

    一般 AOF 会每隔 1 秒,通过一个后台线程执行一次 fsync 操作,保证 os cache 中的数据写入磁盘中,最多丢失 1 秒钟的数据

  2. AOF 文件写入性能高

    AOF 日志文件以 append-only 模式写入,所以没有任何磁盘寻址的开销,写入性能非常高,而且文件不容易破损,即使文件尾部破损,也很容易修复(官方提供了一个修复工具)

  3. rewrite 操作对 redis 主线程影响较小

    AOF 日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写。因为在 rewrite log 的时候,会对其中的数据进行压缩,创建出一份需要恢复数据的最小日志出来。再创建新日志文件的时候,老的日志文件还是照常写入。当新的 merge 后的日志文件 ready 的时候,再交换新老日志文件即可。

    关于这里我实在是没有想到要怎么去做,因为写入的是指令,那么知道当前内存中的存的是哪些指定的数据呢?

  4. AOF 文件内容比较容易阅读

    这个特性非常适合做灾难性的误删除的紧急恢复。比如某人不小心用 flushall 命令清空了所有数据,只要这个时候后台 rewrite 还没有发生,那么就可以立即拷贝 AOF 文件,将最后一条 flushall 命令给删了,然后再将该 AOF 文件放回去,就可以通过恢复机制,自动恢复所有数据

AOF 持久化机制的缺点

  1. 日志文件稍大

    对于同一份数据来说,AOF 日志文件通常比 RDB 数据快照文件更大

  2. 性能稍低

    AOF 开启后,支持的写 QPS 会比 RDB 支持的写 QPS 低,因为 AOF 一般会配置成每秒 fsync 一次日志文件,当然,每秒一次 fsync,性能也还是很高的

  3. 发生过 BUG

    以前 AOF 发生过 bug,就是通过 AOF 记录的日志,进行数据恢复的时候,没有恢复一模一样的数据出来。所以说,类似 AOF 这种较为复杂的基于命令日志 /merge/ 回放的方式,比基于 RDB 每次持久化一份完整的数据快照文件的方式,更加脆弱一些,容易有 bug。不过 AOF 就是为了避免 rewrite 过程导致的 bug,因此每次 rewrite 并不是基于旧的指令日志进行 merge 的,而是基于当时内存中的数据进行指令的重新构建,这样健壮性会好很多。

    说 rewrite 非常复杂,因为是基于当时内存中已有数据进行构建指令达到压缩日志文件的目的,反正我是想不出来怎么实现的

  4. 数据恢复较慢

    前面都说了,不适合做冷备,数据恢复基于指令稍慢

RDB 和 AOF 到底该如何选择

  1. 不要仅仅使用 RDB,因为那样会导致你丢失很多数据
  2. 也不要仅仅使用 AOF,因为那样有两个问题

    第一,你通过 AOF 做冷备,没有 RDB 做冷备,来的恢复速度更快;

    第二,RDB 每次简单粗暴生成数据快照,更加健壮,可以避免 AOF 这种复杂的备份和恢复机制的 bug

  3. 综合使用 AOF 和 RDB 两种持久化机制

    用 AOF 来保证数据不丢失,作为数据恢复的第一选择;

    用 RDB 来做不同程度的冷备,在 AOF 文件都丢失或损坏不可用的时候,还可以使用 RDB 来进行快速的数据恢复

结论就是:都用,AOF 作为第一恢复方式,RDB 后补

参考

-中华石杉:亿级流量电商详情页系统实战(第二版):缓存架构+高可用服务架构+微服务架构
-Mrcode笔记本

原文地址:https://www.cnblogs.com/codecheng99/p/12382219.html

时间: 2024-08-02 14:43:55

004.redis 的 RDB 和 AOF 两种持久化机制的优劣势对比的相关文章

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

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

Redis系列之----Redis的两种持久化机制(RDB和AOF)

Redis的两种持久化机制(RDB和AOF) 什么是持久化 ???Redis的数据是存储在内存中的,内存中的数据随着服务器的重启或者宕机便会不复存在,在生产环境,服务器宕机更是屡见不鲜,所以,我们希望Redis能够将数据从内存中以某种形式保存到磁盘中,使得重启的时候可以加载磁盘中的文件记录恢复数据,这一过程便是Redis的持久化. ???Redis支持两种持久化机制,一种是RDB,另一种是AOF.Redis默认情况下使用RDB方式进行持久化.两种持久化可以单独使用其中的一种,也可以二者结合使用,

Redis RDB、 AOF 两种机制

二.RDB机制的优势和劣势: RDB存在哪些优势呢? 1). 一旦采用该方式,那么你的整个Redis数据库将只包含一个文件,这对于文件备份而言是非常完美的.比如,你可能打算每个小时归档一次最近24小时的数据,同时还要每天归档一次最近30天的数据.通过这样的备份策略,一旦系统出现灾难性故障,我们可以非常容易的进行恢复. 2). 对于灾难恢复而言,RDB是非常不错的选择.因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上. 3). 性能最大化.对于Redis的服务进程而言,在开始持久

redis的两种持久化机制

---恢复内容开始--- RDB:在指定的时间间隔对redis中的数据进行快照存储,默认开启 AOF:记录每次操作redis的命令,将命令写入到AOF文件中,当重启redis时会重新执行这些命令来恢复数据,默认关闭. RDB方式: Redis会根据redis.conf配置文件定期将数据快照至一个RDB文件中: save [seconds] [changes]:意为每seconds秒内如果数据有changes次修改,那么就进行一次rdb快照存储.可配置多条save指令,让redis执行多级的快照保

Redis的两种持久化操作RDB-AOF

Redis支持RDB和AOF两种持久化机制,持久化功能有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化文件即可实现数据恢复. RDB是什么 RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为**手动触发**和**自动触发**. 1.1.1 触发机制 手动触发分别对应save和bgsave命令: save命令:阻塞当前Redis服务器,知道RDB过程完成为止,对于内存比较大的实例会造成长时间阻塞,先上环境不建议使用.运行save命令对应Redis日志如

Redis两种持久化方式(RDB&AOF)

爬虫和转载请注明原文地址;博客园蜗牛:http://www.cnblogs.com/tdws/p/5754706.html Redis所需内存 超过可用内存怎么办 Redis修改数据多线程并发—Redis并发锁 windows下redis基础操作与主从复制 从而 数据备份和读写分离 Redis两种持久化方式(RDB&AOF) Redis的持久化过程中并不需要我们开发人员过多的参与,我们要做的是什么呢?除了深入了解RDB和AOF的作用原理,剩下的就是根据实际情况来制定合适的策略了,再复杂一点,也就

redis的 rdb 和 aof 持久化的区别 [转]

aof,rdb是两种 redis持久化的机制.用于crash后,redis的恢复. rdb的特性如下: Code: fork一个进程,遍历hash table,利用copy on write,把整个db dump保存下来.save, shutdown, slave 命令会触发这个操作.粒度比较大,如果save, shutdown, slave 之前crash了,则中间的操作没办法恢复. aof有如下特性: Code: 把写操作指令,持续的写到一个类似日志文件里.(类似于从postgresql等数

(三)Redis两种持久化方案

Redis的持久化策略:2种 RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘.RDB是Redis默认采用的持久化方式. ---------aof:把所有的对redis的服务器进行修改的命令都存到一个文件里,命令的集合 rdb: 默认情况下,是快照rdb的持久化方式,将内存中的数据以快照的方式写入二进制文件中,默认的文件名是dump.rdb redis.conf配置: save 900 1 save 300 10

Redis的RDB和AOF

1.数据快照RDB 1.1原理 (1)RDB是将某一时刻的数据持久化到磁盘中,是一种快照的方式. (2)redis在进行数据持久化的过程中,会先将数据写入到一个临时文件中,待持久化过程都结束了,才会用这个临时文件替换上次持久化好的文件.正是这种特性,让我们可以随时来进行备份,及时redis处于运行状态: (3)对于RDB方式,redis会单独创建(fork)一个子进程来进行持久化,而主进程是不会进行任何IO操作的,这样就确保了redis极高的性能. (4)如果需要进行大规模数据的恢复,且对于数据