这是《Redis设计与实现》系列的文章,系列导航:Redis设计与实现笔记
RDB 持久化功能所生成的 RDB 文件是一个经过压缩的二进制文件,通过该文件可以还原生成 RDB 文件时的数据库状态。
另外,由于AOF文件更新更频繁,所以:
优先使用AOF进行还原
只有AOF关闭时才会进行RDB备份
BGSAVE 虽然是非阻塞的,但是在进行时会拒绝掉 SAVE、BGSAVE命令,BGREWRITEAOF 会被推迟到执行完再执行。
而如果 BGREWRITEAOF 正在执行,则 BGSAVE 会被拒绝。
save 900 1 save 300 10
只要满足如下条件的一个,BGSAVE就会被执行:
上述的配置信息保存的结构如下图所示:1
另外,程序还需要记录对应这两个配置在数据库中对应的信息:
Redis服务器周期性操作函数 serverCron
默认每 100 毫秒执行一次,用于对正在运行的服务器进行维护,其中一项工作就是检查 save 选项保存的条件是否满足。
这里只给出了一个简单的关系图,如果想要了解具体的内容请阅读原书。
AOF 持久化是通过保存 Redis 服务器所执行的写命令来记录数据库的状态的。
三步骤:
aof_buf
缓冲区的末尾flushAppendOnlyFile
函数,考虑是否将上述缓冲区的内容写入和保存到 AOF 文件中写入和同步:
为了提高文件的写入效率,在现代操作系统中,当用户调用 write 函数时会先将数据保存在一个内存缓冲区里,等超过一定的时限或空间被填满再写入磁盘。
这样虽然提高了效率,但是可能会影响安全性。
为此,系统提供了
fsync
和fdatasync
可以强制让操作系统立刻同步到硬盘中。
appendfsync
参数配置:
(很直观的步骤)
为什么?
由于 AOF 时通过保存被执行的写命令来记录数据库状态的,所以随着服务器运行时间的流逝,AOF 文件的内容会越来越多,文件体积也会越来越大,需要加以控制,以免对 Redis 服务器、甚至整个宿主机造成影响。
怎么做?
BGREWRITEAOF
命令进行 AOF 重写。
重写的实现?
最简单的方法是通过分析 Redis 中的数据,然后生成相应的插入指令,而不是通过分析之前的命令来判断哪些可以被跳过。
后台重写
为了在重写过程中也能处理请求,可以采用后台重写的方式。当然在重写的过程中数据也可能发生变化,所以要设置一个 AOF 重写缓冲区。(类似主从复制时的操作)
当子进程完成 AOF 重写工作后,他会向父进程发送一个信号,父进程在接到该信号之后,就会调用一个信号处理函数(阻塞),并执行如下工作: