RDB 就是 Redis DataBase,内存中的全量数据在某一个时刻的状态记录。
快照机制
引入原因
AOF日志进行故障恢复的时候,需要逐一执行操作日志。如果操作日志非常多,Redis 恢复得很慢,影响到正常使用。
bgsave命令
- 主进程fork出子进程,共享主线程的所有内存数据。
- 子进程读取主线程的内存数据,并把它们写入 RDB 文件。
- 借助了操作系统提供的写时复制技术(Copy-On-Write, COW),在执行快照的同时,正常处理写操作,避免了主线程的阻塞。
- 如果主线程要修改一块数据,这块数据就会被复制一份,生成数据副本。bgsave 子进程会把这个副本数据写入 RDB 文件。
增量快照
做了一次全量快照后,后续的快照只对修改的数据进行快照记录,避免每次全量快照的开销。
需要使用额外的元数据信息去记录哪些数据被修改了,这会带来额外的空间开销问题。
混用 AOF日志和RDB(Redis 4.0)
内存快照以一定的频率执行,在两次快照之间,使用 AOF 日志记录这期间的所有命令操作。
快照不用很频繁地执行,这就避免了频繁 fork 对主线程的影响。
AOF 日志也只用记录两次快照间的操作,不需要记录所有操作了,因此,就不会出现文件过大的情况了,也可以避免重写开销。
备份机制选择
数据不能丢失时,内存快照和 AOF 的混合使用;
如果允许分钟级别的数据丢失,只使用 RDB;
如果只用 AOF,优先使用 everysec 的配置选项,因为它在可靠性和性能之间取了一个平衡。