05 | 内存快照:宕机后,Redis如何实现快速恢复?

89 阅读3分钟

0.基本概念

  • AOF

    • 持久化到磁盘

    • 先操作后记录日志

    • 持久化有三种可选项 

      • 每次 
      • 每秒 
      • 跟随操作系统
    • 恢复数据时需要将日志回放(相对较慢)

    • 优化,AOF重写,缩小日志量

  • RDB\

    • 内存数据在某一刻的状态记录
    • 将内存状态写入磁盘文件中(相对较快)

1.给那些内存数据做快照

  • redis数据都在内存中,执行全量快照,并记录到磁盘中

  • 全量数据写入是个耗时操作,因此不应该阻塞在主线程上(阻塞操作主线程会影响效率)

  • 操作

    • save 在主线程执行,导致阻塞\

    • bgsave 创建一个子进程,住纳闷用于RDB文件,避免主线程阻塞(默认配置)

  • 在进行快照备份时,会不会影响到主线程操作

2.快照数据能修改吗

  • 一方面,主线程等待快照生成(不能接受)

  • 另一方面,只能读不能写(不能接受)

  • 操作系统提供的COW(Copy-On-Write,)(读写+快照)

    • bgsave 子进程是由主线程 fork 生成的,可以共享主线程的所有内存数据\

    • 取主线程的内存数据,并把它们写入 RDB 文件\

    • 拷贝快照,只需要读取拷贝数据即可\

\

3.快照间隔

  • 快照的间隔短,恢复就快

  • 如果设置的很短,频繁执行会造成开销

    • 全量数据写入磁盘,对磁盘压力较大,快照间在写磁盘时形成竞争关系
    • fork操作从主进程创建过程会造成主进程阻塞,主进程内存越大,阻塞时间越长(redis只允许一个bgsave子进程)
  • 增量快照

    • 做了一次全量快照后,后续的快照只记录修改的数据
    • 需要利用额外的元数据记录那些数据被修改了
    • 但是为了记住修改,引入额外的开销有点得不偿失
  • 快照恢复速度快很多,但是频率不好把握

  • Redis4.0中提出了一个混合使用AAOF日志和内存快照的方法

    • 内存快照按照一定频率操作
    • 两次快照间使用AOF日志记录所有命令操作
    • RDB+AOF

\

4.总结

  • RDB Redis 用于避免数据丢失的内存快照方法

    • 可以快速恢复数据库,也就是只需要把 RDB 文件直接读入内存,这就避免了 AOF 需要顺序、逐一重新执行操作命令带来的低效性能问题\

    • 但是,频繁快照仍然是不太能接受的\

    • 混合使用 RDB 和 AOF,正好可以取两者之长,避两者之短,以较小的性能开销保证数据可靠性和性能\

  • 一些tips

    • 数据不能丢失时,内存快照和 AOF 的混合使用是一个很好的选择;\

    • 如果允许分钟级别的数据丢失,可以只使用 RDB;\

    • 如果只用 AOF,优先使用 everysec 的配置选项,因为它在可靠性和性能之间取了一个平衡。