Redis学习——持久化技术

Redis学习——持久化技术

简要介绍Redis的两种持久化技术——AOF和RDB快照

RDB快照

概述: Redis DataBase通过创建内存快照的方式,将redis数据以二进制格式保存到磁盘中,形成一个时间点的备份

实现机制:

  • 在指定的时间间隔内检查是否满足触发条件,如果满足,则执行快照操作
  • 快照操作会将数据存储到一个RDB文件中(默认名为dump.rdb),存储的内存是某个时间点的数据状态
  • 触发方式:
    • 定时保存:通过配置文件中的save参数,指定触发条件(如“在多少s内有多少次写操作”)
    • 手动触发:使用save或者是bgsave命令
      • save会阻塞主线程进行保存
      • bgsave在创建异步子进程执行保存操作,主线程可以继续处理客户端请求
  • 相关文件:
    • 默认保存文件:dump.rdb
    • 可以通过配置文件redis.conf修改保存文件名及路径
  • 优点:
    • 文件体积小,适合用于全量备份
    • 恢复速度快,适合灾难恢复
  • 缺点:
    • 不能保存实时数据(数据可能因系统故障丢失)
    • 生成快照时可能占用较多资源(如CPU和内存)

写时复制技术(Copy-On-Write, COW):

在执行bgsave的过程中,redis仍然可以继续执行命令,也就是数据能够被修改。 如果redis没有执行修改数据的操作,那bgsave执行的子进程和父进程用的是同一个物理内存

如果redis执行了修改数据的操作,子进程就会从原来的使用的内存数据复制一份出来继续进行rdb快照,因此,rdb快照保存的是原来的数据。在执行bgsave的过程中,redis修改的数据并不在bgsave保存的范围内,只能等待下一次bgsave。

AOF持久化

概述: Append Only File是通过记录每次写操作的日志,将这些操作按顺序写入日志文件,确保数据可以完整恢复

实现机制:

  • Redis将每次写操作记录到AOF文件中(默认名为appendonly.aof
    • 注意:是命令执行成功后才写入文件中
  • AOF文件采用追加的方式,确保写操作是顺序的
  • 日志格式是Redis的协议格式,便于解析和重放
  • AOF文件会定期通过重写来压缩日志文件,避免日志文件过大
    • 原理是根据某个键值对的最新状态,用一条命令去记录这个键值对
    • 重写的时候先写入临时文件,成功后再覆盖原文件(防止失败污染原文件)
    • 在后台进行重写,同样使用了COW技术,并将在重写期间执行的命令追加到AOF缓冲区(写入旧aof文件的)和AOF重写缓冲区(等会追加到重写aof文件的),等待后台重写完毕,会通知主线程,然后主线程将AOF重写缓冲区中的所有内容追加到新的AOF文件中,保证新旧AOF文件所保存的数据库状态一致,然后新AOF覆盖旧AOF
  • 配置参数决定写入磁盘的同步策略:
    • always:每次写入操作立即同步(立即执行fsync函数),性能最低但数据最安全
    • everysec:每秒同步一次默认值,性能与安全性的折中(创建一个异步任务来执行fsync函数)
    • no:完全依赖操作系统决定何时同步,性能最高但数据可能丢失(永不执行fsync函数)

相关文件:

  • 默认保存文件:ppendonly.aof
  • 可通过配置文件redis.conf修改保存文件名及路径

优点:

  • 数据恢复更安全,可以记录每个写操作,最大限度减少数据丢失
  • 追加写操作性能较好

缺点:

  • 文件体积较大
  • 恢复速度比RDB满
  • 初始状态可能会占用更多的存储资源

RDB和AOF混合持久化

在配置文件中开启:

1
aof-use-rdb-preamble yes

混合持久化工作在AOF日志重写过程

在AOF重写日志时,fork出来的重写子线程会先将主线程共享的内存数据以RDB方式写入AOF文件,然后主线程处理的操作命令会被记录在重写缓冲区,以AOF方式写入到AOF文件,完成后主线程将含有RDB格式和AOF格式文件替换旧的AOF文件。

大Key对AOF日志的影响

对AOF日志的影响

只有always策略可能会阻塞主线程,所以如果写入的是一个大Key,阻塞的时间会比较久

对AOF重写和RDB的影响

如果大Key可能会很快触发AOF重写机制

然后执行AOF重写机制和RDB快照都需要fork主线程,这时候fork出来的也变可能会很大,因此会很耗时阻塞主线程

同时,如果发生了写时复制,需要复制物理内存,这个过程也会耗时阻塞主线程

建议:

  • 如果redis只是当作缓存,可以关闭AOF和AOF重写以及RDB,不关心数据安全性问题,可以提升性能
  • linux的hugepage机制也会影响redis性能,hugepage支持2MB/1GB等大小的内存,在发生COW后,redis也需要拷贝相应hugepage大小的内存

Redis学习——持久化技术
http://example.com/2024/12/13/Redis学习——持久化技术/
作者
凌云行者
发布于
2024年12月13日
许可协议