2.1 KiB
一、介绍
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日志很小。