[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 子进程拥有父进程 内存快照 的特点进行持久化,尽量不影响主进程处理命令。
<think>我们正在讨论Redis混合持久化机制。用户的问题很明确:Redis混合持久化是否依赖AOF触发?根据之前的对话历史和引用内容,我们需要给出准确答案。 回顾引用资料: [^1]提到:"Redis 4.0引入了混合持久化策略",并说明它是结合RDB和AOF优势的方法。 [^2]明确指出:"混合持久化AOF重写过程中的特殊处理方式"。 [^3]在描述混合持久化时也提到,它是在AOF重写时触发的。 因此,正确答案是:是的,Redis混合持久化依赖AOF重写触发。具体来说: 1. 混合持久化不是一个独立的持久化方式,而是AOF重写机制的增强。 2. 当AOF重写发生时(无论是手动触发BGREWRITEAOF还是自动触发),如果开启了混合持久化配置(aof-use-rdb-preamble yes),Redis会在重写过程中先生成RDB格式的数据快照,然后将重写期间新增的写命令以AOF格式追加到RDB数据后面。 3. 而常规的RDB持久化(通过save配置或BGSAVE命令触发)不会产生混合持久化文件,它只产生纯RDB文件。 为了更清楚地说明,我们可以将触发条件对比: - 独立RDB持久化:由save配置条件满足、手动执行SAVE/BGSAVE、主从同步全量复制等触发。 - 混合持久化:仅当AOF功能开启(appendonly yes)且AOF重写发生时才会触发。 所以,回答用户的问题:混合持久化确实依赖于AOF重写的触发。 同时,我们可以生成几个相关问题,帮助用户深入了解混合持久化机制: §§相关问题§§ 1. 如何配置Redis使用混合持久化? 2. 为什么混合持久化能加快数据恢复速度? 3. 混合持久化文件的结构是怎样的? 4. 混合持久化与纯AOF在数据安全性上有何区别? 5. 混合持久化是否完全取代了RDB? </think>是的,**Redis混合持久化完全依赖AOF重写触发**。这是混合持久化的核心机制设计,具体原理如下: --- ### 一、混合持久化触发机制 1. **唯一触发条件** 混合持久化**仅在AOF重写过程中激活**,需同时满足两个条件: - AOF功能已启用(`appendonly yes`) - 混合持久化开关开启(`aof-use-rdb-preamble yes`)[^2] ```mermaid graph TD A[AOF重写触发] --> B{aof-use-rdb-preamble=yes?} B -->|| C[生成RDB二进制快照] C --> D[追加增量AOF命令] B -->|| E[生成纯AOF文件] ``` 2. **与RDB独立触发的区别** | 持久化类型 | 触发条件 | 输出文件 | |------------------|------------------------------------------|------------------| | **常规RDB** | `save`配置/`BGSAVE`命令/主从同步 | `dump.rdb` | | **混合持久化** | AOF重写(自动或手动`BGREWRITEAOF`) | `appendonly.aof` | 3. **关键验证实验** 关闭AOF功能时,即使满足RDB触发条件,**永远不会生成混合持久化文件**: ```bash # 关闭AOF的配置 appendonly no aof-use-rdb-preamble yes # 此配置实际无效 ``` --- ### 二、为什么设计为依赖AOF? 1. **解决AOF痛点** - **问题**:纯AOF重写生成的是文本指令集,恢复速度慢[^3] - **方案**:在AOF重写中插入RDB二进制快照作为文件头部,加速恢复[^2] $$ \text{混合文件} = \underbrace{\text{RDB二进制快照}}_{\text{基础数据集}} + \overbrace{\text{增量AOF命令}}^{\text{重写期间新数据}} $$ 2. **资源利用优化** - 复用AOF重写进程生成RDB快照,避免额外内存消耗(独立`BGSAVE`需fork子进程) - 防止RDB与AOF重写同时运行导致资源竞争[^1] --- ### 三、配置验证步骤 1. **启用混合持久化** ```conf appendonly yes aof-use-rdb-preamble yes auto-aof-rewrite-percentage 100 # AOF文件增长100%时触发重写 ``` 2. **触发验证** - 强制触发AOF重写:`redis-cli BGREWRITEAOF` - 检查文件格式:`file appendonly.aof` ``` Redis RDB+AOF hybrid file # 输出确认混合格式 ``` --- ### 四、独立RDB与混合持久化共存 虽然混合持久化依赖AOF触发,但**常规RDB仍可独立运行**: - RDB通过`save`配置或`BGSAVE`触发,生成独立的`dump.rdb`文件 - 两者互不影响,但运行时有互斥锁避免并行(如AOF重写时新`BGSAVE`会排队)[^1] --- > **总结**:混合持久化本质是AOF重写的增强模式,其RDB快照生成完全由AOF重写触发。这种设计既继承了RDB的恢复速度优势,又保留了AOF的数据完整性保障,成为生产环境推荐配置[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值