redis是一种基于内存的非关系型数据库,内存虽然快但是数据也更易丢失,所以redis提供了两种持久化方式,分别是RDB和AOF,今天就介绍下这两种持久化方式以及原理
一、RDB
1、介绍
rdb是一种快照式的存储也是redis默认的持久化策略,它将内存中的数据持久化到磁盘中且能做到不影响redis的性能;其有两种持久化方式,一个是阻塞式的持久化(save)另一个是非阻塞式后台的持久化(bgSave);
2、实现原理
利用linux父子进程的概念,持久化时fork一个子进程,但并没有复制父进程内存中的所有数据,而只是移动了指针,利用了copy on write机制只在write时才真正的复制数据,速度快;父进程不需要再做其他IO操作,所以RDB持久化方式可以大化redis的性能;
注意:需要明确linux父子进程之间是相互隔离的,开启save过后子进程只专注于文件的落盘操作,此时主进程仍然可以接收客户端请求,只是在有写操作时利用copyonwrite机制复制数据
3、优缺点
RDB恢复数据的时间快,bgsave的时候也不会影响redis对外提供的性能,但是会存在较大丢失数据的风险;并且不支持拉链存储,即新的rdb文件会覆盖掉历史版本的文件,硬盘永远只有一份持久化文件
4、相关配置
- save time count 在time时间内修改操作发生count笔时触发rdb
- stop-writes-on-bgsave-error 在持久化时如果出错是否停止对外的写入操作,默认为yes;即当持久化出问题比如说磁盘满了的时候外界写入会报错
- rdbcompression 默认为yes,表示将存到磁盘中的快照通过LZF算法进行压缩处理
- rdbchecksum 是否使用CRC64算法校验rdb文件是否损坏,默认为yes;如果需要提升redis的性能,此处可以不校验
- dbfilename rdb持久化文件的名称,默认为dump.rdb
- dir rdb持久化文件存放的目录,默认为当前目录./
二、AOF
1、介绍
一种通过配置可以做到几乎实时的写入式持久化方式,相对应的其会影响系统的性能;
2、实现原理
将每个redis指令都写入aof文件,并且具有重写能力:随着同步操作越来越多aof文件的大小也会越来越大,这时会触发重写机制;redis可以在不打断服务客户端的情况下, 对 AOF 文件进行重建(rebuild)。执行 BGREWRITEAOF 命令, Redis 将生成一个新的 AOF 文件, 这个文件包含重建当前数据集所需的少命令。需要注意的是redis4.0以后重写是会把rdb文件写到aof文件里面,只追加rdb过后的命令;这样大大提高了效率
3、同步间隔配置
可以配置 Redis 多久才将数据 fsync 到磁盘一次;redis提供了三种方式:
- 1、从不;将数据交给操作系统来处理,不主动刷盘,是个更快,也更不安全的选择。
- 2、每秒(默认);每秒 fsync 一次:足够快(和使用 RDB 持久化差不多),并且在故障时只会丢失 1 秒钟的数据。
- 3、总是;每次有新命令追加到 AOF 文件时就执行一次 fsync :非常慢,也非常安全
4、优缺点
AOF更安全,更不易丢数据,但是AOF恢复数据没有RDB快,且AOF理论上会存在文件一直无限变大的可能,即使有重写和合并RDB机制,但当redis运行的时间足够长时还是会存在文件过大的问题
5、相关配置
- appendonly 是否开启aof持久化,默认为no
- appendfilename aof的文件名称
- appendfsync 同步间隔,即多久写入一次,三个候选值:always、everysec和no,默认使用的是everysec
- no-appendfsync-on-rewrite 在重写时是否使用no这种刷盘机制,默认为no,不使用
分析:在redis重新时主进程必然也会存在有大量写入操作的可能,两者都会操作磁盘,影响性能;该配置意思是在是否使用no这种刷盘机制,上面也结束了,no这种机制是快但是不可靠的写入方式;redis默认为no,即表示在重新时仍然不使用no这种方式,宁愿阻塞等待也不愿意丢失数据;为yes的话则表示重写时主进程使用no这种刷盘机智;
- auto-aof-rewrite-percentage 重写百分比即下次重写的触发时机,默认为100,表示当前aof文件的增长大小达到上次重写后aof文件大小的时则自动触发重写;如果设置为0则表示不触发重写操作
- auto-aof-rewrite-min-size 指定触发重写操作时aof文件的大小,默认为64M,即aof文件达到64m才会触发重写,不到64M即使满足auto-aof-rewrite-percentage也不会触发;
- aof-load-truncated aof文件损坏redis是否仍然载入;默认为yes;
注意:如果aof文件在中间损坏,redis仍将退出并出现错误;
三、持久化的选择策略
- 如果允许部分数据丢失,可以选择RDB
- 如果需要尽量避免数据丢失,可以使用RDB+AOF的混合方式
- 如果需要在性能和丢失做一个中和,可以使用AOF的每秒刷盘一次的策略