【redis】持久化方案

文章目录

  • 入门
  • RDB
    • 一、介绍
    • 二、触发快照
    • 三、实现原理
    • 四、优缺点
  • AOF
    • 一、介绍
    • 二、文件写入
    • 三、文件同步
    • 四、重写机制
    • 五、优缺点
  • 如何选择

入门

 当进程意外宕机或者出现故障,可能就会存在数据丢失的情况,这时候,redis的持久化就起到了很大的作用,防止了数据丢失。redis主要提供了两种持久化方案:RDB和AOF两种方式;

RDB

一、介绍

 RDB是通过生成快照(snapshotting)的形式完成的,它会把符合一定条件的数据自动的从内存中进行快照,并且持久化到硬盘上。

二、触发快照

  1. 符合自定义配置的快照规则;
  2. 执行save或者bgsave命令;
  3. 执行flushall命令;
  4. 执行主从复制操作;

三、实现原理

【redis】持久化方案_第1张图片

  1. 执行bgsave命令,首先父进程会首先判断是否有RDB/AOF 进程存在,如果有其他进程,然后就会直接返回;
  2. 父进程通过fork创建子进程,因为创建过程是重量级的,所以可能会导致父进程阻塞;
  3. fork操作结束后,bgsave命令会相应“Background saving started”信息,并且不再阻塞父进程,然后父进程可以相应其他命令
  4. 子进程会创建RDB文件,根据父进程内存生成临时快照文件,完成后就可以对原有的文件进行替换操作;
  5. 子进程会发送信号通知父进程,然后父进程会进行更新统计;

四、优缺点

优点

  1. 紧凑压缩的二进制文件,代表某个时间的快照
  2. 恢复数据速度比AOF快的多;
  3. RDB可以最大化Redis的性能:父进程在保存RDB文件时唯一要做的就是fork出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无序执行任何磁盘I/O操作。但是,如果数据集比较大的时候,fork可以能比较耗时,造成服务器在一段时间内停止处理客户端的请求;

缺点

  1. 不是实时/秒级持久化
  2. redis版本更新,可能不兼容老的RDB文件
  3. 使用RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据

AOF

一、介绍

【redis】持久化方案_第2张图片

  1. 独立日志存储,重启是重新执行AOF文件,用来恢复数据
  2. 实时持久化
  3. 默认情况下AOF是关闭的,需要自己在配置文件中手动开启
  4. 开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件,这一过程显然会降低Redis的性能,但大部分情况下这个影响是能够接受的,另外使用较快的硬盘可以提高AOF的性能。

二、文件写入

 AOF命令写入的内容直接是文本协议格式;直接采用文本格式,这是因为,文本格式有很好的兼容性,而且开启AOF后,所有的写入命令都是在原有数据上的追加,所以直接采用协议格式,避免了数据的二次处理;

三、文件同步

 Redis每次更改数据的时候, aof机制都会将命令记录到aof文件,但是实际上由于操作系统的缓存机制,数据并没有实时写入到硬盘,而是进入硬盘缓存。再通过硬盘缓存机制去刷新到保存到文件;
参考值

  1. appendfsync always 每次执行写入都会进行同步 , 这个是最安全但是是效率比较低的方式
  2. appendfsync everysec 每一秒执行
  3. appendfsync no 不主动进行同步操作,由操作系统去执行,这个是最快但是最不安全的方式

四、重写机制

 因为命令的不断写入,这时候会导致文件的体积不断的增大,为了解决这个问题,Redis引出了AOF重写的机制用来压缩文件的体积;
 AOF重写是把Redis进程内的数据转化为写命令同步到AOF文件的过程;通过写命令,体积减小有以下几个原因:

  1. 超时的文件不会被写入AOF文件;
  2. 旧的AOF文件中包含无效的命令,重写后将重复的命令进行整合,然后仅保留最终数据的写命令;
  3. 多条写命令合并成一个;

重写的流程

  1. 主进程会fork出一个子进程进程AOF重写;但是这个过程不是基于原有aof文件,而是类似快照形式全量遍历内存中的数据,然后逐个序列到aof文件中。
  2. 在fork子进程的过程中,服务端仍然对外提供服务,这时候如果主进程的数据更新,会缓存到aof_rewirte_buf中,也就是独立开辟一块缓存来存储重写期间收到的命令,当子进程再重写的时候,再把缓存中的数据追加到新的aof文件中;
  3. 如果rewrite过程中出现故障,不会影响原来的aof文件正常工作,只有到rewirte完成后才会切换文件。所以这个过程还是比较可靠的;

五、优缺点

优点

  1. 数据的完整性和一致性高

缺点

  1. 因为AOF记录的内容多,文件会越来越大,数据恢复也会越来越慢,由于每次执行增删改操作都要向aof文件写入数据,所以性能也要差于RDB方式的

如何选择

  1. 一般来说,如果对数据的安全性要求非常高的话,应该同时使用两种持久化功能
  2. 如果可以承受数分钟以内的数据丢失,那么可以只使用 RDB 持久化。
  3. 有很多用户都只使用 AOF 持久化, 但并不推荐这种方式: 因为定时生成 RDB 快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快 。
  4. 两种持久化策略可以同时使用,也可以使用其中一种。如果同时使用的话, 那么Redis重启时,会优先使用AOF文件来还原数据,因为其中的日志更完整
  5. 如果只做缓存建议RDB,如果做内存数据库和消息队列可以采用AOF

你可能感兴趣的:(redis)