Redis持久化机制

一,RDB

每隔一段时间,把内存中的数据写入磁盘的临时文件,作为快照,恢复的时候把快照文件读进内存。

  • 优势
  1. 每隔一段时间备份,全量备份
  2. 灾备简单,可以远程传输
  3. 子进程备份的时候,主进程不会有任何io操作(不会有写入修改或删除),保证备份数据的的完整性
  4. 相对AOF来说,当有更大文件的时候可以快速重启恢复
  • 劣势
  1. 发生故障是,有可能会丢失最后一次的备份数据
  2. 子进程所占用的内存比会和父进程一模一样,如会造成CPU负担
  3. 由于定时全量备份是重量级操作,所以对于实时备份,就无法处理了。

RDB持久化流程

5.jpg

在做RDB持久化时会fork一个子进程,会与主进程共享一块只读内存空间。
子进程在做数据镜像持久化时不会应该主进程继续接收请求。
当有新的写入命令发到主进程,会触发操作系统给一个copyonwrite操作,也就是只有父进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程

二,AOF

  • AOF特点
  1. 以日志的形式来记录用户请求的写操作。读操作不会记录,因为写操作才会存存储。
  2. 文件以追加的形式而不是修改的形式。
  3. redis的aof恢复其实就是把追加的文件从开始到结尾读取执行写操作。
  • 优势
  1. AOF更加耐用,可以以秒级别为单位备份,如果发生问题,也只会丢失最后一秒的数据,大大增加了可靠性和数据完整性。
  2. 以log日志形式追加,如果磁盘满了,会执行 redis-check-aof 工具
  3. 当数据太大的时候,redis可以在后台自动重写aof。当redis继续把日志追加到老的文件中去时,重写也是非常安全的,不会影响客户端。
  4. AOF 日志包含的所有写操作,会更加便于redis的解析恢复。
  • 劣势
  1. 相同的数据,同一份数据,AOF比RDB大
  2. 针对不同的同步机制,AOF会比RDB慢,因为AOF每秒都会备份做写操作,这样相对与RDB来说就略低。 每秒备份fsync没毛病,但是的每次写入就做一次备份fsync的话,那么redis的性能就会下降。
  3. AOF发生过bug,就是数据恢复的时候数据不完整,这样显得AOF会比较脆弱,容易出现bug,因为AOF没有RDB那么简单,但是AOF就不会根据旧的指令去重构,而是根据当时缓存中存在的数据指令去做重构,这样就更加健壮和可靠了
  • 配置不同的写日志策略:
    no:不同步
    everysec:每秒备份,推荐使用
    always:每次操作都会备份,安全并且数据完整,但是慢性能差

AOF写入流程:

  1. 命令会先写入一个AOF缓冲区
  2. 根据上面不同策略,将缓冲区同步到磁盘(默认每秒一次)
  3. 当AOF文件达到文件大小阈值会触发AOF文件重写,对AOF进行压缩(阈值可配置)。
    AOF文件重写就是把Redis进程内的数据转化为写命令同步到新的AOF文件。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容