Redis的AOF持久化、重写机制、RDB持久化、混合持久化

1、AOF持久化

1.1.AOF持久化大致过程

概括:命令追加(append)、文件写入文件同步(sync)

Redis 每执行一条写操作命令,就把该命令以追加的方式写入到一个文件里,然后重启 Redis 的时候,先去读取这个文件里的命令,并且执行它,于是恢复了缓存数据。

分析:AOF持久化过程中先执行写操作命令后,再写日志好处和坏处。

好处:1.避免额外的检查开销。2.不会阻塞当前写操作命令的执行。

坏处:1.还未写入磁盘的这个数据就会有丢失的风险。2.可能会给「下一个」命令带来阻塞风险。(原因是因为将命令写入到日志的这个操作和执行命令都是在主进程。也就是说这两个操作是同步的。)

1.2.AOF文件里记录什么

1.3.三种写入磁盘的策略

写入磁盘的大致过程:

  • 每次写操作命令执行完后,会将命令追加到 server.aof_buf 缓冲区。

  • 然后通过 write() 系统调用,将 aof_buf 缓冲区的数据写入到 AOF 文件的内存缓冲区

  • 至于何时将内存缓冲区的数据写入磁盘,即.aof文件。由各自的策略决定。

补充:操作系统默认是等到缓冲区的空间被填满、或者超过了指定的时限之后, 才真正地将缓冲区中的数据写入到磁盘里面。这种做法虽然提高了效率, 但也为写入数据带来了安全问题, 因为如果计算机发生停机, 那么保存在内存缓冲区里面的写入数据将会丢失。因此系统提供了 fsync 和 fdatasync 两个同步函数, 它们可以强制让操作系统立即将缓冲区中的数据写入到硬盘里面, 从而确保写入数据的安全性。

1.3.1.Always

每次写操作命令执行完后,会将命令追加到 server.aof_buf 缓冲区。将 aof_buf 缓冲区中的所有内容写入到 AOF 文件, 并同步将 AOF 日志数据写入硬盘;

从安全性来说, always 也是最安全的, 因为即使出现故障停机, AOF 持久化也只会丢失一个事件循环中所产生的命令数据。

从效率上说,效率慢。因为写入磁盘的过程也是在主线程完成的。

1.3.2.Everysec

每次写操作命令执行完后,会将命令追加到 server.aof_buf 缓冲区。将 aof_buf 缓冲区中的所有内容写入到 AOF 文件, 并且每隔超过一秒就要在子线程中对 AOF 文件进行一次同步。

从效率上来讲, everysec 模式足够快, 并且就算出现故障停机, 数据库也只丢失一秒钟的命令数据。

1.3.3.No

每次写操作命令执行完后,会将命令追加到 server.aof_buf 缓冲区。将 aof_buf 缓冲区中的所有内容写入到 AOF 文件, 至于何时对 AOF 文件进行同步, 则由操作系统控制。

从效率上来讲,因为无须执行同步操作, 所以该模式下的 AOF 文件写入速度总是最快的。

1.4.AOF 重写机制

1.4.1.AOF 重写机制过程
  • 为了解决AOF文件过大的问题,于是引入AOF重写机制。

  • 重写机制是通过 fork 出一个子进程来完成的,子进程会扫描 Redis 的数据库,读取每个键的值,用一条命令代替原来的多条命令。然后写入到一个新的AOF文件中。

  • 在子进程进行 AOF 重写的过程中,主进程还会继续接收和处理客户端的请求,如果有新的写操作发生,主进程会将这些写操作追加到一个AOF重写缓冲区AOF缓冲区中。

  • 当子进程完成AOF重写工作之后,它会向父进程发送一个信号。

  • 父进程在接到该信号之后,会调用一个信号处理函数:将AOF重写缓冲区中的所有内容写入到新AOF文件中;新AOF文件代替现有的AOF文件。

  • 完成AOF后台重写。

1.4.2.何时会触发重写机制
  • AOF 重写机制可以由用户手动触发,也可以由系统自动触发 。

  • 用户手动触发 AOF 重写机制可以通过执行 BGREWRITEAOF 命令来实现 。

  • 系统自动触发 AOF 重写机制可以通过配置文件中的 auto-aof-rewrite-percentage 和 auto-aof-rewrite-min-size 参数来控制 。

  • auto-aof-rewrite-percentage 参数表示当当前 AOF 文件大小超过上次重写后 AOF 文件大小的百分比时,触发 AOF 重写机制,默认值为 100 。

  • auto-aof-rewrite-min-size 参数表示当当前 AOF 文件大小超过指定值时,才可能触发 AOF 重写机制,默认值为 64 MB 。

  • 系统自动触发 AOF 重写机制还需要满足以下条件 :

    • 当前没有正在执行 BGSAVE 或 BGREWRITEAOF 的子进程

    • 当前没有正在执行 SAVE 的主进程

1.4.3.补充的点
  1. aof_rewrite函数可以很好地完成创建一个新AOF文件的任务并进行大量的写入操作,所以调用这个函数的线程将被长时间阻塞,因为Redis服务器使用单个线程来处理命令请求,所以如果由服务器直接调用aof_rewrite函数的话,那么在重写AOF文件期间,服务期将无法处理客户端发来的命令请求。因此选择开启子进程进行AOF重写。

  2. fork的过程:把主进程的页表复制一份给子进程,而不会复制物理内存,此时主进程和子进程都共享物理内存。

  3. 当主进程修改内存页之前,会复制一个该页的副本,并将其分配给执行写操作的进程。而子进程仍然共享未修改的物理内存页。这个过程叫做写时复制

  1. 写入AOF缓冲区是为了对现有AOF文件的处理工作会如常进行。

  2. 在AOF重写过程中,只有fork页表、写时复制、信号处理函数会影响主线程。在其他时候,AOF 后台重写都不会阻塞主进程。

2、RDB持久化

2.1.RDB持久化过程

  • 执行savebgsave命令,生成RDB文件。save和bgsave区别在于是否在主线程生成RDB文件。

  • 执行 bgsave 命令的时候,会在子进程中生产RDB文件。通过 fork() 创建子进程,此时子进程和父进程是共享同一片物理内存。

  • 当主进程要进行写操作时,就会写时复制。而主线程刚修改的数据,是没办法在这一时间写入 RDB 文件的,RDB 文件保存的是原本的内存数据。只能交由下一次的 bgsave 生产RDB文件。

  • 服务器启动时就会自动执行RDB文件的加载。

2.2.何时进行RDB持久化

Redis 通过配置文件的选项来实现每隔一段时间自动执行一次 bgsave 命令,默认会提供以下配置:

save 900 1
save 300 10
save 60 10000

只要满足上面条件的任意一个,就会执行 bgsave,它们的意思分别是:

900 秒之内,对数据库进行了至少 1 次修改;

300 秒之内,对数据库进行了至少 10 次修改;

60 秒之内,对数据库进行了至少 10000 次修改。

以上分析,

RDB持久化和AOF持久化都有各自的优点:执行RDB文件数据恢复更快。而AOF文件能确保数据丢失少。毕竟人家是执行一条写操作就记录到AOF文件中。而RDB文件是隔一段时间才进行全量写入。

3、Redis 混合持久化

3.1.混合持久化过程

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

  • 在AOF重写过程中,fork出的子进程,以RDB的方式写入AOF文件中。

  • 期间主进程进行的写操作记录在AOF重写缓冲区中。当子进程执行重写完成后,父进程将AOF重写缓冲区中的所有内容写入以AOF方式写入AOF文件。

  • 这样,AOF 文件的前半部分是 RDB 格式的全量数据,后半部分是 AOF 格式的增量数据

  • 重启 Redis 加载数据的时候,由于前半部分是 RDB 内容,这样加载的时候速度会很快。

  • 混合持久化的优点是:

    • 可以减少 AOF 文件的大小,节省磁盘空间

    • 可以加快数据恢复的速度,避免执行大量的 AOF 命令

    • 可以避免数据丢失,因为 RDB 文件和 AOF 文件都有最新的数据快照

3.2.如何开启混合持久化

  • 要开启混合持久化,需要在 redis.conf 文件中设置以下参数:

    • appendonly yes 开启 AOF 持久化

    • aof-use-rdb-preamble yes 开启混合持久化

4、Redis的内存大key的对持久化的影响

  • 写入磁盘策略如果是Always,那么在调用fsync同步函数写入磁盘的时间就会变长,对主线程有一定的阻塞。

  • 在AOF重写过程、RDB持久化过程中,fork页表时、写时复制耗时都会变长,从而影响主线程。

 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于51单片机的电饭锅控制系统proteus仿真

地址: https://pan.baidu.com/s/1CGyg6uPhFI0MeaBWwe_HAg 提取码:1234 仿真图: 芯片/模块的特点: AT89C52/AT89C51简介: AT89C52/AT89C51是一款经典的8位单片机,是意法半导体(STMicroelectro…

basectf2024 pwn week2-[Week2] format_string_level0

知识点: 格式化字符串漏洞 因为是用的read,其实应该也可以构造shellcode,但是好像全开了 但是因为这道题,自己读取了flag 所以我们找到flag和buf差多少 发现ptr(存flag)和buf差2 我们去找到buf from pwn import * ioprocess("./pwn") #ioremote("challenge…

本地部署轻量级web开发框架Flask结合内网穿透公网环境访问管理界面

文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask,以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架,采用Python编程语…

破解信息架构实施的密码:常见挑战与最佳解决方案全指南

信息架构的成功实施是企业数字化转型的关键步骤,但在实际操作中,企业往往会遇到各种复杂的挑战。这些挑战包括 技术整合的难度、数据管理的复杂性、合规性要求的变化 以及 资源限制 等。《信息架构:商业智能&分析与元数据管理参考模型》为…

重生奇迹MU 浅析那些极具魔幻色彩的职业装备

沉稳厚重的剑士职业装备 剑士是所有喜欢近战作战方式的玩家首选的职业。作为来自勇者大陆的最强战士,剑士所穿戴的职业装备都偏向沉稳和厚重,通常全身覆盖重甲。这是因为剑士需要冲向敌人战斗,没有过硬的装备护身,他们很难承受住…

【油猴脚本】00006 案例 Tampermonkey油猴脚本自定义表格列名称,自定义表格表头,自定义表格的thead里的td

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【油…

多目标优化算法求解LSMOP(Large-Scale Multi-Objective Optimization Problem)测试集,MATLAB代码

LSMOP(Large-Scale Multi-Objective Optimization Problem)测试集是用于评估大规模多目标优化算法性能的一组标准测试问题。这些测试问题通常具有大量的决策变量和目标函数,旨在模拟现实世界中的复杂优化问题。 LSMOP测试集包含多个子问题&am…

C++基础面试题 | C++中的构造函数可以是虚函数吗? C++中的析构函数一定要是虚函数吗?

文章目录 问题一:在C中,构造函数不能是虚函数。问题二:析构函数不一定需要声明为虚函数,但在多态环境下,建议一定将其声明为虚函数。示例虚函数总结 问题一:在C中,构造函数不能是虚函数。 这是…

先框架后历元还是先历元后框架?

最近测绘同行高总发现了一个问题,《CH/T 2014-2016 大地测量控制点坐标转换技术规范》中”5.1.4.1 a) 不同ITRF间框架转换参数的历元归算“中历元不明确,不知是观测历元还是目标历元。他和一些同行用一些数据测试验证后认为观测历元更为贴合实际。 ​编…

不同博弈情景下策略选择的最优化探索

一:鹰鸽博弈 鹰鸽博弈是博弈论中的一个经典模型,以下是对鹰鸽博弈的具体介绍: 基本策略和行为模式: 鹰策略:代表着激进、好斗、具有攻击性的行为方式。在博弈中,选择鹰策略的个体在面对竞争或冲突时会全力…

“树”据结构:并查集从入门到AC

“树”据结构:并查集 前言算法设计代码示例优化相关文章 前言 在一组数据中,数据被分为了不同的集合,那么其中的集合往往可以用树形来表示。而区分集合,与查找集合的元素,就会成为核心的问题。并查集主要就是解决这类…

2024_中秋国庆双节来临 祝CSDN所有开发者与网站节日快乐

亲爱的CSDN朋友们: 在这个金风送爽、丹桂飘香的美好时节,我们迎来了一年一度的中秋佳节。明月高悬,洒下银辉,照亮了我们心中的思念与祝福。 中秋,是团圆的象征。无论你此刻身在何处,心中那份对家的眷恋、对…

0基础带你入门Linux之简介

1.Linux和Windows对比 Window很明显的特征就是有C盘、D盘登各种磁盘 我们通过点击不同的盘符,点击里面存储的文件进行查阅的操作 而Linux则很简单,只有一个根目录,也可以说只有一个盘,整个系统所有的东西都是在根目录下的 我们可…

redis基本数据结构-set

文章目录 1. set的基本介绍1.1. set底层结构之hash表的简单介绍1.2. 常用命令 2. 常见的业务场景2.1. 标签系统2.2. 社交网络好友关系 1. set的基本介绍 参考链接:https://mp.weixin.qq.com/s/srkd73bS2n3mjIADLVg72A redis 的 set 数据结构是一个无序的集合&#…

暴雨传染病智能监测预警前置一体机筑牢疾控第一道防线

自新冠疫情爆发以来,疾病防控已成为全球关注的焦点。只有加强监测预警、做到“早发现”才能及时防范和化解传染病疫情。近日,经国务院批准,国家疾控局、国家卫生健康委等九部门联合发布了《关于建立健全智慧化多点触发传染病监测预警体系的指…

信息安全数学基础(12)剩余类及完全剩余系

一、剩余类 定义:设 m 是一个正整数,a 是任意整数。模 m 的 a 的剩余类定义为集合 Ca​{c∣c∈Z,c≡a(modm)}。这个集合包含了所有模 m 余数为 a 的整数。 解释:剩余类实际上是将整数集 Z 分成了 m 个等价类,每个类中的元素在模 m…

大公司与小公司:产品经理的职业抉择与发展之路

在产品经理的职业旅程中,常常面临一个重要的抉择:是选择大公司还是小公司?这个问题困扰着许多初入职场的新人以及寻求职业转型的资深人士。今天,我们就来深入探讨一下大公司与小公司对于产品经理的不同意义,以及如何规…

互相关、相关系数和内积的关系

目录 问题互相关与卷积xcorr互相关xcorr2 2-D cross-correlationconv卷积conv2二维卷积关系与区别xcov互协方差 相关系数cov协方差与协方差矩阵corrcoef相关系数与相关系数矩阵图像均值、标准差和相关系数 内积与相似系数内积(Inner Product)欧几里得空间…

AUTOSAR_EXP_ARAComAPI的5章笔记(6)

返回目录 5.3.5.5 Event-Driven vs Polling-Based access ara::com实现完全支持事件驱动和轮询的方式来访问新数据。 对于轮询方式,典型的用例是,一个应用程序被周期性地触发并在特定的截止时间前进行一些处理。这是调节器/控制算法的典型模式 —— 循…

Visual Studio安装教程

这次我给大家讲一下Visual Studio安装 一、官网下载 官网下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/ 下载下来的是一个.exe文件 双击打开,出现下面的界面 二、安装visual studio (一)更改安装路径 首先&am…