[Redis#15] 持久化 | AOF | rewrite | aof_buf | 混合持久化

目录

1 使用AOF

流程

问题一:父进程在fork之后继续写旧AOF文件的意义

问题二:执行BGREWRITEAOF时的特殊情况处理

2 命令写入

3 文件同步

4 重写机制

工作流程:

触发条件

混合持久化

持久化 sum


AOF(Append Only File)持久化

AOF持久化机制 以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中的命令达到恢复数据的目的。

AOF的主要作用是解决了数据持久化的 实时性 问题,目前已经是Redis持久化的主流方式。理解掌握好AOF持久化机制对我们兼顾数据安全性和性能非常有帮助。

1 使用AOF

AOF文件是一个文本文件,每次进行的操作都会被记录到这个文本文件中,通过一些特殊符号作为分隔符,来对命令的细节做出区分.

AOF一般默认是关闭状态,我们需要通过修改配置文件来开启AOF功能.重启Redis服务之后生效.

cd ect/redis nano redis.conf

文件名配置:通过appendfilename配置项(默认是appendonly.aof)来指定AOF文件名。

保存目录:与RDB持久化方式一致,通过dir配置指定。

重启后测试结果

可以查看到

流程

AOF重写机制涉及 创建一个子进程 来进行重写工作,而父进程继续处理客户端请求。具体步骤如下:

  • 子进程创建与数据获取
    • 父进程通过fork创建一个子进程。
    • 子进程不关心旧AOF文件内容,仅基于内存中的当前数据状态生成新的AOF文件。
  • 数据写入方式
    • 子进程以文本格式写入新AOF文件,类似于RDB快照生成但使用不同格式。
  • 父子进程协作
    • 父进程继续接收命令,并将这些命令 写入缓冲区以及旧的AOF文件中,确保即使重写失败也能保持数据完整性。
    • 在子进程完成新AOF文件的写入后,它会通知父进程。父进程随后将自fork以来收到的新命令从 aof_rewrite_buf缓冲区追加到新AOF文件中,然后替换旧文件。
问题一:父进程在fork之后继续写旧AOF文件的意义

问题描述:
在Redis中进行AOF(Append Only File)文件重写时,父进程在fork子进程之后,子进程开始写入新的AOF文件。随着时间推移,子进程很快会完成新AOF文件的写入。此时,父进程继续写入即将被替换的旧AOF文件是否还有必要?
回答:
有必要。我们需要考虑 极端情况,比如在AOF文件重写过程中,如果子进程或服务器意外挂掉,子进程的内存数据将丢失,导致新的AOF文件不完整。因此,父进程会继续写入旧的AOF文件,以确保数据的安全性。

问题二:执行BGREWRITEAOF时的特殊情况处理

问题描述:

  • 如果在执行BGREWRITEAOF命令时,Redis已经在进行AOF重写,会发生什么?
  • 如果在执行BGREWRITEAOF命令时,Redis正在生成RDB快照文件,会发生什么?

回答:

  • 如果Redis已经在进行AOF重写,那么执行BGREWRITEAOF命令时,不会再次进行AOF重写,系统会直接返回。
  • 如果Redis正在生成RDB快照文件,执行BGREWRITEAOF命令时,AOF重写操作会等待,直到RDB快照生成完成后,再进行AOF重写。

优先级
如果Redis上同时存在AOF文件和RDB快照的时候,此时以AOF文件为主,RDB直接被忽略.

过程复述:

在子进程创建时,它继承了父进程当前的内存状态,但不知道fork之后的新请求对内存的修改。为此,父进程准备了一个aof_rewrite_buf缓冲区,用于存储fork之后接收到的数据。子进程完成AOF数据写入后,会通过信号通知父进程,父进程再将aof_rewrite_buf缓冲区的内容写入新的AOF文件中,之后新的AOF文件就可以替代旧的AOF文件了。


2 命令写入

AOF命令写入的内容直接为文本协议格式。例如set hello world这条命令,在AOF缓冲区会追加如下文本:

*3\r\n$3\r\nset\r\n$5\r\nhello\r\n$5\r\nworld\r\n

Redis选择文本协议的原因包括兼容性、实现简单和具备可读性。使用aof_buf这个缓冲区, 使AOF机制在备份数据的时候, 不是直接让工作线程写入硬盘,而是先写入一个内存中的缓存区,积累一波之后,再统一写入硬盘.可以有效减少IO次数,并允许用户根据需求选择不同的同步策略,从而在性能和安全性之间做出平衡。


3 文件同步

AOF每次把新的操作写入到原有文件的末尾,属于顺序写入.而顺序写入的速度是比较快的.正是由于上面的两点,使得AOF虽然既要写内存又要写硬盘,但是他的效率没有降低多少.

但是如果把数据写在缓冲区的时候,本质上还是写在缓存中的,如果注解突然掉电或者进程崩溃,缓冲区的数据就会丢失.这时候,Redis就给出了一些同步硬盘中AOF文件的频率选项,也就是更新缓冲区数据的频率选项.

Redis提供了多种AOF缓冲区同步文件策略,由参数appendfsync控制:

可配置值

说明

always

命令写入aof_buf后立即调用fsync同步

everysec

每秒由后台线程调用fsync同步

no

不主动调用fsync,依赖操作系统

系统调用writefsync的区别在于,

write操作触发延迟写机制,而fsync强制同步到磁盘。

刷新频率越高,性能影响越大,同时数据的可靠性越高,刷新频率越低,性能影响越小,数据的可靠性越低.

  • always配置虽然最安全但性能差;
  • no配置提高了性能但增加了数据丢失的风险;
  • everysec是默认且推荐的配置,它能在数据安全性和性能间取得较好的平衡。

缓冲区刷新率也可以在配置文件中进行配置.具体的配置项是 appendfsync ,程序员可以根据自己的需要进行更改.

4 重写机制

随着AOF(Append Only File)文件体积的持续增长,文件会越来越大,这会影响到Redis下次启动时的启动时间。

  • 因为Redis在启动时需要读取AOF文件的内容,而AOF记录的是操作Redis的中间过程。
  • 实际上,Redis重启时关注的是 最终的数据状态。
  • 为了优化这一过程,AOF可以通过 剔除冗余操作和合并操作 来减少文件大小,这就是AOF的重写机制。

示例1

  • 原始操作:lpush key 111lpush key 222
  • 优化后:lpush key 111 222

示例2

  • 原始操作:set key 111set key 222
  • 优化后:只保留最后一个设置操作 set key 222
工作流程
  1. 命令写入(append):所有写入命令追加到aof_buf(缓冲区)中。
  2. 文件同步(sync):根据配置的策略向硬盘同步AOF缓冲区内容。
  3. 文件重写(rewrite):定期对AOF文件进行重写以压缩其体积。
  4. 重启加载(load):服务器启动时加载AOF文件恢复数据。

触发条件
  • 手动触发:可以调用bgrewriteaof指令来触发AOF重写。
  • 自动触发:依据配置参数auto-aof-rewrite-min-sizeauto-aof-rewrite-percentage确定自动触发时机,前者表示AOF文件相对于上次重写时 增加的比例,后者表示触发 重写的最小文件大小。
混合持久化

为了解决纯文本写入的成本问题,Redis引入了混合持久化模式,结合了RDB和AOF的优点。

通过配置项aof-use-rdb-preamble激活此功能后,Redis会在AOF重写时先以RDB二进制格式保存当前内存状态,之后的操作则继续以AOF文本格式追加到文件后面,重写时为 RDB 格式。

这种策略减少了写入成本,同时保持了AOF的实时性。

持久化 sum

  1. Redis提供了两种持久化方案:RDB和AOF。
  2. RDB视为内存快照,产生的内容紧凑,恢复速度快,但不适合实时持久化,通常用于冷备和主从复制。
  3. AOF视为修改命令的保存,并通过 重写机制定期压缩AOF文件。
  4. RDB和AOF都利用Linux 子进程拥有父进程 内存快照 的特点进行持久化,尽量不影响主进程处理命令。

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

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

相关文章

重生之我在异世界学智力题(1)

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言智力题题目:《奇怪的时钟…

【WRF后处理】WRF时区(UTC)需转化为北京时间(CST)!!!

目录 WRF运行时间标准注意事项-本地时区问题 输入数据:ERA5时间标准ERA5数据和WRF模型需要转换为北京时间!!!北京时间(CST)与协调世界时(UTC)的关系转换方法 参考 WRF运行时间标准 …

css怎么使页面高度占满屏幕?

下面是一个小程序的页面,用uniapp写的,现在有一个问题,就是最外层的allmy的图层,屏幕是灰色,我怎么才能使这个图层占满屏幕,就是让灰色占满屏幕。 直接先给page设置一个height:100%;然后allmy的height:100%…

K8S离线部署Nacos集群【Oracle作外部数据源】

一、前言 由于公司的要求下要使Nacos集群以Oracle作为外部数据源,前期咱们已经阐述了如何在本地搭建(Nacos集群搭建【Oracle作外部数据源】),本次将带领大家在k8s上部署Nacos集群并以Oracle作为外部数据源。 二、软件包 nacos-f…

Halcon 深度学习目标分类:原理与应用全解析

摘要: 本文深入探讨了 Halcon 在深度学习目标分类方面的原理及广泛的应用场景。详细阐述了从数据准备到模型训练与分类决策的目标分类工作流程,剖析了其背后的深度学习技术支撑。同时,结合多个行业领域,展示了 Halcon 目标分类技术…

【burp】burpsuite基础(五)

Burp Suite基础(五) 声明:该笔记为up主 泷羽的课程笔记,本节链接指路。 警告:本教程仅作学习用途,若有用于非法行为的,概不负责。 抓包方式 burp在抓包上十分全面,这里介绍几种抓包…

固态电池产业路径思考

《固态电池产业路径思考》主要探讨了固态电池的研究思路、解决方案、已取得的成果以及TC固态电池的介绍。以下是核心内容的整理: 一、固态电池优势 高比能耐高温易匹配高电压镍钴锰(NCM)正极和金属锂负极 二、固态电池关键共性问题 固态电…

第3章.垃圾收集器与内存分配策略

概述 对象已死 引用计数法 可达性分析算法 再谈引用 生存还是死亡 回收方法区 垃圾收集算法 分代收集理论 3种垃圾收集算法 HotSpot的算法细节实现 根节点枚举 安全点 安全区域 记忆集与卡表 写屏障 并发的可达性分析 误消亡问题 经典垃圾收集器 概述 简单的一些GC CMS G1 低延…

推动行业创新 猿辅导素养课斩获“2024影响力教育品牌”奖项

近日,由教育界网、校长邦联合主办,鲸媒体、职教共创会协办的“第9届榜样教育年度盛典”评奖结果揭晓。猿辅导素养课凭借在素养教育领域的卓越表现和深远影响力,荣获“2024影响力教育品牌”奖项。这一殊荣不仅肯定了猿辅导素养课在教学教研和产…

Vue工程化开发中各文件的作用

1.main.js文件 main.js文件的主要作用:导入App.vue,基于App.vue创建结构渲染index.html。

注解方式的AspectJ实现方式

BookService类 package com.hkd.service;public interface BookService {public void buyJava();public int comment();void buy(); }BookServiceImp类 package com.hkd.service;import org.springframework.stereotype.Component;Component("bs") public class Bo…

侦查与监测类吊舱应用场景!

一、军事领域 侦察与监视: 侦查与监测类吊舱能够全天候、全气候地提供高清图像数据,支持军事侦察和监视任务。 通过可见光相机和红外热成像仪的结合,吊舱可以在白天和夜晚、晴天和恶劣天气条件下,为无人机等空中平台提供清晰的…

(ICLR-2022)LoRA:大型语言模型的低秩自适应

LoRA:大型语言模型的低秩自适应 Paper是Microsoft Corporation发表在ICLR 2022的工作 Paper Title:LoRA: Low-Rank Adaptation of Large Language Models Code :地址 Abstract 自然语言处理的主导范式包括对通用领域数据进行大规模预训练&am…

linux上修改容器网卡docker0为固定ip

修改容器为固定ip段。 1.在一次项目中发现创建的容器网段跟办公室网段有冲突的,导致连接不上。修改容器ip为固定ip 这是默认启动docker自动创建的。172网段 2.修改前先停用运行容器 3.在配置路径下修改vim /etc/docker/daemon.json 4.重启docker systemctl re…

群硕融合医疗器械:打造智能治疗设备管理平台,全程护航精准手术

治疗成功率更高,患者更信任。 科技革命在医疗领域开花 在珠海航展上,一群灵活穿梭于复杂地形的机器狗吸引了人们的目光,它们仿佛是从科幻电影中走出的“未来战士”,展现了科技应用的无限潜力。 与此同时,医疗领域同…

成都栩熙酷网络科技抖音电商为您打造无忧购物体验

在这个信息爆炸的时代,电子商务的便捷性让越来越多的人选择在线购物。作为一家深耕西南地区的创新型科技企业,成都栩熙酷网络科技有限公司(以下简称“栩熙酷”)始终将用户的安全与满意度置于首位,致力于通过先进的技术…

细节之处见真章:移门缓冲支架的功能之美

细节之处见真章,这句话在移门缓冲支架的设计与应用中得到了完美的诠释。移门缓冲支架不仅仅是一个简单的五金件,它通过一系列精心设计的功能,确保了移门关闭过程中的平稳和安静,同时为家居环境增添了实用和美学价值。下面我们将深…

Hive 中 IP 字典的应用:让你的数据分析更加精准

​ 大家好!时隔一年,再次更新帖子,今天我们来探讨一个在大数据分析中非常实用的功能:在 Hive 中将连续的 IP 地址合并为一整条数据,作为字典使用。这项技术可以帮助我们减少数据量,提高数据处理效率&#x…

LCR 023. 相交链表

一.题目: LCR 023. 相交链表 - 力扣(LeetCode) 二.我的原始解法-无: 三.其他人的正确及好的解法,力扣解法参考: 哈希表法及双指针法:LCR 023. 相交链表 - 力扣(LeetCode&#xff0…

【spring cache】自定义redis缓存管理器自控key过期时间

目录 说明实现思路实现步骤创建项目添加依赖创建自定义缓存管理器定义redis配置redis 缓存值格式序列化redis 操作方法(可省略)使用 spring cache 缓存注解Cacheable说明参数value 或者 cacheNames描述类型示例 key描述类型示例 keyGenerator描述类型示例…