Redis的数据持久化介绍
1. RDB
1.1 RDB介绍
- RDB:Redis Database
- 在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的snapshot快照,它恢复时是将快照文件直接读到内存中。
- Redis会单独创建(fork)一个子进程进行持久化,会先将数据写到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能。如果需要进行大规模的数据恢复,且对于数据恢复的完整性不是非常敏感,按RDB发方法要比AOF方式更加高效.
- RDB的缺点:最后一次持久化的数据可能丢失。
1.2 Fork
- Fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等),数值都和原进程一直,但是是一个全新的进程,并作为原进程的子进程。
1.3 配置文件
1 | ################################ SNAPSHOTTING ################################ |
1.4 如何触发RDB快照
- (1)配置文件中save设置
- (2)使用命令
save
或bgsave
save
:只管保存,保存是全部阻塞,等保存完后才能重新使用bgsave
:Redis会在后台异步进行快照操作
- (3)执行flushall命令,但没有意义,数据被清空了
1.5 数据恢复
- 将备份文件移动的redis安装目录,并启动服务器即可
1.6 优势
- 适合大规模的数据恢复
- 对数据完整性和一致性要求不高
1.7 劣势
- 在一定时间间隔做一次备份,所以如果Redis以外关闭掉的话,就会丢失最后一次快照后的所有修改
- Frok的时候,内存中的数量被克隆了一份,大致2倍的膨胀性需要考虑
2. AOF
2.1 AOF介绍
- AOF:Append Only File
- AOF以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加维诺健但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
2.2 配置文件
1 | ############################## APPEND ONLY MODE ############################### |
2.3 RDB与AOP
- RDB与AOF可以同时存在,启动服务器的时候优先使用AOF,一旦AOF出现问题,服务器启动失败。
- 通过使用
redis-check-aof --fix appendonly.aof
,对AOF进行修复
2.4 重写
- AOF采用文件追加方式,文件会越来越大,为了避免此种情况,新增了重写机制
- 当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。可以使用命令
bgwriteaof
手动启动内容压缩功能
- 重写原理:
- AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后在rename),遍历新进程的内存中数据,每条记录有一条Set语句。重写aof文件的操作,并没有读取就的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件。
- 触发机制:
- Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小时上次rewrite后大小的一倍且文件大于64M时触发
2.5 优势
- 可以灵活配置AOF的备份策略,可以每秒同步,每次修改同步,不同步
2.6 劣势
- 相同数据集的数据而言,aof文件要远大于rdb文件,恢复速度慢于rdb
- aof运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb一样
3. 总结
- RDB持久化方式能在指定的时间间隔对你的数据进行快照存储
- AOF持久化方式记录每次对服务器的写操作,当服务器重启时会重新执行这些命令来恢复原始数据,AOF命令以Redis协议追加保存每次写的操作到文件末尾
- Redis还支持AOF文件进行后台重写,使得AOF文件的体积不至于过大
- 只做缓存:如果只希望你的数据在服务器运行的时候存在,可以不适用任何的持久化方式
- 同时开始两种持久化:
- 重启Redis时会优先载入AOF文件来恢复原始的数据,因为RDB不同时,所以导致只会寻找AOF文件
- 但是不建议只使用AOF,RDB更合适备份数据库,并且留着作为一个万一的手段
- 性能建议
- RDB文件只用作后备用途,建议只保留15分钟内修改1次的备份条件即可
- AOF好处在与最恶劣情况只丢失2秒的数据,但带来了持续的IO。而且AOF最后会需要重写,重写会造成一定的阻塞。建议AOF重写的基础大小设置为5G以上。
- 后面会有Master-Slave Replication来代替AOF,可以省掉一大笔IO。代价是如果Master/Slave同时挂掉,会丢失十几分钟的数据。