Redis持久化之☞AOF、AOF是怎样执行持久化的?

AOF持久化机制:

AOF(Append Of File):将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些指令从前到后重复执行一遍,就可以实现数据恢复了。

以独立日志的方式记录每次写命令,重启时候重新执行AOF文件中的命令达到恢复数据的目的。AOF的主要作用是解决了持久化的实时性。

开启方式:

        开启AOF功能需要设置配置:appendonly yes ,默认不开启。

        AOF文件名通过appendfilename配置设置,默认文件名是appendonly.aof        

        保存AOF文件的路径和RDB持久化一致,通过dir配置指定。

AOF持久化不断优化的过程:【先看这个流程!!】

大家都知道,redis也是基于命令式的,每天的工作就是响应业务程序员发来的命令请求,学着mysql的样子,把执行的所有写入命令都记录下来,专门写入了一个文件,并给这种持久化的方式取了一个名字,叫做AOF。

但是现在应该多久写一次文件呢?肯定不能每执行一条写入命令就记录到文件中,那会严重拖垮redis的性能。所有就有一个缓冲区,然后把要记录的命令先临时保存在这里,然后再找时机写入文件,这个临时的缓冲区就叫做aof_buf。但是随着时间的推移,这个AOF的备份文件越来越大,不仅非常占用硬盘的空间,就连加载的时候也非常耗时。

那就得想办法将文件给压缩一下,这个过程就叫做AOF重写,如果瘦身的途径是去除冗余,那样的工作量实在是太大了。原来记录一条条指令的方式太笨了,数据改来改去,有很多中间状态都没有用,直接把最终的数据状态记录下来就好了,和RDB的方式一样,fork出一个子进程来做这件事。

!子进程再重写期间,我要是修改了数据,就会出现和重写的内容不一致的问题,需要把这个漏洞给补上,所以就出现了AOF重写缓冲区 aof_rewrite_buf,从创建重写子进程的那一刻起,就把后面来的写入命令也copy一份写到这个从写缓冲区中,等到子进程重写文件结束之后,再把这个重写缓冲区中的命令写入到aof的文件中,最后再重命名新的文件,替换掉原来的文件。

AOF写入策略和AOF同步策略:

写入策略:

写入策略主要是讲如何将数据写入到AOF文件中。主要是通过“write”系统调用来实现的。写入策略决定了Reids在执行写操作时,如何将这些操作记录追加到AOF文件中。

同步策略:

同步策略说的是何时从缓存中同步到物理磁盘。主要是通过“fsync”系统调用来实现的。同步策略决定了Redis何时调用“fsync”来确保数据持久化到硬盘。

同步策略的三种模式:

 redis提供了几种不同的AOF同步策略,通过配置“appendfsync”选项来控制“write”和“fsync”调用的频率

【appendfsync 配置在redis.window.conf文件中】

1、always:每次写操作以后就立即调用“fsync”

2、everysec(这个是默认配置的):每秒调用一次“fsync“

3、no:不主动调用”fsync“,让操作系统自己决定何时将数据从页缓存写入磁盘

AOF写入和同步过程中的内核页缓存

1、写入过程(write系统调用):

        当redis将'aof_buf'的数据通过'write'系统调用写入到AOF文件中是,这些数据会先进入操作系统的内核页缓存。此时数据还没有实际写入磁盘。

2、同步过程(fsync系统调用):

        根据AOF同步策略(’always‘、’everysec‘、’no‘),reids会调用’fsync‘系统调用,将内核缓存中的数据写入到磁盘。’fsync‘确保数据从内核页缓存写入到物理磁盘,实现持久化。

具体流程:

1、当执行一个写操作(SET key value)的时候,写操作的命令会被记录。

2、写操作命令被追加到Redis内部的'aof_buf'缓冲区中。

3、Redis通过'write'系统调用将‘aof_buf’中的数据写入到AOF文件。

        数据此时被写入操作系统的内核页缓存,而不是立即写入磁盘

4、数据暂时存储在操作系统的内核页缓存中,此时数据还未持久化到磁盘。

5、根据AOF同步的策略,Redis会在合适的时机(例如每秒一次或者每次的写操作后)调用'fsync'系统调用。

        ’fysnc‘确保内核页缓存中的数据被写强制写入到磁盘中。

6、最终,数据从内核页缓存被写入到物理磁盘,确保数据持久化。

AOF重写流程:

1、执行AOF重写请求,如果当前进程在执行AOF重写,请求不执行并返回如下响应:{ ERR Background append only file rewriting already in progress }

        如果当前进程正在执行bgsave操作,重写命令延迟到bgsave完成之后在执行,返回如下的响应:{ Background append only file rewriting scheduled }

2、父进程执行frok创建子进程,开销等同于bgsave过程。

3、主进程fork操作完成后,继续响应其他命令。所有修改命令依然写入AOF缓冲区并根据appendfsync策略同步到硬盘,保证原有AOF机制的正确性。

        由于fork操作运用写时复制技术,子进程只能共享fork操作时的内部数据。由于父进程依然相应名命令,Redis使用“AOF重写缓冲区”保存这部分新数据,防止新AOF文件生成期间丢失这部分数据。

4、子进程根据内存快照,按照命令合并规则写入到新的AOF文件。每次批量写入硬盘的数据量由配置aof-rewrite-incremental-fsync控制,默认为32MB,防止单次刷盘数据过多造成硬盘阻塞。

5、新的AOF文件写入完成后,子进程发送信号给父进程,父进程更新统计信息,具体见info persistence 下的aof_* 相关统计父进程把AOF重写缓冲区的数据写入到新的AOF文件使用新AOF文件替换老文件,完成AOF重写。

总结一下流程:

1、父进程启动重写操作

2、父进程通过' fork ' 创建子进程

3、子进程在独立的缓冲区中重写AOF文件

4、子进程重写完后通知父进程

5、父进程合并增量数据并替换旧的AOF文件

AOF的优缺点:

AOF的优点:

数据保证:我们可以设置fsync策略,一般默认是Every,也可以设置每次写入追加,所以即使服务死掉了,也最多丢失一秒数据。

自动缩小:当AOF文件大小到达一定程度的时候,后台自动的去执行AOF重写,此过程不会影响主进程,重写完成后,新的写入将会写到新的AOF中,旧的就会被删除掉。但是此条如果拿出来对比RDB的话还是没有必要算成优点,只是官网显示成优点而已。

AOF的缺点:

性能相对较差:它的操作模式决定了他会对Redis的性能有所损耗。(主线程写文档)

体积相对更大:尽管是将AOF文件重写了,但是毕竟是操作过程和操作结果仍然由很大的区别,体积也毋庸置疑的更大。

恢复速度更慢:因为要重新加载每条命令的执行,恢复速度比较慢。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

本特利330878-90-00前置传感器在PLC系统中的应用与优势

本特利330878-90-00前置传感器在PLC系统中的应用与优势 一、引言 在现代工业自动化领域中,传感器作为信息获取的重要工具,其性能的稳定性和准确性直接影响到整个系统的运行效率。其中,本特利330878-90-00前置传感器以其卓越的性能和广泛的应…

查看主机的php参数short_open_tag 是否为 on

我想要查看主机的php参数short_open_tag 是否为 on,由于我使用的是Hostease的Linux虚拟主机产品,在cPanel面板中并没有找到这个参数选项,因此无法查看。这边联系了Hostease技术支持了解,可以通过以下方式进行查看。 1.先登陆cPane…

自定义横向思维导图,横向组织架构图,横向树图。可以自定义节点颜色,样式,还可以导出为图片

最近公司设计要求根据目录结构,横向展示。所以做了一个横向的思维导图,横向的树结构,横向的组织架构图,可以自定义节点颜色,样式,还可以导出为图片 话不多说,直接上图片,这个就是一…

nssctf(Web刷题)

[SWPUCTF 2021 新生赛]gift_F12 打开题目是一个时间页面,不过看了一会儿发现没有什么用 直接F12打开网页源代码 CtrlF搜索flag 找到了flag NSSCTF{We1c0me_t0_WLLMCTF_Th1s_1s_th3_G1ft} [第五空间 2021]签到题 NSSCTF{welcometo5space} [SWPUCTF 2021 新生赛…

cPanel中如何为数据库添加用户权限

本周有一个客户,购买Hostease的主机,询问我们的在线客服,他的网站安装后再还是无法访问。 客户购买的是Linux虚拟主机,带cPanel面板的。网站访问有如下数据库连接错误: 随后检查发现客户创建的数据库没有添加数据库用户权限。 下面…

期权策略交易怎么做?怎么选择期权策略?

今天期权懂带你了解期权策略交易怎么做?怎么选择期权策略?期权交易是一种金融衍生品交易方式,它给予购买者在未来特定时间内以特定价格购买(或出售)标的资产的权利。 期权策略交易怎么做? 配对看跌期权&am…

基于地理坐标的高阶几何编辑工具算法(3)——相离面吸附

文章目录 工具步骤应用场景算法输入算法输出算法示意图算法原理 工具步骤 点击面,点击“相离面吸附”工具,绘制一个面,双击结束后,与所有相交的面进行吸附 应用场景 为了让相离的两个几何面在空间上相邻,使用该工具…

llama_factory的使用

1.git clone llama_factory到本地 2.记得安环境,在clone后 3.多显卡要设置一下 4.数据文件放在data里面,仿照模板里的格式 5.进入llama_factory微调页面 python src/webui.py 6.llama_factory介绍:10分钟打造你个人专属的语言大模型&am…

离散数学--图论

目录 1.简单概念 2.握手定理 3.点割集 4.边割集 5.点连通度和边连通度 6.Dijstra算法&&最短路径 7.有向图的连通性 8.图的矩阵表示 9.欧拉图问题 10.哈密尔顿图 1.简单概念 (1)这个里面的完全图比较重要,完全图是例如k3,k5这…

GPT-SoVITS语音克隆部署与使用

GPT-SoVITS是一款强大的少量样本语音转换与语音合成开源工具。当前,GPT-SoVITS实现了如下几个方面的功能: 由参考音频的情感、音色、语速控制合成音频的情感、音色、语速可以少量语音微调训练,也可不训练直接推理可以跨语种生成,…

00-Vue的介绍和vue-cli

前言Vue的介绍和vue-cli一、发展历史相关网址介绍Vue框架的特点 二、Vue 的环境搭建1,卸载掉所有已经存在的所有Node.js版本2,下载MVM包4、安装node.js5、常见的插件 三、利用 vue-cli 新建一个空的项目1、官方代码参考2、安装 vue-cli(命令行…

【C++】学习笔记——map和set

文章目录 十五、map和set1. 关联式容器2. set的介绍3. set的使用4. multiset5. map的介绍6. map的使用7. multimap8. map中重载的operator[] 未完待续 十五、map和set 1. 关联式容器 我们已经接触过STL中的部分容器,比如:vector 、list 、deque 等&…

04. Redis 配置文件

文章目录 单位包含网络 NETWORK通用 GENERAL快照 SNAPSHOTTING主从复制 REPLICATION安全 SECURITY客户端 CLIENTS内存设置 MEMORY MANAGEMENTAPPEND ONLY MODE 模式(aof 的配置) 单位 配置文件对大小写不敏感(unit单位)。 包含 …

通过域名接口申请免费的ssl多域名证书

来此加密已顺利接入阿里云的域名接口,用户只需一键调用,便可轻松完成域名验证,从而更高效地申请证书。接下来,让我们详细解读一下整个操作过程。 来此加密官网 免费申请SSL证书 免费SSL多域名证书,泛域名证书。 首先&a…

K8S认证|CKA题库+答案| 2. 查看Pod CPU资源使用量

2、查看集群中运行Pod CPU资源使用量 您必须在以下Cluster/Node上完成此考题: Cluster Master node Worker node k8s …

『Apisix安全篇』快速掌握APISIX Basic-Auth插件高效使用

📣读完这篇文章里你能收获到 👨‍💻 学习如何快速安装并配置APISIX Basic-Auth插件,为您的API安全保驾护航。🛠️ 文章详细介绍了如何创建带有basic-auth配置的Consumer,以及如何在Route中启用该插件。&am…

爱校对:智能校对,让文字更专业

交互未来(北京)科技有限公司,源自清华大学计算机智能人机交互实验室,致力于通过高科技手段提升用户体验,实现“科技让生活更美好”的宗旨。我们的产品——爱校对,正是这种创新精神的结晶,旨在为…

怎样策划一场价值百万的营销活动?

策划一场活动听起来是不是就有点头大? 别急,其实只要掌握了活动策划的精髓,一步步来,从构思到实施,整个过程都能游刃有余。 一、定下目标: 咱们先得搞清楚,这场活动到底是为了啥。是想提升品…

代码随想录-Day17

110. 平衡二叉树 这道题中的平衡二叉树的定义是:二叉树的每个节点的左右子树的高度差的绝对值不超过 111,则二叉树是平衡二叉树。根据定义,一棵二叉树是平衡二叉树,当且仅当其所有子树也都是平衡二叉树,因此可以使用递…

四天学会JS高阶(学好vue的关键)——构造函数数据常用函数(理论+实战)(第二天)

一、对象创建引发构造函数产生 1.1 创建对象三种方式: 利用对象字面量创建对象 const obj {name: 佩奇}注:对象字面量的由来:即它是直接由字面形式(由源代码直接)创建出来的对象,而不是通过构造函数或者…