RDB 相比于 AOF,数据恢复的速度更快,因为是二进制数据,直接加载进内存即可,但是 RDB 的频率不好把握。
- 如果频率太低,在两次快照期间服务器发生宕机,可能会丢失较多的数据
- 如果频率太高,频繁写入磁盘和创建子进程,会带来额外的性能开销
有没有什么方法,可以既有 RDB 快速恢复的优点,又有 AOF 丢失数据少的优点?
那就将 RDB 和 AOF 混合使用,这个方法是在 Redis 4.0 提出的,即混合使用 AOF 日志和内存快照,也叫混合持久化。
如果想要开启混合持久化功能,可以在 Redis 配置文件中将下面这个配置项设置成 yes。
aof-use-rdb-preamble yes
混合持久化工作在 AOF 日志重写期间。
- 当开启了混合持久化,在 AOF 重写日志时,fork 出来的重写子进程会先将与主进程共享的内存数据,以 RDB 的方式写入到 AOF 文件
- 然后主进程处理的操作命令,会被记录在重写缓冲区里,重写缓冲区里的增量命令会以 AOF 的方式写入到 AOF 文件
- 写入完成后,子进程通知主进程将新的含有 RDB 格式和 AOF 格式的 AOF 文件替换旧的 AOF 文件
简单来说,使用了混合持久化,AOF 文件的前半部分是 RDB 格式的全量数据,后半部分是 AOF 格式的增量数据。
这样做的好处在于,重启 Redis 加载数据时,由于前半部分是 RDB 格式,加载的时候速度会很快。
加载完 RDB 的内容后,才会加载后半部分的 AOF 的内容,这里的内容是 Redis 后台子进程重写 AOF 期间,主进程处理的操作命令,可以使得数据更少的丢失。