3.Redis持久化

持久化

一、RDB

  • 概念
    RDB持久化能够在指定的时间间隔内生成数据集的时间点内存快照
  • 配置
    一、save 60 10000
    二、rdbcompression yes
    三、dbfilename "dump_6379.rdb"
    四、dir "/appdata/redis/savefile"(AOF同)
  • 命令
save  
    经过主进程,形成阻塞,期间不能执行任何命令
bgsave  
    fork()子进程后台进行
  • 优势
    一、恢复速度快,但载入过程当中会令redis一直处于阻塞状态,直到载入完成;
    二、可压缩保存;
    三、可最大化Redis性能,父进程fork子进程完成保存操做。
  • 缺点
    一、数据非实时保存,易丢失部分数据;
    二、数据集大时,fork()操做耗时且消耗cpu。

二、AOF

  • 概念
    AOF 持久化记录服务器执行的全部写操做命令(append-only file)
  • 配置
一、appendfsync    
        一、always    
        二、everysec  
        三、no(由系统决定同步频率)  
二、appendonly yes  
三、appendfilename "appendonly.aof"  
四、auto-aof-rewrite-percentage 100  
   auto-aof-rewrite-min-size 64mb
  • AOF还原过程
  1. 建立一个不带网络链接的伪客户端,由于redis的命令只能在客户端上下文中执行;
  2. 从AOF文件中分析并读取一条写命令;
  3. 使用伪客户端执行被读出的写命令;
  4. 一直重复步骤2和步骤3,直到AOF文件的全部写命令被处理完毕为止。
  • aof重写机制 redis

    1. AOF文件重写并不须要对现有的AOF文件进行任何读取、分析或者写入操做,这个功能是经过读取服务器当前数据库状态来实现的。首先从数据库中读取键如今的值,而后用一条命令去记录键值对,代替以前记录这个键值对的多条命令,这就是AOF重写功能的实现原理;
    2. 同时,为了解决重写期间有数据写入致使现有AOF和重写后的AOF数据不一致的问题,Redis设置了一个AOF重写缓冲区,Redis执行完一个命令后,它会同时将这个写命令发送给AOF缓冲区和AOF重写缓冲区。
    3. AOF重写完成后,会向父进程发送一个信号,父进程将调用信号处理函数执行如下操做:
      1)将AOF重写缓冲区的全部内容写入新AOF文件中;
      2)对新的AOF文件更名,原子地覆盖现有的AOF文件,完成两个文件的替换;
      3)整个过程,只有信号处理函数执行时才会对Redis父进程形成阻塞。
  • aof重写命令
bgrewriteaof  fork()子进程重写aof文件
  • 优势
    一、较为实时,默认(everysec)至多丢失一秒数据
    二、redis-check-aof --fix 可修复AOF文件
    三、文件可读性强
    四、可进行安全的rewrite操做
  • 缺点
    一、体积较大
    二、根据fsync策略,AOF可能会致使redis速度低于RDB

三、优先级

  1. 优先AOF载入内存,只有关闭AOF功能时才会载入载入RDB文件恢复数据库;
  2. BGSAVE和BGREWRITE不可同时进,BGSAVE时发起BGREWRITE,后者会阻塞,等待BGSAVE完成后再开始,BGREWRITE时发起BGSAVE,会被拒绝。

四、写时复制(Copy-On-Write)

(1) fork()
fork会建立一个子进程,子进程的是父进程的副本。数据库

(2) exec()
exec函数的做用就是装载一个新的程序(可执行映像)覆盖当前进程内存空间中的映像,从而执行不一样的任务。如redis的子进程专门用于进行bgsave或bgrewrite操做。 安全

(3) Copy-On-Write技术实现原理:
fork()以后,kernel把父进程中全部的内存页的权限都设为read-only,而后子进程的地址空间指向父进程。当父子进程都只读内存时,相安无事。当其中某个进程写内存时,CPU硬件检测到内存页是read-only的,因而触发页异常中断(page-fault),陷入kernel的一个中断例程。中断例程中,kernel就会把触发的异常的页复制一份,因而父子进程各自持有独立的一份。 服务器

(4) Copy-On-Write优缺点?
优势:网络

  • COW技术可减小分配和复制大量资源时带来的瞬间延时;
  • COW技术可减小没必要要的资源分配。好比fork进程时,并非全部的页面都须要复制,父进程的代码段和只读数据段都不被容许修改,因此无需复制。

缺点: app

  • 若是在fork()以后,父子进程都还须要继续进行写操做,那么会产生大量的分页错误(页异常中断page-fault),这样就得不偿失。

(5) Copy-On-Write在redis上的应用 ide

  • Redis在持久化时,若是是采用BGSAVE命令或者BGREWRITEAOF的方式,那Redis会fork出一个子进程来读取数据,从而写到磁盘中。
  • 整体来看,Redis仍是读操做比较多。若是子进程存在期间,发生了大量的写操做,那可能就会出现不少的分页错误(页异常中断page-fault),这样就得耗费很多性能在复制上。
  • 在rehash阶段上,写操做是没法避免的。根据 BGSAVE 命令或 BGREWRITEAOF 命令是否正在执行, 服务器执行扩展操做所需的负载因子并不相同, 这是由于在执行 BGSAVE命令或 BGREWRITEAOF 命令的过程当中, Redis 须要建立当前服务器进程的子进程, 而大多数操做系统都采用写时复制(copy-on-write)技术来优化子进程的使用效率, 因此在子进程存在期间, 服务器会提升执行扩展操做所需的负载因子, 从而尽量地避免在子进程存在期间进行哈希表扩展操做, 这能够避免没必要要的内存写入操做, 最大限度地节约内存。
相关文章
相关标签/搜索