什么是 AOF 重写?AOF 重写机制的流程是什么?

引言:在Redis中,持久化是确保数据持久性和可恢复性的重要机制之一。除了常见的RDB(Redis Database)持久化方式外,AOF(Append Only File)也是一种常用的持久化方式。AOF持久化通过记录Redis服务器执行的写命令来实现数据的持久化。本文将探讨AOF重写机制的原理、实现方式以及其在Redis持久化中的作用,以帮助读者更好地理解和利用Redis中的AOF持久化机制。

题目

什么是 AOF 重写?AOF 重写机制的流程是什么?

推荐解析

什么是 AOF 重写?

AOF (Append Only File)是 Redis 持久化的一种方式,其通过记录 Redis 执行的每一条命令,重启之后通过重新执行 Redis 中的命令来恢复数据。

不过,随着 Redis 执行命令的不断增多,AOF 文件越来越大,但是很多数据其是不一定都是有意义的,比如原来 set age 10,后面又来个 set age 18,然后又来个 set age 30,我们这个时候就会发现,只有最后一个 age 是有意义的,前面都是没有用的。

AOF 重写就是指通过当前状态,重新生成最新的 AOF 操作命令记录的过程。

AOF 的重写流程?

AOF 文件的重写流程主要就一句话,“一次拷贝,两处日志”。

  • 一次拷贝:重写发生的时候,主进程会 fork 出一个子进程,然后子进程与主进程共享 Redis 物理内存,让子进程将这些 Redis 数据写入重写日志。
  • 两处日志:重写发生的时候,我们需要注意 AOF 缓冲和 AOF 重写缓冲;当数据进行重写的时候,如果此时有新的写入命令执行,会由主进程分别写入 AOF 缓冲和 AOF 重写缓冲;AOF 缓冲用于保证此时即使发生宕机了,原来的 AOF 日志也是完整的,可以用于恢复。AOF 重写缓冲用于保证新的 AOF 文件也不会丢失最新的写入操作。

AOF 的重写流程大致就是这样了,相信到这里大家只要熟读八股文,那肯定是没有任何问题的,接下里面试官肯定会问那有什么办法可以优化呢?一般人都会回答 RDB + AOF 的混合持久化,90 % 的人都会这样回答,但是这样的回答面试官听太多了,那有什么办法可以优化一下呢?必须有的,接下来就是我们今天文章的主角 Multi Part AOF

原有 AOF 重写的弊端

我们先来分析一下原先的方案,其流程图主要如下所示:

这个弊端主要有 3 个方面的内容,在这里我总结一下:

​ 1)内存开销: 在进行 AOF 重写的时候,AOF 缓冲与 AOF 重写缓冲区中的内容是一致的,这样就代表一样的内容得写两遍,带来了不必要的内存开销;

​ 2)磁盘开销:在重写的时候,AOF 缓冲区需要刷盘旧的日志文件到新的 AOF 日志,而 AOF 重写缓冲区的内容需要绕过一段很长的链路写入到新的 AOF 日志,两份的数据明明是一样的,但是却需要磁盘两次写入,这也带来了不必要的磁盘开销;

​ 3)CPU 开销: 在进行 AOF 重写的时候,主进程需要将新写入的数据写入到 AOF 重写缓冲区当中,主进程还需要通过管道将 AOF 重写缓冲区的的数据发送给子进程,然后子进程还需要将这些数据写入到新的日志文件。由于 Redis 的读写操作单线程的,这些操作都是串行执行的,所以会带来不必要的 CPU 开销。

在这个过程中,我们会发现两个核心点:

​ 1)AOF 重写缓冲区和 AOF 缓冲区内的数据是一样的;

​ 2)父子进程之间传输数据这个操作耗时太久了;

以下是 Redis 的官方文档,我们会发现 7.0 之前就是我们所说的点,既然官方都说这个是 Redis 7.0 之前了,那 Redis 7.0 之后发生了什么呢,接下来让我们来探究一下今天的主角 MP-AOF

Multi Part AOF

千呼万唤始出来,Multi Part AOF 出来了,以下是官方文档对他的一端描述

Since Redis 7.0.0, when an AOF rewrite is scheduled, the Redis parent process opens a new incremental AOF file to continue writing. The child process executes the rewrite logic and generates a new base AOF. Redis will use a temporary manifest file to track the newly generated base file and incremental file. When they are ready, Redis will perform an atomic replacement operation to make this temporary manifest file take effect. In order to avoid the problem of creating many incremental files in case of repeated failures and retries of an AOF rewrite, Redis introduces an AOF rewrite limiting mechanism to ensure that failed AOF rewrites are retried at a slower and slower rate.

官方文档地址:https://redis.io/topics/persistence

你会发现他说的全是英文,其实核心已经藏在他的名字里了 Multi Part AOF, 即将原来一个 AOF 文件拆分成多个 AOF 文件,在 Multi Part AOF 中,文件被分成 3 种类型,分别如下:

  • Base: 表示基于 AOF 文件,记录了基本的命令,一般由子进程通过重写产生,只有一个。
  • Incr:表示增量 AOF 文件,记录了重写过程中新增的操作指令,一般会在 AOF 重写开始执行时被创建,该文件可能存在多个。
  • History:表示历史 AOF 文件,他主要由 Base 和 Infr 变化而来,每次 AOF 重写完成后,本次 AOF 重写之前对应的 Base 和 Incr 的 AOF 文件都会变成 Histroy,History 类型的 AOF 会被 Redis 自动删除。

然后为了管理 AOF 文件,我们引入了一个 mainfest(清单)文件来跟踪和管理这些 AOF。于此同时,为了方便 AOF 备份和拷贝,我们将所有的 AOF 文件和 mainfest 文件放到一个单独的目录文件目中,目录文件名由 appenddirname配置(Redis 7.0新增配置项)决定。

下图是 Multi Part AOF 的流程:

从图中我们可以看到,现在重写阶段,只需要在主进程中将新请求数据写到 AOF 缓存中就可以了,然后 AOF 缓冲区的文件最后形成 Incr AOF 日志的内容,然后在子进程中,根据数据库 fork 的数据,生成一个 Base AOF 文件,两者合一构成 Redis 的全部数据。

然后在 AOF 重写结束后,主进程会更新 mainifest 文件的内容,将新生成的 Base AOF 文件和 Incr AOF 文件的内容加入,并且将之前的 Base AOF 文件和 Incr AOF 文件标记为 Histroy,然后等待 Redis 异步删除。

到此为止,我们会发现一件事,现在的 AOF 重写有了很大的改进:

  1. 在 AOF 重写期间不需要 AOF 重写缓冲区了
  2. 然后也不需要父子进程通过管道进行数据传输

从一定程度上减缓了 CPU、内存、磁盘的性能损耗,也降低了 Redis 的代码复杂度。

总结

原有的 AOF 重写由于引入了 AOF 重写缓冲区以及父子进程通信,导致了 Redis CPU、磁盘、内存的性能损耗,Redis 7.0 引入了 MP-AOF 的方案进行优化,到这里为止,各位以后说 AOF 持久化优化的时候又多了一个装逼的点,直接和面试官说我看过 Redis 的官方文档,这样不就加大分了嘛,好了,到这里就结束了,小伙伴们赶紧学起来吧。

其他补充

鱼聪明 AI 的回答:

鱼聪明 AI 地址:https://www.yucongming.com/

Redis 提供了两种主要的持久化机制,分别是 RDB(Redis DataBase)和 AOF(Append Only File)。这两种机制可以确保 Redis 服务器在重启时能够恢复数据,但它们的工作原理和恢复流程略有不同。

RDB 持久化

RDB 是 Redis 的一种快照持久化方式,它可以将 Redis 内存中的数据保存到硬盘上的一个文件中。RDB 的恢复流程如下:

  1. 生成 RDB 文件
    • Redis 服务器根据设定的策略(如定期快照或手动触发)生成 RDB 文件。
    • 在生成 RDB 文件期间,Redis 会阻塞所有客户端请求,以确保数据的一致性和完整性。
  2. 保存 RDB 文件
    • 一旦生成完毕,RDB 文件会被保存到硬盘上指定的位置。这个位置可以在 Redis 配置文件中进行配置。
  3. 恢复过程
    • 当 Redis 服务器重启时,它会尝试加载最近保存的 RDB 文件。
    • 如果 RDB 文件存在且没有损坏,Redis 会从中读取数据并加载到内存中,完成恢复过程。
    • 一旦加载完成,Redis 就可以继续接受客户端请求。

AOF 持久化

AOF 是一种基于日志的持久化方式,它通过记录 Redis 服务器接收到的每个写操作来实现数据持久化。AOF 的恢复流程如下:

  1. AOF 文件
    • Redis 将每个写操作追加到 AOF 文件的末尾。AOF 文件包含一个完整的操作日志,描述了服务器执行的所有写操作。
  2. 重放 AOF 文件
    • 当 Redis 服务器重启时,它会尝试通过重放 AOF 文件中的写操作来重建数据集的状态。
    • Redis 服务器会按照 AOF 文件中写操作的顺序,逐条执行这些操作,将数据集恢复到重启前的状态。
  3. AOF 文件的持久化
    • Redis 提供了不同的 AOF 持久化策略,可以通过配置文件设置:
      • appendfsync always:每次写操作都会同步到 AOF 文件,这是最安全的方式,但也最慢。
      • appendfsync everysec:每秒同步一次,提供了很好的性能和持久性的折中。
      • appendfsync no:完全依赖于操作系统的 fsync。这种方式速度最快,但数据可能会有一定的丢失风险。

恢复机制对比

  • RDB 恢复:由于 RDB 是一个快照文件,恢复速度相对较快,但是可能会丢失最后一次快照后的修改。
  • AOF 恢复:AOF 通过重放操作日志来恢复数据,因此通常情况下能够保证数据更为完整,但可能会因为重放时间较长而导致恢复速度较慢。

选择 RDB 还是 AOF 作为持久化方式,通常取决于对数据完整性、恢复速度以及系统性能的不同要求。在生产环境中,通常会根据实际需求和配置选择合适的持久化方式或者两者结合使用。

欢迎交流

本文主要介绍什么是 AOF 重写,以及 AOF 重写的流程和原有低版本下 Redis 重写的弊端,以及高版本后升级的 Multi Part AOF,在文末还有三个问题,欢迎小伙伴在评论区留言,近期面试鸭小程序已全面上线,想要刷题的小伙伴可以积极参与!

1)AOF 重写的触发条件是什么?

2)AOF 重写如何实现压缩和优化?

3)AOF 重写的影响和性能考量是什么?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/345074.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Django 和 MQTT 构建实时数据传输应用

文章目录 什么是 MQTT?Django 中的 MQTT结论 在现代的 Web 应用程序开发中,实时数据传输变得越来越重要。MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息传输协议,而 Django 是一个流行的 Pyt…

【Linux】进程5——进程优先级

1.进程优先级 1.1.什么是进程优先级 cpu资源分配的先后顺序,就是指进程的优先权(priority)。优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。还可以把进程运行到指定的CPU上&#x…

高考之后第一张大流量卡应该怎么选?

高考之后第一张大流量卡应该怎么选? 高考结束后,选择一张合适的大流量卡对于准大学生来说非常重要,因为假期期间流量的使用可能会暴增。需要综合考虑多个因素,以确保选到最适合自己需求、性价比较高且稳定的套餐。以下是一些建议…

二次规划问题(Quadratic Programming, QP)原理例子

二次规划(Quadratic Programming, QP) 二次规划(Quadratic Programming, QP)是优化问题中的一个重要类别,它涉及目标函数为二次函数并且线性约束条件的优化问题。二次规划在控制系统、金融优化、机器学习等领域有广泛应用。下面详细介绍二次规划问题的原理和求解过程 二…

Nginx的https功能和防盗链

目录 一.HTTPS功能简介 二.https自签名证书 三.防盗链 一.HTTPS功能简介 Web网站的登录页面都是使用https加密传输的,加密数据以保障数据的安全,HTTPS能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安…

postgresql根据某个字段去重获取整行数据

背景:在一些情况下我们需要对数据进行去重统计,group by就行,但是一些特殊情况下我们要根据某个字段去重之后获取非聚合字段的值,这个时候在mysql非严格模式下可以直接执行,但是在严格模式和postgresql里面是直接报错的…

蓝桥杯--跑步计划

问题描述 小蓝计划在某天的日期中出现 11 时跑 55 千米,否则只跑 11 千米。注意日期中出现 11 不仅指年月日也指星期。 请问按照小蓝的计划,20232023 年小蓝总共会跑步锻炼多少千米?例如,55 月 11 日、11 月 1313 日、1111 月 55 日、44 月…

使用 Scapy 库编写 TCP RST 攻击脚本

一、介绍 TCP RST攻击是一种拒绝服务攻击(Denial-of-Service, DoS)类型,攻击者通过伪造TCP重置(RST)包,中断目标主机与其他主机之间的TCP连接。该攻击利用了TCP协议中的重置机制,强制关闭合法的…

数据结构:旋转数组

方法1 &#xff08;三次逆置法&#xff09;&#xff1a; void reverse(int* nums, int start, int end) {while (start < end) {int temp nums[start];nums[start] nums[end];nums[end] temp;start;end--;} }void rotate(int* nums, int numsSize, int k) {k k % numsS…

Android14 WMS-窗口绘制之relayoutWindow流程(一)-Client端

Android14 WMS-窗口添加流程(一)-Client端-CSDN博客 Android14 WMS-窗口添加流程(二)-Server端-CSDN博客 经过上述两个流程后&#xff0c;窗口的信息都已经传入了WMS端。 1. ViewRootImpl#setView 在窗口添加流程(一)中&#xff0c;有这个方法&#xff1a; http://aospxref…

Threejs加载DOM+CSS到场景中,实现3D场景展示2D平面的效果

1. 前言 本篇文章主要实现了将DOM元素转换为Threejs可以使用的数据结构,使用CSS2DRenderer渲染器渲染这些DOMCSS的平面,使其可以作为一个物体添加到Threejs场景里 如下效果图: 2. 实现步骤 首先创建一个ThreejsVueVite的项目,作为本次的demo项目下载Threejs第三方库 yarn…

初识 peerDependencies

目录 初步认识 peerDependencies semver 介绍 # 摘要 # 简介 # 语义化版本控制规范&#xff08;SemVer&#xff09; # 合法语义化版本的巴科斯范式语法 # 为什么要使用语义化的版本控制&#xff1f; # FAQ 示例讲解&#xff1a;vue-router 插件 # 说明 声明 验证 初…

Hive知识体系保姆级教程

一. Hive概览 1.1 hive的简介 Hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张数据库表&#xff0c;并提供类SQL查询功能。 其本质是将SQL转换为MapReduce/Spark的任务进行运算&#xff0c;底层由HDFS来提供数据的存储&#xff0c;说白了h…

野火FPGA跟练(四)——串口RS232、亚稳态

目录 简介接口与引脚通信协议亚稳态RS232接收模块模块框图时序波形RTL 代码易错点Testbench 代码仿真 RS232发送模块模块框图时序波形RTL 代码Testbench 代码仿真 简介 UART&#xff1a;Universal Asynchronous Receiver/Transmitter&#xff0c;异步串行通信接口。发送数据时…

python机器人编程@我从0开始搭建了一个色块自动抓取机器人,并实现了大模型的接入和语音控制——(上基础篇)

目录 1、前言2、仿真环境的搭建3、仿真环境资源链接4、总结1、前言 在现代社会中,机器人技术正变得越来越普遍和重要。机器人的自动化能力使其能够在许多不同的领域发挥作用,例如生产线、医疗保健和家庭助理等。本系列将着重介绍如何搭建一个自动色块抓取机器人。 首先,我…

四种跨域解决方案

文章目录 1.引出跨域1.基本介绍2.具体演示1.启动之前学习过的springboot-furn项目2.浏览器直接访问 [localhost:8081/furns](http://localhost:8081/furns) 可以显示信息3.启动前端项目&#xff0c;取消请求拦截器&#xff0c;这样设置&#xff0c;就会出现跨域4.跨域原因 2.跨…

【小白专用24.6.8】C# 异步任务Task和异步方法async/await详解

一、什么是异步 同步和异步主要用于修饰方法。当一个方法被调用时&#xff0c;调用者需要等待该方法执行完毕并返回才能继续执行&#xff0c;我们称这个方法是同步方法&#xff1b;当一个方法被调用时立即返回&#xff0c;并获取一个线程执行该方法内部的业务&#xff0c;调用…

电脑缺失msvcp110.dll文件的解决方法,总结5种靠谱的方法

在计算机使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“找不到msvcp110.dll”。这个错误提示通常出现在运行某些软件时&#xff0c;那么&#xff0c;它究竟会造成哪些问题呢&#xff1f; 一&#xff0c;msvcp110.dll文件概述 msvcp110.dll是Mic…

实验八、地址解析协议《计算机网络》

水逆退散&#xff0c;学业进步&#xff0c;祝我们都好&#xff0c;不止在夏天。 目录 一、实验目的 二、实验内容 &#xff08;1&#xff09;预备知识 &#xff08;2&#xff09;实验步骤 三、实验小结 一、实验目的 完成本练习之后&#xff0c;您应该能够确定给定 IP 地…

WEB-Wordlist-Generator:为扫描后的Web应用生成相关联的字典

关于WEB-Wordlist-Generator WEB-Wordlist-Generator是一款功能强大的字典生成工具&#xff0c;该工具旨在帮助广大研究人员扫描目标Web应用程序并生成与之相关联的字典文件&#xff0c;从而允许我们对相关的网络威胁行为执行预备性应对策略。 功能介绍 当前版本的WEB-Wordli…