1. Redis内存快照RDB

Redis服务器宕机,可以使用AOF日志进行恢复,如果AOF日志过大,故障恢复时间过长,影响到Redis的正常使用。

这里我们讨论Redis的另外一种持久化方式,RDB快照,所谓内存快照,就是指内存中的数据在某一时间的状态记录。快照文件称为RDB文件(Redis DataBase)

与AOF的区别是,AOF记录的是操作命令,RDB记录的是某一时刻的数据,并不是操作,在做数据恢复时,可以直接将RDB文件读入内存,实现快速恢复。

关键问题:

  • 对哪些数据做快照,快照的执行效率。 全量快照,对所有数据做快照。
  • 做快照时,还能进行增删改查吗,关系到Redis是否阻塞,能否同时处理正常请求。

1.1. Redis如何生成RDB文件

  • save: 在主线程中执行,会导致阻塞。
  • bgsave: 创建一个子线程,专门用于写入RDB文件,避免阻塞主线程,Redis默认配置。

快照时数据能修改吗? 快照时数据能修改,Redis借助操作系统提供的写时复制技术(Copy-On-Write)在执行快照的同事,支持处理写操作 主线程在子线程执行RDB操作的时候修改了数据,会生成修改数据的副本,子线程读取副本写入RDB文件。

写时复制过程

1.2. Redis多久做一次快照

频繁的做全量快照,会带来两方面的开销,已方面,频繁将全量数据写入磁盘,给磁盘带来很大的压力,多个快照竞争有限的磁盘宽带,前一个快照还没做完,后一个又来了,容易造成恶心循环,另已方面,bgsave子线程需要通过fork操作从主线程创建出来, fork过程会造成主线程阻塞,频繁fork会阻塞主线程。

解决办法:做一次全量快照后,后续的快照只对修改的数据进行快照记录,我们只需要记住哪些数据被修改了。

到这里你可能发现了,虽然和AOF相比,快照的恢复速度快,但是快照的频率不好把握,如果频率过低,数据丢失会多,频率高的话又有额外开销。

1.3. 混合使用AOF日志和内存快照

内存快照以一定的评率执行,在两次快照之间,使用AOF日志记录这期间所有命令操作。

该方法的优点:

  • 快照不用频繁的执行,避免了频繁fork对主线程的影响。
  • AOF日志只记录两次快照之间的操作,不会出现AOF文件过大的情况,也避免了AOF重新带来的开销。

1.4. 小结

RDB文件的优势在于,可以快速恢复数据库,只需要把RDB文件直接读入内存,这样可以避免AOF需要顺序、逐一重新执行命令带来的低效性能问题。

使用AOF还是RDB快照?选型问题

  • 数据不能丢失,内存快照和AOF的混合使用是一个很好的选择
  • 如果允许分钟级别的数据丢失,可以只使用RDB
  • 如果只使用AOF,优先使用everysec的 配置选项,因为他在可靠性和性能直接取了一个平衡。

1.5. 总结

© gaohueric all right reserved,powered by Gitbook文件修订时间: 2021-12-08 23:22:22

results matching ""

    No results matching ""