精华内容
下载资源
问答
  • 持久化之RDB 定义:在指定的时间间隔内生成数据集的时间点快照 RDB 的优点: 1.RDB 是一个非常紧凑的文件 它保存了 Redis 在某个时间点上的数据集。 这种文件非常适合用于进行备份: 比如说,你可以在最近的 24 小时...

    持久化之RDB

    定义:在指定的时间间隔内生成数据集的时间点快照

    RDB 的优点:

    1.RDB 是一个非常紧凑的文件

    它保存了 Redis 在某个时间点上的数据集。 这种文件非常适合用于进行备份: 比如说,你可以在最近的 24 小时内,每小时备份一次 RDB 文件,并且在每个月的每一天,也备份一个 RDB 文件。 这样的话,即使遇上问题,也可以随时将数据集还原到不同的版本。

    2.RDB 非常适用于灾难恢复

    它只有一个文件,并且内容都非常紧凑,可以(在加密后)将它传送到别的数据中心,或者亚马逊 S3 中。

    3.RDB 可以最大化 Redis 的性能

    父进程在保存 RDB 文件时唯一要做的就是 fork 出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘 I/O 操作。

    4.RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。

    RDB 的缺点

    如果你需要尽量避免在服务器故障时丢失数据,那么 RDB 不适合你。 虽然 Redis 允许你设置不同的保存点来控制保存 RDB 文件的频率, 但是, 因为RDB 文件需要保存整个数据集的状态, 所以它并不是一个轻松的操作。 因此你可能会至少 5 分钟才保存一次 RDB 文件。 在这种情况下, 一旦发生故障停机, 你就可能会丢失好几分钟的数据。

    每次保存 RDB 的时候,Redis 都要 fork() 出一个子进程,并由子进程来进行实际的持久化工作。 在数据集比较庞大时, fork() 可能会非常耗时,造成服务器在某某毫秒内停止处理客户端; 如果数据集非常巨大,并且 CPU 时间非常紧张的话,那么这种停止时间甚至可能会长达整整一秒。 虽然 AOF 重写也需要进行 fork() ,但无论 AOF 重写的执行间隔有多长,数据的耐久性都不会有任何损失。

    AOF 的优点

    使用 AOF 持久化会让 Redis 变得非常耐久:你可以设置不同的 fsync 策略,比如无 fsync ,每秒钟一次 fsync ,或者每次执行写入命令时 fsync 。 AOF 的默认策略为每秒钟 fsync 一次,在这种配置下,Redis 仍然可以保持良好的性能,并且就算发生故障停机,也最多只会丢失一秒钟的数据( fsync 会在后台线程执行,所以主线程可以继续努力地处理命令请求)。

    AOF 文件是一个只进行追加操作的日志文件, 因此对 AOF 文件的写入不需要进行 seek , 即使日志因为某些原因而包含了未写入完整的命令(比如写入时磁盘已满,写入中途停机,等等), redis-check-aof 工具也可以轻易地修复这种问题。

    Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写: 重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合。 整个重写操作是绝对安全的,因为 Redis 在创建新 AOF 文件的过程中,会继续将命令追加到现有的 AOF 文件里面,即使重写过程中发生停机,现有的 AOF 文件也不会丢失。 而一旦新 AOF 文件创建完毕,Redis 就会从旧 AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操作。

    AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析也很轻松。 导出 AOF 文件也非常简单: 举个例子, 如果你不小心执行了 FLUSHALL 命令, 但只要 AOF 文件未被重写, 那么只要停止服务器, 移除 AOF 文件末尾的 FLUSHALL 命令, 并重启 Redis , 就可以将数据集恢复到 FLUSHALL 执行之前的状态。

    AOF 的缺点

    对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积。

    根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB 。 在一般情况下, 每秒 fsync 的性能依然非常高, 而关闭 fsync 可以让 AOF 的速度和 RDB 一样快, 即使在高负荷之下也是如此。 不过在处理巨大的写入载入时,RDB 可以提供更有保证的最大延迟时间。

    AOF 在过去曾经发生过这样的 bug : 因为个别命令的原因,导致 AOF 文件在重新载入时,无法将数据集恢复成保存时的原样。 (举个例子,阻塞命令 BRPOPLPUSH 就曾经引起过这样的 bug 。) 测试套件里为这种情况添加了测试: 它们会自动生成随机的、复杂的数据集, 并通过重新载入这些数据来确保一切正常。 虽然这种 bug 在 AOF 文件中并不常见, 但是对比来说, RDB 几乎是不可能出现这种 bug 的。

    总结:rdb和aof的优缺点

    RDB的优点

    1.体积更小:相同的数据量rdb数据比aof的小,因为rdb是紧凑型文件

    2.恢复更快:因为rdb是数据的快照,基本上就是数据的复制,不用重新读取再写入内存

    3.性能更高:父进程在保存rdb时候只需要fork一个子进程,无需父进程的进行其他io操作,也保证了服务器的性能。

    RDB的缺点

    1.故障丢失:因为rdb是全量的,我们一般是使用shell脚本实现30分钟或者1小时或者每天对redis进行rdb备份,但是最少也要5分钟进行一次的备份,所以当服务死掉后,最少也要丢失5分钟的数据。

    2.耐久性差:相对aof的异步策略来说,因为rdb的复制是全量的,即使是fork的子进程来进行备份,当数据量很大的时候对磁盘的消耗也是不可忽视的,尤其在访问量很高的时候,fork的时间也会延长,导致cpu吃紧,耐久性相对较差。

    aof的优点

    1.数据保证:我们可以设置fsync策略,一般默认是everysec,也可以设置每次写入追加,所以即使服务死掉了,咱们也最多丢失一秒数据

    2.自动缩小:当aof文件大小到达一定程度的时候,后台会自动的去执行aof重写,此过程不会影响主进程,重写完成后,新的写入将会写到新的aof中,旧的就会被删除掉。但是此条如果拿出来对比rdb的话还是没有必要算成优点,只是官网显示成优点而已。

    aof的缺点

    1.性能相对较差:它的操作模式决定了它会对redis的性能有所损耗

    2.体积相对更大:尽管是将aof文件重写了,但是毕竟是操作过程和操作结果仍然有很大的差别,体积也毋庸置疑的更大。

    3.恢复速度更慢

    最后的总结

    redis有两种持久化方式,aof和rdb,aof相当于日志记录操作命令,rdb相当于数据的快照。安全性来讲由于aof的记录能够精确到秒级追加甚至逐条追加,而rdb只能是全量复制,aof明显高于rdb。但是从性能来讲rdb就略胜一筹,rdb是redis性能最大化的体现,它不用每秒监控是否有数据写入,当达到触发条件后就自动fork一个子进程进行全量更新,速度也很快。容灾回复方面rdb更是能够快速的恢复数据,而aof需要读取再写入,相对慢了很多。

    展开全文
  • 1、redis提供了两种持久化的方式,分别是RDB(RedisDataBase)和AOF(AppendOnlyFile)。 2、RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上; 3、AOF,则是换了一个角度...

    关于Redis说点什么,目前都是使用Redis作为数据缓存,缓存的目标主要是那些需要经常访问的数据,或计算复杂而耗时的数据。缓存的效果就是减少了数据库读的次数,减少了复杂数据的计算次数,从而提高了服务器的性能。

    一、redis持久化----两种方式

    1、redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)。

    2、RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上;

    3、AOF,则是换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。

    4、其实RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。

    5、如果你没有数据持久化的需求,也完全可以关闭RDB和AOF方式,这样的话,redis将变成一个纯内存数据库,就像memcache一样。

    二、redis持久化----RDB

    1、RDB方式,是将redis某一时刻的数据持久化到磁盘中,是一种快照式的持久化方法。

    2、redis在进行数据持久化的过程中,会先将数据写入到一个临时文件中,待持久化过程都结束了,才会用这个临时文件替换上次持久化好的文件。正是这种特性,让我们可以随时来进行备份,因为快照文件总是完整可用的。

    3、对于RDB方式,redis会单独创建(fork)一个子进程来进行持久化,而主进程是不会进行任何IO操作的,这样就确保了redis极高的性能。

    4、如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。

    5、虽然RDB有不少优点,但它的缺点也是不容忽视的。如果你对数据的完整性非常敏感,那么RDB方式就不太适合你,因为即使你每5分钟都持久化一次,当redis故障时,仍然会有近5分钟的数据丢失。所以,redis还提供了另一种持久化方式,那就是AOF。

    三、redis持久化----AOF

    1、AOF,英文是Append Only File,即只允许追加不允许改写的文件。

    2、如前面介绍的,AOF方式是将执行过的写指令记录下来,在数据恢复时按照从前到后的顺序再将指令都执行一遍,就这么简单。

    3、我们通过配置redis.conf中的appendonly yes就可以打开AOF功能。如果有写操作(如SET等),redis就会被追加到AOF文件的末尾。

    4、默认的AOF持久化策略是每秒钟fsync一次(fsync是指把缓存中的写指令记录到磁盘中),因为在这种情况下,redis仍然可以保持很好的处理性能,即使redis故障,也只会丢失最近1秒钟的数据。

    5如果在追加日志时,恰好遇到磁盘空间满、inode满或断电等情况导致日志写入不完整,也没有关系,redis提供了redis-check-aof工具,可以用来进行日志修复。

    6、因为采用了追加方式,如果不做任何处理的话,AOF文件会变得越来越大,为此,redis提供了AOF文件重写(rewrite)机制,即当AOF文件的大小超过所设定的阈值时,redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。举个例子或许更形象,假如我们调用了100次INCR指令,在AOF文件中就要存储100条指令,但这明显是很低效的,完全可以把这100条指令合并成一条SET指令,这就是重写机制的原理。

    7、在进行AOF重写时,仍然是采用先写临时文件,全部完成后再替换的流程,所以断电、磁盘满等问题都不会影响AOF文件的可用性,这点大家可以放心。

    8、AOF方式的另一个好处,我们通过一个“场景再现”来说明。某同学在操作redis时,不小心执行了FLUSHALL,导致redis内存中的数据全部被清空了,这是很悲剧的事情。不过这也不是世界末日,只要redis配置了AOF持久化方式,且AOF文件还没有被重写(rewrite),我们就可以用最快的速度暂停redis并编辑AOF文件,将最后一行的FLUSHALL命令删除,然后重启redis,就可以恢复redis的所有数据到FLUSHALL之前的状态了。是不是很神奇,这就是AOF持久化方式的好处之一。但是如果AOF文件已经被重写了,那就无法通过这种方法来恢复数据了。

    9、虽然优点多多,但AOF方式也同样存在缺陷,比如在同样数据规模的情况下,AOF文件要比RDB文件的体积大。而且,AOF方式的恢复速度也要慢于RDB方式。

    如果你直接执行BGREWRITEAOF命令,那么redis会生成一个全新的AOF文件,其中便包括了可以恢复现有数据的最少的命令集。

    10、如果运气比较差,AOF文件出现了被写坏的情况,也不必过分担忧,redis并不会贸然加载这个有问题的AOF文件,而是报错退出。这时可以通过以下步骤来修复出错的文件:

    1.备份被写坏的AOF文件
    2.运行 redis-check-aof –fix 进行修复
    3.用 diff -u 来看下两个文件的差异,确认问题点
    4.重启redis,加载修复后的AOF文件

    四、redis持久化----AOF重写

    1、AOF重写的内部运行原理,我们有必要了解一下。

    2、在重写即将开始之际,redis会创建(fork)一个“重写子进程”,这个子进程会首先读取现有的AOF文件,并将其包含的指令进行分析压缩并写入到一个临时文件中。

    3、与此同时,主工作进程会将新接收到的写指令一边累积到内存缓冲区中,一边继续写入到原有的AOF文件中,这样做是保证原有的AOF文件的可用性,避免在重写过程中出现意外。

    4、当“重写子进程”完成重写工作后,它会给父进程发一个信号,父进程收到信号后就会将内存中缓存的写指令追加到新AOF文件中。

    5、当追加结束后,redis就会用新AOF文件来代替旧AOF文件,之后再有新的写指令,就都会追加到新的AOF文件中了。

    五、redis持久化----如何选择RDB和AOF

    1、对于我们应该选择RDB还是AOF,官方的建议是两个同时使用。这样可以提供更可靠的持久化方案。

    2、redis的备份和还原,可以借助第三方的工具redis-dump。

    六、Redis的两种持久化方式也有明显的缺点

    1、RDB需要定时持久化,风险是可能会丢两次持久之间的数据,量可能很大。

    2、AOF每秒fsync一次指令硬盘,如果硬盘IO慢,会阻塞父进程;风险是会丢失1秒多的数据;在Rewrite过程中,主进程把指令存到mem-buffer中,最后写盘时会阻塞主进程。

    3、这两个缺点是个很大的痛点。为了解决这些痛点,GitHub的两位工程师 Bryana Knight 和 Miguel Fernández 日前写了一篇 文章 ,讲述了将持久数据从Redis迁出的经验:http://www.open-open.com/lib/view/open1487736984424.html

    展开全文
  • redis持久化分为RDBAOF,简单介绍下二者的区别和优缺点 RDB持久化机制: 对redis中的数据进行周期性的持久化。 AOF机制: 对每条写入命令作为日志,以append-only的模式写入一个日志文件中,在redis重启的时候,...

    redis持久化分为RDB,AOF,简单介绍下二者的区别和优缺点
    RDB持久化机制
    对redis中的数据进行周期性的持久化。
    AOF机制:
    对每条写入命令作为日志,以append-only的模式写入一个日志文件中,在redis重启的时候,可以通过回放AOF日志中的写入指令来重新构建整个数据集。
    RDB优势:
    ● 备份策略方便:一旦采用该方式,那么你的整个Redis数据库将只包含一个文件,这对于文件备份而言是非常完美的。比如,你可能打算每个小时归档一次最近24小时的数据,同时还要每天归档一次最近30天的数据。通过这样的备份策略,一旦系统出现灾难性故障,我们可以非常容易的进行恢复。
    ● 灾难恢复方便:,RDB是非常不错的选择。因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上。
    ● 性能最大化:对于Redis的服务进程而言,在开始持久化时,它唯一需要做的只是fork出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行IO操作了。
    ● 启动效率高:相比于AOF机制,如果数据集很大,RDB的启动效率会更高。
    RDB缺点:
    ● 数据的可靠性不高,没办法做到实时持久化:如果你想保证数据的高可用性,即最大限度的避免数据丢失,那么RDB将不是一个很好的选择。因为系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。
    ● 影响性能:由于RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。
    ● 版本兼容RDB格式问题
    AOF的优点:
    ● 数据安全性:该机制可以带来更高的数据安全性,即数据持久性。Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步。事实上,每秒同步也是异步完成的,其效率也是非常高的,所差的是一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失。而每修改同步,我们可以将其视为同步持久化,即每次发生的数据变化都会被立即记录到磁盘中。可以预见,这种方式在效率上是最低的。
    ● 数据一致性:由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。然而如果我们本次操作只是写入了一半数据就出现了系统崩溃问题,不用担心,在Redis下一次启动之前,我们可以通过redis-check-aof工具来帮助我们解决数据一致性的问题。
    如果日志过大,Redis可以自动启用rewrite机制。即Redis以append模式不断的将修改数据写入到老的磁盘文件中,同时Redis还会创建一个新的文件用于记录此期间有哪些修改命令被执行。因此在进行rewrite切换时可以更好的保证数据安全性。
    AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,我们也可以通过该文件完成数据的重建。
    AOF的缺点:
    ● 恢复速度慢:对于相同数量的数据集而言,AOF文件通常要大于RDB文件。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
    ● 性能低:根据同步策略的不同,AOF在运行效率上往往会慢于RDB。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和RDB一样高效。
    二者选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),还是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再做备份(rdb)。

    展开全文
  • 背景 ...Redis中为了保证在系统宕机(类似进程被杀死)情况下,能更快的进行故障恢复,设计了两种数据持久化方案,分别为rdb和aof方式。 1.Rdb方式持久化 概述 Rdb方式是通过手动(save-阻塞式,bgsave-异

    背景

    Redis是一种内存数据库,在断电时数据可能会丢失。比如你redis整个挂了,然后redis不可用了,如果没有持久化的话,redis就会丢失所有的数据,如果通过持久化将数据搞一份儿到磁盘上去,然后再定期同步到一些云存储服务上去,那么就可以保证一些数据不丢失,保证数据的可靠性。

    持久化方式

    Redis中为了保证在系统宕机(类似进程被杀死)情况下,能更快的进行故障恢复,设计了两种数据持久化方案,分别为rdb和aof方式。

    1.Rdb方式持久化

    概述

    Rdb方式是通过手动(save-阻塞式,bgsave-异步)或周期性方式保存redis中key/value的一种机制,Rdb方式一般为redis的默认数据持久化方式.系统启动时会自动开启这种方式的持久化机制。

    RDB方式配置

    RDB方式的持久化是默认开启的,也可按规则自己配置,例如,打开redis.conf文件,例如

    # 这里表示每隔60s,如果有超过1000个key发生了变更,那么就生成一个新的dump.rdb文件,就是当前redis内存中完整的数据快照,这个操作也被称之为snapshotting(快照)。
    
    save 60 1000
    
    # 持久化 rdb文件遇到问题时,主进程是否接受写入,yes 表示停止写入,如果是no 表示redis继续提供服务。
    stop-writes-on-bgsave-error yes
        
    # 在进行快照镜像时,是否进行压缩。yes:压缩,但是需要一些cpu的消耗。no:不压缩,需要更多的磁盘空间。
    rdbcompression yes
    # 一个CRC64的校验就被放在了文件末尾,当存储或者加载rbd文件的时候会有一个10%左右的性能下降,为了达到性能的最大化,你可以关掉这个配置项。
    rdbchecksum yes
    
    # 快照的文件名
    dbfilename dump.rdb
    
    # 存放快照的目录
    dir /var/lib/redis
    
    

    Rdb方式持久化实践

    试验一

    在redis中保存几条数据,然后执行shutdown关闭redis,然后再重启redis,看看刚才插入的数据是否还在?假如数据还在,为什么?
    因为,通过redis-cli shutdown这种方式去停掉redis,其实是一种安全退出的模式,redis在退出的时候会将内存中的数据立即生成一份完整的rdb快照,例如

    127.0.0.1:6379> set phone 11111111
    OK
    127.0.0.1:6379> shutdown   #默认也会进行持久化
    [root@centos7964 ~]#  docker start redis01
    [root@centos7964 ~]# docker exec -it redis01 redis-cli
    127.0.0.1:6379> keys *
    1) "pone"
    
    

    试验二

    在redis中再保存几条新的数据,用kill -9粗暴杀死redis进程,模拟redis故障异常退出,导致内存数据丢失的场景?
    这次就发现,redis进程异常被杀掉,几条最新的数据就丢失了。例如:

    首先,打开第一个客户端,先清除redis内存和磁盘对应的数据

    [root@centos7964 data]# docker exec -it redis01 redis-cli
    127.0.0.1:6379> flushall
    OK
    127.0.0.1:6379> exit
    [root@centos7964 data]# ls
    dump.rdb
    [root@centos7964 data]# rm –f dump.rdb
    [root@centos7964 data]# ls
    
    

    然后,打开并登录第二个客户端,并向redis存储一些数据,例如

    [root@centos7964 ~]# docker exec -it redis01 redis-cli
    127.0.0.1:6379> set one mybatis
    OK
    127.0.0.1:6379> set two spring
    OK
    127.0.0.1:6379> keys *
    1) "one"
    2) "two"
    
    

    接下来,再次回到第一个客户端,杀掉redis进程,例如

    [root@centos7964 data]# ps -ef | grep redis
    polkitd    6995   6974  0 14:44 ?        00:00:00 redis-server *:6379
    root       7064   6974  0 14:44 pts/0    00:00:00 redis-cli
    root       7111   6467  0 14:47 pts/1    00:00:00 docker exec -it redis01 redis-cli
    root       7130   6974  0 14:47 pts/1    00:00:00 redis-cli
    root       7278   7180  0 14:51 pts/0    00:00:00 grep --color=auto redis
    [root@centos7964 data]# kill -9 6995
    [root@centos7964 data]# docker start redis01
    
    

    最后,打开第一个客户端,登录redis,检查key是否还存在.

    [root@centos7964 ~]# docker exec -it redis01 redis-cli
    127.0.0.1:6379> keys *
    (empty array)
    127.0.0.1:6379>
    [root@centos7964 ~]#
    
    

    试验三

    手动调用save(同步保存)或者bgsave(异步保存)执行rdb快照生成.然后杀掉redis进程,再重启检测是否还有刚刚保存的数据.

    127.0.0.1:6379> set id 100
    OK
    127.0.0.1:6379> set name jack
    OK
    127.0.0.1:6379> save  #阻塞式持久化
    OK
    127.0.0.1:6379> set address beijing
    OK
    127.0.0.1:6379> bgsave  #异步方式持久化
    Background saving started
    
    

    面试分析

    Redis中的save和bgsave有什么不同?

    Redis Save 命令执行一个同步保存操作,将当前 Redis 实例的所有数据快照(snapshot)以 RDB 文件的形式保存到硬盘。
    BGSAVE 命令执行之后立即返回 OK ,然后 Redis fork 出一个新子进程,原来的 Redis 进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出。
    RDB持久化机制有哪些优点?

    第一:RDB会生成多个数据文件,每个数据文件都代表了某一个时刻中redis的数据,这种多个数据文件的方式,非常适合做冷备,可以将这种完整的数据文件发送到一些远程云服务上去,在国内可以是阿里云的ODPS分布式存储上,以预定好的备份策略来定期备份redis中的数据.
    第二:RDB对redis对外提供的读写服务,影响非常小,可以让redis保持高性能,因为redis主进程只需要fork一个子进程,让子进程执行磁盘IO操作来进行RDB持久化即可。
    第三:相对于AOF持久化机制来说,直接基于RDB数据文件来重启和恢复redis进程,更加快速。

    RDB持久化机制有哪些缺点?

    假如redis故障时,要尽可能少的丢失数据,那么RDB方式不太好,它都是每隔5分钟或更长时间做一次快照,这个时候一旦redis进程宕机,那么会丢失最近几分钟的数据。

    2.Aof方式数据持久化

    概述

    Aof方式是通过记录写操作日志的方式,记录redis数据的一种持久化机制,这个机制默认是关闭的。

    AOF方式配置

    # 是否开启AOF,默认关闭
    appendonly yes
    # 指定 AOF 文件名
    appendfilename appendonly.aof
    # Redis支持三种刷写模式:
    # appendfsync always #每次收到写命令就立即强制写入磁盘,类似MySQL的sync_binlog=1,是最安全的。但该模式下速度也是最慢的,一般不推荐使用。
    appendfsync everysec #每秒钟强制写入磁盘一次,在性能和持久化方面做平衡,推荐该方式。
    # appendfsync no     #完全依赖OS的写入,一般为30秒左右一次,性能最好但是持久化最没有保证,不推荐。
        
    #在日志重写时,不进行命令追加操作,而只是将其放在缓冲区里,避免与命令的追加造成DISK IO上的冲突。
    #设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入,默认为no,建议yes
    no-appendfsync-on-rewrite yes
    #当前AOF文件大小是上次日志重写得到AOF文件大小的二倍时,自动启动新的日志重写过程。
    auto-aof-rewrite-percentage 100
    #当前AOF文件启动新的日志重写过程的最小值,避免刚刚启动Reids时由于文件尺寸较小导致频繁的重写。
    auto-aof-rewrite-min-size 64mb
    
    

    AOF方式持久化实践

    第一:打开AOF的开关,启用AOF持久化
    第二:写入一些数据,观察AOF文件(appendonly.aof)中的日志内容
    第三:kill -9杀掉redis进程,重新启动redis进程,发现数据被恢复回来了,就是从AOF文件中恢复回来的,redis进程启动的时候,直接就会从appendonly.aof中加载所有的日志,把内存中的数据恢复回来。

    小节面试分析

    如何理解AOF方式中的rewrite操作?

    redis中的数据其实有限的,很多数据可能会自动过期,可能会被用户删除,可能会被redis用缓存清除的算法清理掉。也就是说redis中的数据会不断淘汰掉旧的,只有一部分常用的数据会被自动保留在redis内存中,所以可能很多之前的已经被清理掉的数据,对应的写日志还停留在AOF中,AOF日志文件就一个,会不断的膨胀,到很大很大。
    所以,AOF会自动在后台每隔一定时间做rewrite操作,比如日志里已经存放了针对100w数据的写日志了; redis内存只剩下10万; 基于内存中当前的10万数据构建一套最新的日志,到AOF中; 覆盖之前的老日志; 确保AOF日志文件不会过大,保持跟redis内存数据量一致.

    AOF持久化机制有哪些优点?

    第一:AOF可以更好的保护数据不丢失,一般AOF会每隔1秒,通过一个后台线程执行一次fsync操作,最多丢失1秒钟的数据.
    第二:AOF日志文件以append-only模式写入,所以没有任何磁盘寻址的开销,写入性能非常高,而且文件不容易破损,即使文件尾部破损,也很容易修复。
    第三:AOF日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写。因为在rewrite log的时候,会对其中的指导进行压缩,创建出一份需要恢复数据的最小日志出来。再创建新日志文件的时候,老的日志文件还是照常写入。当新的merge后的日志文件ready的时候,再交换新老日志文件即可。
    第四:AOF日志文件的命令通过易读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。比如某人不小心用flushall命令清空了所有数据,只要这个时候后台rewrite还没有发生,那么就可以立即拷贝AOF文件,将最后一条flushall命令给删了,然后再将该AOF文件放回去,就可以通过恢复机制,自动恢复所有数据.

    AOF持久化机制有哪些缺点?

    第一:对于同一份数据来说,AOF日志文件通常比RDB数据快照文件更大。
    第二:AOF开启后,支持的写QPS会比RDB支持的写QPS低,因为AOF一般会配置成每秒fsync一次日志文件,当然,每秒一次fsync,性能也还是很高的。
    第三:AOF这种基于命令日志方式,比基于RDB每次持久化一份完整的数据快照文件的方式,更加脆弱一些,容易有bug。不过AOF为了避免rewrite过程导致的bug,因此每次rewrite并不是基于旧的指令日志进行merge的,而是基于当时内存中的数据进行指令的重新构建,这样健壮性会好很多。

    如何选择redis的持久化方式?

    第一:不要仅仅使用RDB,因为那样会导致你丢失很多数据。
    第二:也不要仅仅使用AOF,因为AOF做冷备没有RDB做冷备进行数据恢复的速度快,并且RDB简单粗暴的数据快照方式更加健壮。
    第三:综合使用AOF和RDB两种持久化机制,用AOF来保证数据不丢失,作为数据恢复的第一选择; 用RDB来做不同程度的冷备。

    展开全文
  • RDBRDB是Redis内存到硬盘的快照,用于redis持久化,创建RDB二进制文件,将存储在内存中的数据,持久化的放到硬盘中,当我们需要这些数据的时候,启动载入RDB文件,数据将会被存入...
  • 1.持久化RDB和AOF区别、特点、适合场景 持久化意义:在于故障恢复,如果没有持久化,redis遇到灾难性故障的话,数据会全部丢失。如果通过持久化将数据拷贝一份到硬盘,然后定期比如同步备份到一些云存储服务上去...
  • rdb和aof的优缺点

    2021-02-20 19:05:17
    然后咱以上就是rdb和aof的优缺点,简单用自己的话来描述一下吧 RDB的优点:简称“3更” 1.体积更小:相同的数据量rdb数据比aof的小,因为rdb是紧凑型文件 2.恢复更快:因为rdb是数据的快照,基本上就是数据的复制,...
  • RDBAOF区别

    2021-08-13 13:45:25
    1.什么是RDB和AOFRDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储 AOF持久化方式记录每次对服务器写的操作,当服务器重启时会重新执行这些命令来恢复原始数据, 注意:只做缓存的时候可以不做任何...
  • RDB:在指定的的时间间隔内将内存中的数据集快照写入磁盘,也就是snapshot快照,它恢复时是将...如果需要进行大规模的数据恢复,且对于数据恢复的完整性不是非常敏感,那rdb方式比aof更高效。rdb的缺点是最后一次赤...
  • RDB和AOF的流程

    2021-06-02 19:04:09
    1.redis执行bgsave命令,Redis判断当前存在正在进行执行的子进程,如RDB/AOF子进程,存在bgsave命令直接返回 2.fork出子进程,fork操作中Redis父进程会阻塞 3.fork完成返回 59117:M 13 Apr 13:44:40.312 * ...
  • 幸好Redis还为我们提供了持久化的机制,分别是RDB(Redis DataBase)和AOF(Append Only File)。 在这里假设你已经了解了redis的基础语法,某字母网站都有很好的教程,可以去看。基本使用的文章就不写了,都是一些常用...
  • Redis的持久化及RDB和AOF的使用及选择Redis的持久化1. 概述2. RDB【Redis DataBase】2.1 什么是RDB2.2 什么是FORK2.3 保存位置及配置位置2.4 如何触发RDB快照2.5 如何恢复数据2.6 优点2.7 缺点3. AOF3.1 概述3.2 ...
  • redis开启rdb和aof后文件正确恢复

    千次阅读 2021-01-15 17:58:21
    1.服务器环境: ...现在我需要同时开启aof和rdb两个持久化策略,假如我们直接关闭redis,并且打开aof的开关,我们看看保存的数据还在不在。 更改配置之后重启redis发现数据没了 appendo..
  • 跳槽必备: 嵌入式开发转互联网开发面经分享:嵌入式开发成功转战互联网行业 ...redis持久化方案分为RDB和AOF两种。 RDB RDB持久化可以手动执行也可以根据配置定期执行,它的作用是将某个时间点上的数据库状态
  • Redis 的⼀种持久化⽅式叫快照(snapshotting,RDB(Redis Database)),另⼀种⽅式是只追加⽂件(append-only file, AOF) 1.RDB持久化机制 RDB文件是一种经过压缩的二进制文件 RDB文件的写入载入流程如下图所示...
  • Redis配置RDB和AOF持久化环境redis.confDocker启动 RDB和AOF原理博客很多这里就不介绍了,以下讲主要是如何进行实际配置 环境 环境 版本 ubuntu 18 docker 18 redis.conf 【该文件中不能写注释,这里...
  • 目前redis支持两种不同方式的数据持久保存机制,分别是RDB和AOF 其中RDB类似于Mysql dump快照,AOF则类似与mysql binlog 1.RDB模式 RDB(Redis DataBase):基于时间的快照,其默认只保留当前最小异常的...
  • 我们经常听的RDB和AOF有什么区别?以及它们不同的使用场景。 持久化方式 Redis提供的数据持久化方式主要有2种: RDB:产生一个数据快照文件 AOF:实时追加命令的日志文件 它们分别对应了不同的使用场景,下面我们...
  • RDB和AOF区别

    2021-06-01 17:18:12
    redis提供两种方式进行持久化,一种是RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化),另外一种是AOF持久化(原理是将Reids的操作日志以追加的方式写入文件)。那么这两种持久化方式有...
  • 1 RDB 在指定的时间间隔内将内存中的数据以快照的形式保存到磁盘 过程: 1 客户端执行bgsave命令,redis主进程收到指令并判断此时是否在执行bgrewriteaof, 如果此时正好在执行则bgsave直接返回,不fork子进程,...
  • redis持久化:RDB和AOF 及性能建议小结 目录redis持久化:RDB和AOF 及性能建议小结总体介绍官网介绍RDB(redis database)是什么默认出厂设置与使用save配置参数保存的文件类型如何触发RBD快照如何恢复优势与劣势AOF...
  • redis提供两种方式进行持久化,一种是RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化),另外一种是AOF持久化(原理是将Reids的操作日志以追加的方式写入文件)。那么这两种持久化方式有...
  • 数据持久化 ...RDB和AOF区别AOFRDB更安全,当发生灾难时,AOF丢失的数据比RDB少。 RDB文件比AOF文件更紧凑,也就是更小,非常适用适合备份。 RDB恢复数据的速度比AOF更快。 1. RDB 使用BGSAV
  • 2)如果每一次数据变化都写入aof文件里面,则称为全持久化模式。 3)同时还可以基于Redis主从复制实现Redis备份与恢复。   2、半持久化RDB模式 半持久化RDB模式是Redis备份默认方式,是通过快照(snapshotting...
  • redis持久化的两种方式:RDB和AOF 目的 针对于内存数据丢失的情况,redis提供了两种数据持久化的机制。 RDB RDB:将redis的数据通过服务器快照的方式以二进制存储在dump.rdb文件中。原理:定时fork一个子线程去将内存...
  • AOF相比RDB最重要的优点之一是对性能的影响相对较小。 缺点: RDB文件数据快照的会造成数据丢失,因此AOF持久化成为主流。此外,RDB文件需要满足特定格式,兼容性差(如老版本的Redis不兼容新版本的
  • redis的持久化方式RDB和AOF区别: 1.概论     使用到Redis做缓存,方便多个业务进程之间共享数据。由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要...
  • 1、RDB和AOF两种持久化机制的介绍 RDB持久化机制,对redis中的数据执行周期性的持久化 AOF机制对每条写入命令作为日志,以append-only的模式写入一个日志文件中,在redis重启的时候,可以通过回放AOF日志中的写入...
  • Redis提供了两种持久化的选项,一种是快照文件(snapshotting,RDB),它会基于某个时间点将数据全部写入硬盘中(默认为dump.rdb)。另一种是只追加文件(append-only,AOF),它会在执行写入命令时将命令写入到硬盘中。Redis...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 59,273
精华内容 23,709
关键字:

rdb和aof的区别