深入解析 Redis AOF 机制:持久化原理、重写优化与 COW 影响

ops/2025/2/6 18:22:54/

深入解析 Redis AOF 机制:持久化原理、重写优化与 COW 影响

    • 1. 引言
    • 2. AOF 机制详解
      • 2.1 AOF 解决了什么问题?
      • 2.2 AOF 写入机制
        • 2.2.1 AOF 的基本原理
        • 2.2.2 AOF 运行流程
        • 2.2.3 AOF 文件刷盘策略
    • 3. AOF 重写机制
      • 3.1 AOF 文件为什么会变大?
      • 3.2 解决方案:AOF 重写(Rewrite)
      • 3.3. AOF 重写机制详解
        • 3.3.1 AOF 重写触发条件
        • 3.3.3.2 AOF 重写的执行流程
        • 3.3.3.3 AOF 重写时如何同步新增写操作?
          • 3.3.3.3.1 AOF 重写缓冲区机制
          • 3.3.3.3.2 AOF 重写完成后的数据合并
    • 4. AOF 与写时复制(Copy-on-Write, COW)
    • 5. Redis 处理大规模数据写入的优化方案
      • 5.1 AOF 体积大于 64MB 时如何优化?
        • ✅ 方案 1:开启 AOF + RDB 混合模式
        • ✅ 方案 2:调整 AOF 重写策略
        • ✅ 方案 3:优化 `appendfsync` 方式
        • ✅ 方案 4:使用 `redis-cli --bigkeys` 找出大 Key
    • 6. AOF 重写过程中掉电,如何恢复?
    • 7. 总结

1. 引言

Redis 作为高性能的键值存储数据库,提供了两种主要的持久化机制:RDB(Redis Database File)AOF(Append-Only File)。其中,AOF 通过日志追加的方式记录写操作,以最大限度保证数据的可靠性,即使发生崩溃或掉电,也能恢复到最近的状态。

本篇博客将围绕 AOF 机制 进行深入分析,涵盖其原理、AOF 重写策略、写时复制(Copy-on-Write, COW)机制、Redis 大规模数据写入下的优化方案以及 AOF 在极端情况下的处理方式


2. AOF 机制详解

2.1 AOF 解决了什么问题?

如果 Redis 仅使用内存存储,一旦进程崩溃或服务器掉电,所有数据都会丢失。为了解决这个问题,Redis 提供了两种持久化方式:

  • RDB(快照存储):周期性将数据写入磁盘,可能丢失最近的写入
  • AOF(日志记录):通过 追加日志 记录每一个写入操作,提供更高的数据安全性

AOF 主要优势

  • 更高的数据持久化保证:即使 Redis 崩溃,AOF 也可以恢复最近的写入。
  • 支持不同的同步策略alwayseverysecno),平衡性能与数据安全性。
  • 支持 AOF 重写(Rewrite),优化日志文件体积,提高恢复效率。

2.2 AOF 写入机制

2.2.1 AOF 的基本原理

AOF(Append-Only File) 是 Redis 提供的持久化方式之一,它会记录所有写操作命令,并追加appendonly.aof 文件中。

2.2.2 AOF 运行流程

AOF 主要包含三个核心步骤:

  1. 命令追加(Append):所有写操作命令会以 Redis 协议格式追加到 AOF 缓冲区。
  2. 文件同步(fsync):根据配置,AOF 缓冲区会定期刷盘,确保数据持久化。
  3. AOF 载入(恢复数据):Redis 重启时,读取 AOF 文件并逐条执行命令,恢复数据状态。
2.2.3 AOF 文件刷盘策略

Redis 允许用户配置 appendfsync 参数,决定 AOF 何时刷盘:

  • always每次写入都立即 fsync,数据最安全但性能最差)。
  • everysec默认,每秒 fsync 一次,性能与安全性折中)。
  • no交由操作系统控制 fsync,掉电可能导致较多数据丢失)。

3. AOF 重写机制

3.1 AOF 文件为什么会变大?

由于 AOF 采用追加写策略,重复操作会导致文件体积不断膨胀:

redis">SET key1 100
INCR key1
INCR key1
INCR key1

最终 key1 的值为 103,但 AOF 记录了 4 条命令,这会导致:

  • AOF 文件占用过多磁盘空间
  • Redis 重启时恢复速度变慢,因为需要重放大量命令。

3.2 解决方案:AOF 重写(Rewrite)

AOF 重写可以压缩 AOF 文件大小,加快 Redis 启动速度,同时减少存储开销。

AOF 重写原理

  • Redis 并不会简单地裁剪 AOF 文件,而是生成一个新的 AOF 文件
  • 子进程扫描当前数据库状态,将数据转换为最小化的 Redis 命令,并写入新的 AOF 文件
  • 最终使用 rename() 原子替换旧 AOF,确保数据安全

3.3. AOF 重写机制详解

3.3.1 AOF 重写触发条件

AOF 重写可以手动触发,也可以自动触发:

  • 手动触发
    BGREWRITEAOF
    
  • 自动触发(通过 auto-aof-rewrite-percentage 配置):
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    
    当 AOF 文件大小比上次重写后增长 100% 并且至少达到 64MB,Redis 自动触发 AOF 重写。

3.3.3.2 AOF 重写的执行流程

(1)Redis fork 子进程执行 AOF 重写

  • 子进程扫描 Redis 当前内存数据,生成新的 AOF 文件(temp-rewriteaof.aof)。
  • 由于写时复制(COW) 机制,子进程与主进程共享内存,减少性能开销。

(2)主进程继续接收新的写操作

  • 主进程仍然写入旧 AOF 文件(避免数据丢失)。
  • 同时,新增的写入会暂存到 AOF 重写缓冲区(AOF rewrite buffer)

(3)AOF 重写完成后,合并新增数据

  • 主进程将 AOF 重写缓冲区的内容追加到新 AOF 文件,确保数据完整。

(4)使用 rename() 替换旧 AOF 文件

  • rename("temp-rewriteaof.aof", "appendonly.aof") 原子替换,确保不会出现数据不一致的情况。
  • 新 AOF 文件替换旧 AOF 文件,完成 AOF 重写。

3.3.3.3 AOF 重写时如何同步新增写操作?
3.3.3.3.1 AOF 重写缓冲区机制

在 AOF 重写过程中,主进程仍然可以接收新的写请求:

  1. 这些写请求会继续写入旧 AOF 文件(保证数据持久化)。
  2. 同时,这些写请求会存入 AOF 重写缓冲区(AOF rewrite buffer),等待 AOF 重写完成后追加到新 AOF 文件。
3.3.3.3.2 AOF 重写完成后的数据合并

当 AOF 重写完成后:

  • 主进程短暂暂停,将 AOF 重写缓冲区的数据追加到新 AOF
  • 最终用 rename() 替换旧 AOF,确保数据一致性。

4. AOF 与写时复制(Copy-on-Write, COW)

Redis 采用 写时复制(Copy-on-Write, COW) 机制,在 AOF 重写时避免阻塞主进程

  • Redis fork 出一个子进程 进行 AOF 重写,主进程仍然可以继续接收写请求
  • 子进程与主进程共享内存,但如果主进程修改数据,修改的页面会被复制,导致额外的内存开销
  • 大量写操作会导致 COW 频繁触发,造成内存占用短暂增加

优化方案

  • 降低 AOF 重写频率(调高 auto-aof-rewrite-percentage)。
  • 合理控制 AOF 体积(结合 RDB + AOF)。
  • 升级 Redis 7.0 及以上,使用 AOF + RDB 混合模式

5. Redis 处理大规模数据写入的优化方案

5.1 AOF 体积大于 64MB 时如何优化?

如果 AOF 重写后仍然大于 64MB,可以采取以下策略:

✅ 方案 1:开启 AOF + RDB 混合模式

Redis 7.0 之后,支持AOF + RDB 混合模式,大幅降低 AOF 体积:

aof-use-rdb-preamble yes

🔹 优势

  • AOF 头部使用 RDB 快照,减少冗余日志。
  • 加快 Redis 重启恢复速度
  • 降低磁盘占用

✅ 方案 2:调整 AOF 重写策略

如果 AOF 仍然过大,可以降低触发频率:

auto-aof-rewrite-percentage 50
auto-aof-rewrite-min-size 64mb

适用于:AOF 文件增长较快的场景,减少不必要的重写。


✅ 方案 3:优化 appendfsync 方式

如果 Redis 处理高并发写入,可修改 appendfsync

appendfsync no  # 让 OS 决定何时写入,降低磁盘 IO

适用于:吞吐量极高的写入场景,减少 fsync 负担。


rediscli_bigkeys__Key_157">✅ 方案 4:使用 redis-cli --bigkeys 找出大 Key

如果 AOF 仍然过大,可能是某些 Key 过大

redis-cli --bigkeys

🔹 优化

  • 使用 EXPIRE key seconds 设置自动过期
  • 减少 Key 数量,合并数据存储

6. AOF 重写过程中掉电,如何恢复?

  • AOF 重写是原子操作,如果发生掉电:
    • Redis 仍然使用旧 AOF 文件,数据不会丢失。
    • 新 AOF 文件未完成,不会被使用,保证一致性。

AOF 文件损坏自动修复

  • Redis 启动时会检查 AOF 是否损坏,并自动修复。
  • 可以手动执行:
    redis-check-aof --fix appendonly.aof
    

✅ 如何优化 AOF 以减少掉电风险?**

  • 使用 appendfsync everysec(默认),减少掉电数据丢失
  • 监控 AOF 重写频率,避免频繁触发
  • 定期检查 AOF 文件完整性
  • 使用 SSD 代替 HDD,提高 fsync 速度

7. 总结

  • AOF 主要用于 保证 Redis 数据持久化,避免数据丢失
  • AOF 重写(Rewrite) 机制减少文件体积,加快恢复速度。
  • 写时复制(COW) 影响 AOF 重写期间的内存使用。
  • 大规模数据写入下,优化 AOF 体积
    • 使用 AOF + RDB 混合模式
    • 调整 AOF 重写触发条件
    • 优化磁盘 IO,避免 AOF 过大

📌 最终建议:如果 Redis 版本 ≥ 7.0,推荐使用 AOF + RDB 混合模式,以获得最佳性能与数据可靠性


http://www.ppmy.cn/ops/156211.html

相关文章

CORS:跨域访问、如何在Nginx中配置允许跨域访问

跨域访问(Cross-Origin Resource Sharing, CORS)是浏览器安全策略的一部分,用于控制不同源(origin)之间的资源共享。当一个网页尝试从不同的源(协议、域名或端口中的任何一个不同)加载资源时&am…

吴恩达深度学习——有效运作神经网络

内容来自https://www.bilibili.com/video/BV1FT4y1E74V,仅为本人学习所用。 文章目录 训练集、验证集、测试集偏差、方差正则化正则化参数为什么正则化可以减少过拟合Dropout正则化Inverted Dropout其他的正则化方法数据增广Early stopping 归一化梯度消失与梯度爆…

【TensorFlow】T1:实现mnist手写数字识别

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 1、设置GPU import tensorflow as tf gpus tf.config.list_physical_devices("GPU")if gpus:gpu0 gpus[0]tf.config.experimental.set_memory_g…

牛客比赛贪心算法

题目如下 代码及解析如下 谢谢观看!!!

机器学习常用包numpy篇(四)函数运算

目录 前言 一、三角函数 二、双曲函数 三、数值修约 四、 求和、求积与差分 五、 指数与对数 六、算术运算 七、 矩阵与向量运算 八、代数运算 九、 其他数学工具 总结 前言 Python 的原生运算符可实现基础数学运算(加减乘除、取余、取整、幂运算&#…

Mac本地部署DeekSeek-R1下载太慢怎么办?

Ubuntu 24 本地安装DeekSeek-R1 在命令行先安装ollama curl -fsSL https://ollama.com/install.sh | sh 下载太慢,使用讯雷,mac版下载链接 https://ollama.com/download/Ollama-darwin.zip 进入网站 deepseek-r1:8b,看内存大小4G就8B模型 …

Python爬虫实战:一键采集电商数据,掌握市场动态!

电商数据分析是个香饽饽,可市面上的数据采集工具要不贵得吓人,要不就是各种广告弹窗。干脆自己动手写个爬虫,想抓啥抓啥,还能学点技术。今天咱聊聊怎么用Python写个简单的电商数据爬虫。 打好基础:搞定请求头 别看爬虫…

【3分钟极速部署】在本地快速部署deepseek

第一步,找到网站,下载: 首先找到Ollama , 根据自己的电脑下载对应的版本 。 我个人用的是Windows 我就先尝试用Windows版本了 ,文件不是很大,下载也比较的快 第二部就是安装了 : 安装完成后提示…