Redis中数据都保存在内存,但是内存中的数据变换很快,也很容易丢失,比如连接断开、宕机停机等等。而Redis提供的数据持久化机制有RDB(Redis DataBase)和AOF(Append Only File)。
1.RDB
RDB是指在指定的时间间隔内将内存中的数据集快照写入到磁盘中,也是默认的持久化的方式,利用数据快照,使用的是写时复制技术,将数据以二进制的格式保存在磁盘。
1.1触发快照的时机(save)
1.1.1手动触发
手动触发分别对应save和bgsave命令:
-
save命令:阻塞当前Redis服务,去做持久化操作,直到RDB持久化过程完成为止,不推荐使用。
-
bgsave命令:redis进程执行fork操作创建子进程,子进程负责RDB持久化,完成后子进程自动结束,而且原进程的阻塞只发生在fork阶段。
1.1.2自动触发
利用save进行相关配置,我们进入到redis.conf文件中,其中Save m n就表示若在m秒里面至少进行了n次数据更改时会自动执行bgsave。
我们将需要持久化的数据写入磁盘中保存,磁盘中的文件名为dump.rdb,和bin在同一个目录,redis启动时,就是读取dump.rdb文件将数据加载进内存中的。文件的名字可在redis.conf文件里面进行修改。
注意:
-
如果只开启了rdb,通过shutdown save命令断开Redis的连接时,也会自动执行bgsave。
-
在调试级别(debug)中重新启动Redis时,不会清空内存中的数据,这意味着原有的RDB文件仍然有效,即使未执行保存操作。
-
当Redis执行全量复制(主从复制)时,如果没有执行save或bgsave命令并且没有添加配置策略,主节点会自动生成RDB文件,并传输给从节点进行数据同步。
1.2RDB持久化和数据恢复的完整流程(bgsave)
当需要进行持久化时,Redis会单独创建一个子进程来完成持久化操作,这个子进程中所有的数据都和原进程保持一致,而且是一个全新的进程,也会占用内存,这个操作也称为Fork。
此时原进程不进行任何操作,由其子进程完成数据的持久化,子进程会先将快照数据写入到一个临时的文件,等到数据写完了之后,再用这个临时的文件直接替换磁盘上的dump.rdb文件即可。
但是缺点是如果子进程正在将数据写入临时文件,此时突然宕机,无法将临时文件替换dump.rdb,下次启动后,恢复后的内存数据较与宕机之前相比就会丢失一部分。
发现整个过程中,原进程是不进行任何IO操作的,这就确保了极高的性能。
1.3RDB方式的优劣分析
1.3.1优点
-
恢复数据速度快。
-
节省磁盘空间(二进制格式存储)。
1.3.2缺点
-
fork的时候,会占用内存空间。
-
可能会丢失数据,不适用于数据一致性高的场景。
2.AOF
以日志的形式来记录每个更改的操作,不会记录读的操作,只允许追加而不允许改写。在redis重启或启动之初会读取该文件然后重新构建Redis数据库的数据,这样也不用害怕内存数据的丢失了。
AOF方式Redis默认是不开启的,如果要开启则需要在配置文件中修改,若AOF和RDB同时开启,系统默认选择用AOF来恢复数据,AOF在磁盘中保存的日志文件是"appendonly.aof",文件的路径和RDB一致。
2.1AOF同步频率策略
-
appendsync always :表示每次的修改都会立刻记入磁盘日志文件,性能较差但是能保证数据的一致性。
-
appendsync everysec (默认) :每一秒执行一次数据同步,但可能会在临界点丢失数据。
-
appendfsync no:redis不主动进行同步,把同步时机交给操作系统。
2.2Rewrite压缩
因为AOF采用的是追加写入的方式,为了避免磁盘AOF文件越来越大,新增了重写机制,当文件默认达到128MB时,Redis就会自动进行AOF文件的内容压缩,保留能达到最终结果的最小指令集。
2.2.1重写的整体流程梳理(自动的)
-
主进程fork一个子进程去执行重写的操作,主进程正常运行不会阻塞。
-
主进程执行的写操作要同时写入AOF缓冲区和AOF_rewrite缓冲区,此时子进程遍历内存数据将自己压缩的指令集先存储到临时文件(新AOF文件),之后向主进程发送信号。
注意:这里AOF缓冲区是否要根据同步策略将数据同步到磁盘AOF文件中?
可以进行设置。如果同步,那么数据安全一致性,但是性能会比较低。如果不同步,若此时宕机,会造成数据丢失,但是性能比较高。
-
主进程把AOF_rewrite缓冲区中的数据写入到临时文件中。
-
使用临时文件(新AOF文件)覆盖旧的AOF文件,完成AOF重写。
2.3AOF持久化和数据恢复的完整流程
-
写操作命令先会被追加写入到AOF缓冲区内。
-
AOF缓冲区根据同步频率策略将缓冲区数据同步到磁盘AOF文件中。
-
看磁盘AOF文件大小是否超过阈值,判断要不要rewrite重写。
-
如果Redis宕机,重启服务时,会加载AOF文件来进行数据恢复。
2.4AOF文件出现损坏
如遇到AOF文件损坏,通过.........../bin/redis-check-aof--fix appendonly.aof进行恢复。恢复后重启Redis服务即可。
2.5AOF方式的优劣分析
2.4.1优点
-
备份机制更加的稳健,丢失数据概率更低。
-
可读的日志文件。
2.4.2缺点
-
相比RDB占用更多的磁盘空间。
-
恢复数据相比RDB更慢。
-
如果每次写操作都同步,对性能要求较高。
-
AOF文件可能出现损坏,需要手动修复。