• Redis 持久化 - RDB 与 AOF


    Redis 的数据是存储在内存当中, 因为服务器宕机、停电等情况, Redis 中的数据容易丢失。这时 Redis 持久化的作用就体现出来了。例: 可以用来完成数据恢复、故障恢复数据等。

    Redis 持久化分为三种策略机制: RDB(Redis DataBase)AOF(Append Only File)、两种方式混合持久化。


    本文简要的描述两种方式。 如需深层次的知识点, 恭请各位大佬进入高级区查阅。

    点我查看 - Redis 基本知识,快来回顾一下


    点我查看 - Redis 订阅与 Redis Stream 技术


    点我查看 - PHP 使用 PHPRedis 与 Predis

    一、RDB(Redis DataBase)

    RDB 是指周期性的将内存中的数据集快照写入磁盘文件。


    这种方式是也就是将内存中的数据以快照的方式写入二进制文件中, 默认的文件名为 dump.rdb, 在 Redis 重启时, 通过加载 dump.rdb 文件来恢复数据。


    1.1 RDB 的触发方式

    1.1.1 自动触发

    顾名思义, 自动触发是 Redis 在某个时间内, 自动执行持久化操作, 将数据进行备份。

    Redis 配置文件是 /usr/local/redis/bin/redis.conf

    • 这是我的 redis.conf 所在位置, 根据自己情况找到该文件

    • 打开后, 我的在 412 行开始是快照的配置

    • 我这里默认 RDB 持久化功能是关闭的, # save "", 我的在 424 行

    • dbfilename dump.rdb 文件名配置, 我的在 481 行

    • dir ./ 备份文件保存目录配置, 我的在 504 行

    • 默认都是注释着的, 如果要启用, 将行开头的 # 去掉

    # 配置格式: save m n [m n ...]
    # 解释: 在 m 秒内, 如果有 n 个键发生改变, 则自动触发持久化操作, 可配置多个条件
    
    # 例: save 3600 1 300 100 60 10000
    # 例解: 3600 秒内, 如果有 1 个键发生改变, 则自动触发持久化操作
    # 例解: 300 秒内, 如果有 100 个键发生改变, 则自动触发持久化操作
    # 例解: 60 秒内, 如果有 10000 个键发生改变, 则自动触发持久化操作
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.1.2 手动触发

    顾名思义, 手动触发就是通过 手动执行命令 来完成持久化操作。

    手动触发的命令有两个: save()bgsave(), 他们之间的主要区别在于是否会阻塞线程。

    SAVE 命令:

    • save() 命令触发 Redis 同步持久化。
    • 缺点: 会使 Redis 处于阻塞状态, 不能执行其他命令, 直到 RDB 持久化完成。
    • 优点: 虽然不会消耗额外的内存,但生产环境慎用

    BGSAVE 命令:


    bgsave() 会执行 fork 操作创建子进程, 持久化的工作由子进程完成, 整个过程只有在 fork 子进程的时候有短暂的阻塞, 当子进程被创建后, 就可以响应其他客户端的请求了。

    • bgsave() 命令触发 Redis 异步持久化。
    • 缺点: 创建子进程, 需要消耗更多内存。
    • 优点: 创建子进程后, 其他客户端还可以交互, 大多数情况采用bgsave()

    1.2 RDB 的优缺点

    1.2.1 RDB 优点

    • RDB 的持久化文件为二进制数据, 占用内存更小。
    • RDB 因为备份的是数据库的快照, 所以非常适合冷备份, 比如 凌晨1点的时候, 进行持久化操作。
    • 在面对大数据的情况下, RDB 备份与恢复速度比 AOF 快。

    1.2.2 RDB 缺点

    • RDB 是周期性进行备份, 如果发生意外情况, 且这段时间有数据交互, 就会丢失这段时间的数据。
    • 无法实现 实时持久化
    • 因为是全量备份, 且还经常创建子进程, 数据量大的话, 会长期消耗服务器CPU与内存。

    二、AOF(Append Only File)

    AOF 采用日志方式记录, 将执行完的命令、命令参数、参数个数等信息通过 write 函数追加到日志文件末尾。

    2.1 同步流程

    命令同步流程:

    • 将命令或参数等发送至 AOF 程序
    • AOF 程序收到后, 因为 Redis 是单线程, 通过 resp 协议, 将数据暂存到 AOF 缓冲区
    • 通过设置的同步策略, 将暂存区的命令同步追加到文件末尾

    2.2 同步策略

    # 同步策略由 appendfsync 参数决定, 我的在 1435 行开始
    # appendfsync always
    
    appendfsync everysec # 默认
    
    # appendfsync no
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • always

      AOF 缓冲区收到数据时, 立即调用 fsync 命令强制往 AOF 文件写数据

    • everysec

      AOF 缓冲区收到数据时, 调用 write 命令往 io 缓冲区写数据, 同时以每秒调用一次 fsync 命令, 强制将 io 缓冲区的数据写入 AOF 文件

    • no

      AOF 缓冲区收到数据时, 调用 write 命令往 io 缓冲区写数据, **当 io 缓冲区填满时或系统定期的将 io 缓冲区的数据写入 AOF 文件 **。


    2.3 AOF 重写

    随着执行命令越来越多, AOF 文件会越来越大, 可采用 AOF 重写机制 解决这一问题。


    重写会启用一个后台子进程 bgrewriteaof

    2.3.1 配置

    AOF 重写 是去除 AOF 文件中 无效的命令超时的数据 等或采用 命令合并 方式, 创建一个新的 AOF 文件来保存重写后的命令。

    no-appendfsync-on-rewrite no # 重写机制默认是关闭的, 如需开启, 请改为 yes , 我的在 1460 行
    
    • 1

    2.3.2 触发重写

    • 手动触发

      AOF 重写可以由用户通过调用 BGREWRITEAOF 命令手动触发。

    • 自动触发

      根据 auto-aof-rewrite-percentageauto-aof-rewrite-min-size 64mb 确定触发时机。

      # 我的在 1479 行
      auto-aof-rewrite-percentage 100 # 当前 AOF 文件大小(aof_current_size) 比 之前重写后的大小(aof_base_size) 至少大了 100%
      
      auto-aof-rewrite-min-size 64mb # AOF 体积大于 64mb 会触发重写
      
      • 1
      • 2
      • 3
      • 4

    2.4 开启 AOF

    默认 AOF 持久化功能是关闭的。

    Redis 配置文件是 /usr/local/redis/bin/redis.conf。打开后, 我的在 1359 行是配置的开始。

    appendonly yes # 开启, 改为 yes , 我的在 1379 行
    
    appendfilename "appendonly.aof" # 快照基本文件名
    
    appenddirname "appendonlydir" # 存储专用目录
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.5 AOF 的优缺点

    2.5.1 AOF 的优点

    • 可以更好的保护数据完整性, 比 RDB 更靠谱
    • 即使文件过大, 也可以采用 重写 方式, 不影响客户端

    2.5.2 AOF 的缺点

    • 因为同步策略, 一般情况下 AOF 的速度慢于 RDB
    • 即使一直在重写, 但文件体积还是要比 RDB 的二进制文件大
    • AOF 在恢复时, 会重演每条命令, 速度也比 RDB
    • 因体量较大, 恢复时, 可能存在写坏, 可通过对比两文件差异, 使用 redis-check-aof --fix AOF文件名 修复, diff -u 来对比文件的差异, 进而确定后再恢复。

    三、两者比较

    方式存储速度恢复速度数据完整性文件大小资源消耗
    RDB不可抗拒因素, 可能会丢失数据
    AOF依据同步策略,视情况而定, 可能会写坏

    根据业务场景选择合适的持久化方式, 默认 RDB


    • 如果业务场景主要充当缓存功能, 失效重新访问数据获取, 不怎么依赖持久化, 则选择 RDB
    • 如果数据需要持久保存, 确保数据的完整性, 则建议 RDBAOF 同时启用。

    点我查看 - Redis 基本知识,快来回顾一下


    点我查看 - Redis 订阅与 Redis Stream 技术


    点我查看 - PHP 使用 PHPRedis 与 Predis

  • 相关阅读:
    讲述CBO And Database Statistics
    Unity可视化Shader工具ASE介绍——8、UI类型的特效Shader编写
    华为机试:报文解压缩
    新恒盛110kV变电站智能辅助系统综合监控平台+道巡检机器人
    【编程题】【Scratch一级】2022.09 踢足球
    Android内核模块编译
    智能井盖传感器特点是什么?
    RXJava源码分析
    快速构建高质量中文APP登录注册页面Figma源文件
    服务器探针-serverstatus
  • 原文地址:https://blog.csdn.net/qq_35453862/article/details/126099727