AOF&RDB

序言

主要用于查看不同备份模式可以调优的一些方式.

  • RDB: Redis服务器在规定时间内将内存中的数据保存到指定路径的文件中,服务器重启的时候直接将RDB文件读取到内存中
  • AOF:Redis服务器以日志的形式追加所有的REDIS操作,服务器重启的时候读取AOF文件依次执行一遍.

关于RDB最主要的问题是在备份的时候.RDB备份需要fork一个线程处理,所当处理大批量的备份的时候会影响Redis服务的效率.而AOF是可以支持大批量的命令最佳且不影响Redis服务的效率cuiyoanan2000@163.com.

因为AOF文件会不断地增大.难免有命令记录不完整.以及命令沉余.所以提供能录入如下的功能:

  1. 支持redis-check-aof来进行日志修复
  2. 支持根据相关配置rewrite相关的aof文件.

RDB

RDB是Redis默认的备份方式.具体相关配置如下:


# RDB文件的名称
dbfilename dump.rdb

# 备份RDB和AOF文件存放路径
dir /usr/local/var/db/redis/

关于RDB的备份频率的调整如下:

save 900 1              #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。

save 300 10            #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。

save 60 10000        #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。

##当snapshot时出现错误无法继续时,是否阻塞客户端“变更操作”,“错误”可能因为磁盘已满/磁盘故障/OS级别异常等  
stop-writes-on-bgsave-error yes  

##是否启用rdb文件压缩,默认为“yes”,压缩往往意味着“额外的cpu消耗”,同时也意味这较小的文件尺寸以及较短的网络传输时间  
rdbcompression yes  

AOF

相关的配置如下:


# 此选项为AOF功能的开关,默认为no,通过yes来开启aof功能
appendonly yes
# 指定AOF文件名称
appendfilename appendonly.aof
# 备份RDB和AOF文件存放路径
dir /usr/local/var/db/redis/

aof的备份模式为:

appendfsync always     #每次有数据修改发生时都会写入AOF文件。

appendfsync everysec  #每秒钟同步一次,该策略为AOF的缺省策略。

appendfsync no          #从不同步。高效但是数据不会被持久化。

##aof文件rewrite触发的最小文件尺寸(mb,gb),只有大于此aof文件大于此尺寸是才会触发rewrite,默认“64mb”,建议“512mb”  
auto-aof-rewrite-min-size 64mb  

##相对于“上一次”rewrite,本次rewrite触发时aof文件应该增长的百分比。  
##每一次rewrite之后,redis都会记录下此时“新aof”文件的大小(例如A),那么当aof文件增长到A*(1 + p)之后  
##触发下一次rewrite,每一次aof记录的添加,都会检测当前aof文件的尺寸。  
auto-aof-rewrite-percentage 100  

RDB与AOF混合(redis5是默认开启的)

混合模式仍然是用的AOF的处理流程,不同的是保存的内容是 RDB与AOF的混合.简单的说:新的AOF文件前半段是RDB格式的全量数据后半段是AOF格式的增量数据.具体的流程如下所示:

  1. fork出的子进程先将共享的内存副本全量的以RDB方式写入aof文件
  2. 然后在将重写缓冲区的增量命令以AOF方式写入到文件--该出的缓冲区为备份redis时收到的Redis命令cuiyaonan2000@163.com
  3. 写入完成后通知主进程更新统计信息,并将新的含有RDB格式和AOF格式的AOF文件替换旧的的AOF文件
  4. 配置文件中开启的方式:aof-use-rdb-preamble:true


 

<think>我们正在讨论Redis的持久化机制,特别是RDBAOF。根据用户的问题,需要详细解释两者的区别原理,并参考提供的引用内容。同时,用户之前的问题是关于Redis的拒绝策略、过期策略删除策略,但当前问题转向了持久化机制,因此我们需要专注于AOFRDB。 引用内容摘要: [1]:介绍了RDBAOF的基本概念,包括RDB的bgsave机制(写时复制)、RDB的优点缺点,AOF的持久化过程、刷盘策略、重写、优点缺点,以及混合持久化。 [2]:强调RDB像“快照”,适合快速恢复冷备份;AOF像“操作日志”,适合数据完整性要求高的场景。 [3]:指出选择标准是看系统是否愿意牺牲性能换取更高一致性(AOF),还是愿意在写操作频繁时禁用备份换取性能(RDB),并提到RDB具有最终一致性。 [4]:说明RDB不够耐久,可能会丢失最近写入的数据,而AOF是更耐久的持久化方式。 回答结构: 1. 简要介绍Redis持久化的概念两种机制(RDBAOF)。 2. 分别详细说明RDBAOF的原理。 3. 对比两者的区别(包括持久化方式、数据安全性、性能、恢复速度、文件大小等)。 4. 介绍Redis 4.0的混合持久化。 5. 如何选择RDBAOF。 6. 生成相关问题。 注意:根据用户要求,使用LaTeX格式表示数学表达式(如果有的话),但本主题可能较少涉及数学公式,但如果有需要,比如涉及一些算法描述,会使用。另外,引用标识要自然地添加在引用内容的末尾。 由于用户要求生成相关问题,我们将在最后提出几个相关问题。 开始回答:</think>### Redis持久化机制:RDBAOF的原理深度对比 #### 1. **Redis持久化核心目标** - 解决内存数据易失性问题,确保**故障恢复时数据不丢失** - 两种互补机制:**RDB(快照)** **AOF(日志追加)** - 关键指标:数据安全性、性能开销、恢复速度[^1][^2] --- #### 2. **RDB(Redis DataBase)原理** **工作流程** ```mermaid graph LR A[触发条件] --> B[创建子进程] B --> C[父进程继续处理请求] B --> D[子进程写入数据到临时RDB文件] D --> E[原子替换旧RDB文件] ``` - **核心机制**: - **写时复制(COW)**:子进程复制父进程内存页表,仅当父进程修改数据时才复制物理内存[^1] - **触发条件**: - 手动执行 `SAVE`(阻塞主线程)或 `BGSAVE`(后台异步) - 配置文件定时策略(如 `save 900 1`) - 关闭服务器时自动触发 **特性对比** | 优点 | 缺点 | |------|------| | ✅ 二进制压缩文件(体积小) | ❌ 可能丢失最后一次快照后的数据[^4] | | ✅ 极速恢复(直接加载内存) | ❌ 大数据量时 `BGSAVE` 的 `fork()` 可能阻塞主线程 | | ✅ 适合冷备份灾难恢复 | ❌ 定时触发导致数据一致性弱(最终一致)[^3] | --- #### 3. **AOF(Append Only File)原理** **工作流程** ```mermaid graph TB A[写入命令] --> B[写入AOF缓冲区] B --> C{刷盘策略} C -->|always| D[每个命令同步磁盘] C -->|everysec| E[每秒批量同步] C -->|no| F[依赖操作系统刷盘] ``` - **核心机制**: - **日志追加**:记录所有修改操作(如 `SET key value`) - **重写机制(Rewrite)**: - 基于当前数据生成新AOF文件,消除冗余命令 - 使用 `BGREWRITEAOF` 后台执行,避免阻塞 - **刷盘策略**: - `always`:每个命令刷盘(强一致,性能最低) - `everysec`:每秒批量刷盘(平衡方案,默认) - `no`:依赖操作系统刷盘(高性能,可能丢数据)[^1][^4] **特性对比** | 优点 | 缺点 | |------|------| | ✅ 数据丢失风险低(至多丢1秒数据) | ❌ 文件体积大(需定期重写) | | ✅ 操作日志可审计(便于故障追踪) | ❌ 恢复速度慢(需重放所有命令) | | ✅ 支持实时持久化(强一致性)[^3] | ❌ `always` 模式性能下降50%以上 | --- #### 4. **RDB vs AOF 核心区别** | 维度 | RDB | AOF | |------|-----|-----| | **持久化方式** | 内存快照 | 操作日志追加 | | **数据安全性** | 可能丢分钟级数据 | 至多丢1秒数据(everysec) | | **恢复速度** | ⚡️ 极快(直接加载二进制) | ⏳ 慢(需重放命令) | | **性能影响** | `fork()` 瞬间内存压力 | 持续写盘I/O压力 | | **文件体积** | 小(压缩二进制) | 大(文本日志,需重写压缩) | | **适用场景** | 灾难恢复、冷备份 | 金融交易、需强一致性场景[^2][^3] | > 💡 **决策公式**: > 数据重要性权重 $W_d$ vs 性能权重 $W_p$ > - 若 $W_d \gg W_p$ → **AOF**(如支付系统) > - 若 $W_p \gg W_d$ → **RDB**(如热点缓存) > - 折中方案:**混合持久化**(Redis 4.0+) --- #### 5. **混合持久化(Redis 4.0+)** - **原理**: ```bash [RDB头部] + [AOF增量操作] ``` - 定期生成RDB快照作为基础数据 - 后续操作追加到AOF日志 - **优势**: - 恢复速度接近RDB(直接加载快照) - 数据安全性接近AOF(保留增量操作) - **启用方式**: ```conf aof-use-rdb-preamble yes # 配置文件开启 ``` --- #### 6. **实战配置建议** 1. **通用缓存场景** ```conf save 900 1 # RDB定时备份 appendonly no # 关闭AOF ``` 2. **金融交易系统** ```conf appendonly yes appendfsync always # 强一致性 aof-use-rdb-preamble yes # 混合持久化 ``` 3. **高吞吐量服务** ```conf save "" # 禁用RDB appendonly yes appendfsync everysec # 平衡性能安全 ``` > ⚠️ **避坑指南**: > - 避免 `SAVE` 命令在生产环境使用(阻塞主线程) > - AOF重写期间磁盘空间需预留2倍当前数据大小 > - 混合持久化需Redis 4.0+,低版本需升级[^1][^4] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cuiyaonan2000

给包烟抽吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值