快速掌握Redis——第六招:持久化 (数据备份与恢复)

1 何为持久化

redis 是内存数据库,掉电会丢失,转移数据不便。持久化就是内存数据到硬盘数据的转化。
当然,也可以硬盘到内存(备份的概念,保存,恢复)。

2 怎么实现

两种方法:快照方式(rdb)+日志方式(aof)
快速+最大化redis性能+方便:rdb 模式
更持久:aof 模式
建议:合理的同时使用这两种方式。

2.1 rdb 快照模式

  • Snapshotting (快照) 语法

    快照是默认的持久化方式(内存全拷贝)。这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久 化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照,下面是默认的快照保存配置。(建议从下往上看,60s-300s-900s)

    save 900 1  //900秒内如果超过1个key被修改,则发起快照保存
    save 300 10 //300秒内容如超过10个key被修改,则发起快照保存
    save 60 10000
     //(这3个选项都屏蔽,则rdb禁用)
    
    stop-writes-on-bgsave-error yes  // 后台备份进程出错时,主进程停不停止写入
    rdbcompression yes    // 导出的rdb文件是否压缩
    Rdbchecksum   yes //  导入rbd恢复时数据时,要不要检验rdb的完整性
    dbfilename dump.rdb  //导出来的rdb文件名
    dir ./  //rdb的放置路径
    
  • 详细的快照保存过程

    1.redis调用fork,现在有了子进程和父进程。

    2.父进程继续处理client请求,子进程负责将内存内容写入到临时文件。由于os的写时复制机制(copy on write)父子进程会共享相同的物理页面,当父进程处理写请求时os会为父进程要修改的页面创建副本,而不是写共享的页面。所以子进程的地址空间内的数 据是fork时刻整个数据库的一个快照。

    3.当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程退出。

client 也可以使用save或者bgsave命令通知redis做一次快照持久化。save操作是在主线程中保存快照的,由于redis是用一个主线程来处理所有 client的请求,这种方式会阻塞所有client请求。所以不推荐使用。另一点需要注意的是,每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步增加数据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘io操作,可能会严重影响性能。

另外由于快照方式是在一定间隔时间做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。如果应用要求不能丢失任何修改的话,可以采用aof持久化方式。

2.2 aof 日志模式

aof 比快照方式有更好的持久化性,是由于在使用aof持久化方式时,redis会将每一个收到的写命令都通过write函数追加到文件中(默认是 appendonly.aof)。当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。当然由于os会在内核中缓存 write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。不过我们可以通过配置文件告诉redis我们想要 通过fsync函数强制os写入到磁盘的时机。有三种方式如下(默认是:每秒fsync一次)

appendonly yes              //启用aof持久化方式
# appendfsync always      //每收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
appendfsync everysec     //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
# appendfsync no         //完全依赖os,性能最好,持久化没保证(操作系统自身的同步)
no-appendfsync-on-rewrite  yes  //正在导出rdb快照的过程中,要不要停止同步aof
auto-aof-rewrite-percentage 100  //aof文件大小比起上次重写时的大小,增长率100%时,重写
auto-aof-rewrite-min-size 64mb //aof文件,至少超过64M时,重写

重写:内存中有N多数据,是NNN次语句得到的,为了节省日志文件空间,将内存数据转化为直接优化过的语句,不是以前的(详细)操作步骤,但是达到的“数据”效果是一样的。
aof 的方式也同时带来了另一个问题。持久化文件会变的越来越大。例如我们调用incr test命令100次,文件中必须保存全部的100条命令,其实有99条都是多余的。因为要恢复数据库的状态其实文件中保存一条set test 100就够了。为了压缩aof的持久化文件。redis提供了 bgrewriteaof 命令。收到此命令redis将使用与快照类似的方式将内存中的数据 以命令的方式保存到临时文件中,最后替换原来的文件。aof 过程:

1.redis调用fork ,现在有父子两个进程

2.子进程根据内存中的数据库快照,往临时文件中写入重建数据库状态的命令

3.父进程继续处理client请求,除了把写命令写入到原来的aof文件中。同时把收到的写命令缓存起来。这样就能保证如果子进程重写失败的话并不会出问题。

4.当子进程把快照内容写入已命令方式写到临时文件中后,子进程发信号通知父进程。然后父进程把缓存的写命令也写入到临时文件。

5.现在父进程可以使用临时文件替换老的aof文件,并重命名,后面收到的写命令也开始往新的aof文件中追加。

需要注意到是重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。

注意:

  • aof和rdb同时存在的时候,有限使用aof恢复数据;
  • aof和rdb恢复的时候,谁快,rdb快,直接拷贝数据,aof还要执行语句;
  • 建议同时使用aof 和 rdb
  • aof 文件 和 rdb文件 在下次redis启动的时候会执行或载入,达到备份的目的。
时间: 2024-10-04 13:11:09

快速掌握Redis——第六招:持久化 (数据备份与恢复)的相关文章

快速掌握Redis——第七招:运维必学 主从和监控sentinel(未排版)

1 主从同步 Replication 过程 slave 配置复制(Replication)策略后,会向master 主动发送一个SYNC命令.Master将启动后台存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕后,Master将传送整个数据库文件到Slave,以完成一次完全同步.而Slave服务器在接收到数据库文件数据之后将其存盘并加载到内存中.此后,Master继续将所有已经收集到的修改命令,和新的修改命令依次传送给Slaves,Slave将在本次执行这些数据修改命令,

redis学习--的持久化数据备份(RDB和AOF)

接上一篇:安装window下的redis,redis可视化管理工具(Redis Desktop Manager)安装,基础使用,实例化项目 一.dump.rdb文件是怎么生成的 二.什么是redis持久化 三.redis的RDB是什么? 四.redis配置文件redis.config相关配置 五.redis优点 六.redis缺点 redis比memcache作为缓存数据库强大的地方:(1)支持数据类型比较多,(2)redis持久化功能. 一.dump.rdb文件是怎么生成的 在redis服务挂

Redis研究(十一)—数据持久化

一. 持久化 Redis的强劲性能很大程度上是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中以某种形式同步到硬盘中,这一过程就是持久化. Redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式.可以单独使用其中一种或将二者结合使用. 1. RDB方式 RDB方式的持久化是通过快照(snapshotting )完成的,当符合一定条件时Redis会自动将内存中的所有数据进行快照并存储在硬盘上.进行快照的条件可以由用户在配置文件中自定义,

Redis 详解 (六) RDB 持久化

目录 1.RDB 简介 2.触发方式 ①.自动触发 ②.手动触发 3.恢复数据 4.停止 RDB 持久化 5.RDB 的优势和劣势 6.RDB 自动保存的原理  前面我们说过,Redis 相对于 Memcache 等其他的缓存产品,有一个比较明显的优势就是 Redis 不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储.这几种丰富的数据类型我们花了两篇文章进行了详细的介绍,接下来我们要介绍 Redis 的另外一大优势——持久化. 由于 R

半小时快速了解redis,基于ubuntu 12.04 + redis 2.8.9

一.什么是redis ? 其官方介绍是: Redis is what is called a key-value store, often referred to as a NoSQL database. Redis is an open source, BSD licensed, advanced key-value store. It is often referred to as a data structure server sincekeys can contain strings, 

redis相关(搭建和数据落盘)

一. redis的编译安装 1.依赖的系统包 yum install -y wget gcc make tcl 2.下载包地址 1.各个版本redis的下载地址 http://download.redis.io/releases/ 2.本文安装最新版本4.0.9 wget http://download.redis.io/releases/redis-4.0.9.tar.gz 3.编译安装 1.解压:tar xf redis-4.0.9.tar.gz && cd redis-4.0.9 2

Redis(七)持久化(Persistence)

前言 前文中介绍到Redis时内存的K-V数据结构存储服务器.Redis的高性能原因之一在于其读写数据都是在内存中进行.它的架构实现方式决定了Redis的数据存储具有不可靠性,易丢失,因为RAM内存在硬件问题或者断电情况下都会被擦除. 基于以上问题,为了防止数据在特殊情况下丢失,Redis支持内存数据持久化至磁盘的功能--Redis Persistence. Redis持久化方式 Redis提供了两种持久化方式: RDB持久化方式:在特定的时间间隔存储Redis键空间的某一时刻的快照. AOF持

redis的两种持久化方案

人生在于折腾系列,网络,多线程等系列博客楼主还在继续折腾也不会放弃.这是全新的系列,缓存的知识其实并不仅仅在于简单的增删改查,我觉得有必要全面深入的学习一波.记录学习的过程与体悟. 2|0RDB 2|1什么是RDB 对redis中的数据执行周期性的持久化,通过配置文件中设置检查间隔时间与备份触发条件来对数据进行周期性的持久化 2|2RDB持久化的优点 RDB会生成多个数据文件,每个数据文件都代表了某一个时刻中redis的数据,这种多个数据文件的方式,非常适合做冷备份. RDB对redis对外提供

java架构之路-(Redis专题)Redis的高性能和持久化

上次我们简单的说了一下我们的redis的安装和使用,这次我们来说说redis为什么那么快和持久化数据 在我们现有的redis中(5.0.*之前的版本),Redis都是单线程的,那么单线程的Redis为什么还会有那么高的效率呢?因为它所有的数据都在内存中,所有的运算都是内存级别的运算,而且单线程避免了多线程的切换中性能损耗的问题,正因为Redis是单线程,所以我们要小心使用Redis指令,对于那些耗时的指令(比如keys),我们一定要谨慎使用. 在并发环境中,我们Redis的单线程并不是线程1请求