什么是持久化?
利用永久性存储介质将数据进行保存,在特定的时间将保存的数据进行恢复的工作机制称为持久化。
为什么要持久化
防止数据的意外丢失,确保数据安全性
Redis是一款单线程、高性能的基于内存的非关系型数据库,常用来做分布式缓存。Redis的数据全部都是存储在内存里,如果服务器突然宕机,数据就会全部丢失。Redis有持久化机制来保证服务器宕机的情况下数据不丢失。
Redis有两种持久化的方式,RDB和AOF。
将当前数据状态进行保存,快照形式,存储数据结果,存储格式简单,关注点在数据(RDB)
将数据的操作过程进行保存,日志形式,存储操作过程,存储格式复杂,关注点在数据的操作过程(AOF)
当符合一定的条件的时候,redis会自动将内存中的所有数据生成一个副本并存储在硬盘上。这个过程被称为快照
【重点】
RDB | AOF(append only file) |
---|---|
原理是将Reids在内存中的数据库记录定时 dump到磁盘上的RDB持久化 | 原理是将Reids的操作日志以追加的方式写入文件 |
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储 | AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。 |
Redis会单独创建(fork)一个子进程来持久化,会先将内存中的数据写入一个临时文件中,待持久化过程结束了,再用临时文件把上次持久化的文件替换掉。整个过程中,主进程不需要进行任何IO操作,保证了主进程的性能。
fork的作用是复制一个与当前进程一样的进程。新进程为当前进程的子进程。子进程的数据和主进程一样,但是一个全新的进程。子进程读取内存中的数据,然后序列化到磁盘上。
redis.conf文件中的配置位置SNAPSHOTTING:
# save "" save 900 1 save 300 10 save 60 10000 复制代码
分别表示:“900秒内至少有一个key被改动、300秒内至少有10个key被改动、60秒内至少有10000个key被改动”时,触发一次RDB操作,自动保存数据集。
save “” 表示关闭RDB。
save或者是bgsave命令。
save命令会阻塞,生产环境慎重。
save指令的执行会阻塞当前Redis服务器,直到当前RDB过程完成为止,有可能会造成长时间阻塞,线上环境不建议使用。
bgsave是在后台异步进行快照保存,同时还可以响应客户端的请求。
如果服务器突然宕机,还未来得及持久化的数据将会丢失。如果对数据完整性要求较高,不建议采用这种方式。
由于是fork了一个与当前进程一样的进程,包含当前进程的所有数据,所以,内存中的数据增加了一倍,性能会有所影响。
AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行 AOF文件中命令达到恢复数据的目的。与RDB相比可以简单描述为改记录数据为记录数据产生的过程
AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式
原理
由于是fork了一个与当前进程一样的进程,包含当前进程的所有数据,所以,内存中的数据增加了一倍,性能会有所影响。
存在的问题:AOF文件是追加写入命令方式实现持久化,随着redis的持续使用,AOF文件会越来越大。
解决方法:AOF文件的rewrite。
AOF重写:随着命令不断写入AOF,文件会越来越大,为了解决这个问题,Redis引入了AOF重写机制压缩文件体积。AOF文件重 写是将Redis进程内的数据转化为写命令同步到新AOF文件的过程。简单说就是将对同一个数据的若干个条命令执行结 果转化成最终结果数据对应的指令进行记录。
Redis启动时会读取该文件重新构建数据,也就是将文件中保存的命令重新执行一遍,也就是重放。
rewirte原理:
AOF文件持续增长而过大时,会fork出一个新的进程来重写文件,创建出临时文件,将内存中的数据的set语句命令追加到临时文件中,然后用临时文件替换掉原来的aof文件。
rewirte没有读取原来的AOF文件。
优势
劣势
AOF | RDB | |
---|---|---|
优点 | 【1】AOF 可以更好的保护数据不丢失,一般 AOF 会每隔 1 秒,通过一个后台线程执行一次fsync操作,最多丢失 1 秒钟的数据 【2】AOF 日志文件以 append-only 模式写入,所以没有任何磁盘寻址的开销,写入性能非常高,而且文件不容易破损,即使文件尾部破损,也很容易修复。 【3】AOF 日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写. 【4】AOF 日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。 | 【1】RDB 会生成多个数据文件,每个数据文件都代表了某一个时刻中 redis 的数据,这种多个数据文件的方式,非常适合做冷备,可以将这种完整的数据文件发送到一些远程的安全存储上去 【2】RDB 对 redis 对外提供的读写服务,影响非常小,可以让 redis 保持高性能 【3】相对于 AOF 持久化机制来说,直接基于 RDB 数据文件来重启和恢复 redis 进程,更加快速。 |
缺点 | 【1】对于同一份数据来说,AOF 日志文件通常比 RDB 数据快照文件更大 【2】AOF 开启后,支持的写 QPS 会比 RDB 支持的写 QPS 低AOF 这种较为复杂的基于命令日志 / merge / 回放的方式,比基于 RDB 每次持久化一份完整的数据快照文件的方式 | 【1】如果想要在 redis 故障时,尽可能少的丢失数据,那么 RDB 没有 AOF 好 【2】RDB 每次在 fork 子进程来执行 RDB 快照数据文件生成的时候,如果数据文件特别大,可能会导致对客户端提供的服务暂停数毫秒,或者甚至数秒。 |