You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
|
# 一、介绍
|
|
|
|
|
redis的持久化机制有2种,第一种是快照,第二种是AOF日志。快照是一次全量备份,AOF日志是增量备份。
|
|
|
|
|
快照是内存数据的二进制序列化形式,在存储上非常紧凑;AOF日志记录的是内存数据修改的指令记录文本。AOF日志在长期的运行种会变得很大,如果重启时需要加载AOF日志重放,耗时很长,所以需要定期进行AOF重写,给日志瘦身。
|
|
|
|
|
# 二、实现原理
|
|
|
|
|
## 2.1 快照原理
|
|
|
|
|
由于redis是单线程程序,为了持久化时不阻塞服务,使用了多进程COW(copy on write)机制实现快照功能。
|
|
|
|
|
在持久化时会调用glibc的函数fork(fork/join机制)产生一个子进程,快照持久化完全由子进程处理,父进程继续处理客户端请求。
|
|
|
|
|
子进程刚刚产生时,它和父进程共享内存里面的代码和数据段。子进程做数据持久化,不会修改现有的内存数据结构,它只是对数据结构进行遍历读取,然后序列化写入磁盘,此时的父进程还在处理客户端请求,也就是说**同一时间,父子进程的数据是有差异的**。
|
|
|
|
|
COW机制进行数据段页面分离,当父进程对其中一个页面(page)的数据进行修改时,会将被共享的页面**复制**一份,然后父进程对这个复制的页修改。子进程相应的页是没有变化的,还是进程产生那一瞬间的数据。
|
|
|
|
|
## 2.2 AOF原理
|
|
|
|
|
AOF存储的是Redis服务器的顺序指令序列,AOF日志只记录对内存进行修改的指令记录
|
|
|
|
|
当收到客户端修改指令后,进行参数校验、逻辑处理,如果没问题就将该指令写入AOF日志(先执行指令再存盘)
|
|
|
|
|
# 三、如何使用
|
|
|
|
|
一般情况下不会单独使用上述两种方案,都是结合起来使用,称之为混合持久化。当重启时先加载快照内容,然后再重放增量AOF日志。
|
|
|
|
|
混合持久化中将快照(rdb)文件的内容和增量AOF日志文件存在一起,这里的AOF日志不再是全量的日志,而是自持久化开始到结束这段时间内发生的增量操作日志,所以这部分AOF日志很小。
|