Redis单机持久化策略

  • RDB
  • AOF


Redis的持久化分为两种,RDB和AOF两种。

RDB

RDB模式是Redis以快照的形式做的持久化,Redis重启后课通过RDB文件快速恢复数据。

  • 优点:类似于java的序列化,恢复速度相对较快。
  • 缺点:不支持拉链备份,只有一个备份快照文件,需要人为维护。
    刚要备份,挂机了,会丢失一部分数据。

RDB备份具有时点性,备份的方式有两种:

  • save :使用 save
  • bgsave

时点性的意思为,如果在8:00使用 bgsave

RDB快照使用的是系统调用fork(),开辟一个子进程去执行写入磁盘,当数据被修改了,会触发copy on write机制,所以RDB的数据具有时点性。

子进程并没有复制父进程的变量,而是将引用指针执行了同一个地方,如果某一个进程修改了数据,会触发copy on write 机制,更改变量的指针而已。所以父子进程持有的数据是隔离的。

尽管redis是通过save配置触发RDB的策略,底层依然使用的是 bgsave

save  时间 操作数

AOF

AOF文件就是往文件里写入操作redis 的指令,类似于日志文件,默认是不开启AOF备份的。

关于AOF的配置:

  • appendonly:yes是开启AOP,默认是no。
  • no-appendfsync-on-rewrite :如果应用系统无法忍受延迟,而可以容忍少量的数据丢失,则设置为yes。如果应用系统无法忍受数据丢失,则设置为no。
  • aof-use-rdb-preamble:是否开启混合模式,如果文件开头是以REDIS开头,代表是4.0以后的版本,否则是之前的版本。
  • auto-aof-rewrite-min-size:触发自动压缩的文件大小,aof里存放了所有的redis 操作指令,当aof文件达到条件开始压缩。默认是65mb。
    bgrewriteaof
    当前写入日志文件的大小超过上一次rewrite之后的文件大小的百分之100时就是2倍时触发Rewrite。
  • auto-aof-rewrite-percentage:AOF文件的大小超过基准百分之多少后触发 bgrewriteaof 。默认这个值设置为100,意味着当前AOF文件是基准大小的两倍的时候触发 bgrewriteaof
  • appendfsync:触发IO的级别,因为在写入AOF文时,内核会为我们维护一个buffer,这个buffer满了才会写入磁盘,当这个buffer写入到磁盘的时候,才是真正的写入,否则在buffer没有写入磁盘的时候挂机了,buffer中的数据就会丢失。这个配置就是控制flush的响应级别。
  • always:每次操作都调用flush写入磁盘。会影响效率,但是能保证每次操作成功时数据不丢失。
  • everysec:每秒中调用flush写入磁盘,这个效率比always好一点,不影响buffer自动flush。
  • no:由操作系统自动调度刷磁盘,性能是最好的,内核的buffer满了才会调用flush写入磁盘,最差的情况是丢失一个buffer的数据。

以上为AOF常用的配置。

  • 优点:通过appendfsync配置,丢失数据比RDB要少很多。
  • 缺点:日志体量大,恢复时间慢。

解决方案:

  • 4.0之前:触发rewrite,删除抵消的命令,合并重复的命令,针对一个key,最终也是一个纯指令的日志文件。
  • 4.0以后:触发rewrite之后会变成RDB和AOF的混合体,先将RDB的数据写到AOF文件中,以增量的方式append到AOF中。利用了RDB的快,也利用率AOF的全量日志。

可以同时开启RDB和AOF模式,如果只开启了AOF模式,只会用AOF恢复。