作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。
MySQL
PostgreSQL
Redis(本章节)
Etcd
上个小节我们介绍了RBD的持久化方式,这个小节我们就来介绍AOF持久化。
AOF(Append Only File)通过记录所有写操作命令的方式实现持久化。与RDB的快照方式不同,AOF记录的是操作历史,类似于数据库的WAL(Write-Ahead Logging)。
客户端写请求
│
├─ 执行命令
│ │
│ └─ 写入AOF缓冲区
│ │
│ ├─ 策略1:每次写入都同步到磁盘(appendfsync always)
│ │
│ ├─ 策略2:每秒同步一次(appendfsync everysec)← 默认
│ │
│ └─ 策略3:由操作系统决定(appendfsync no)
│
└─ 返回客户端# redis.conf
# 开启AOF持久化
appendonly yes
# AOF文件名
appendfilename "appendonly.aof"
# AOF文件存储目录(与RDB相同)
dir ./
# 同步策略
appendfsync everysec # 推荐配置
# AOF重写期间是否禁止同步
no-appendfsync-on-rewrite no
# 自动触发重写条件
auto-aof-rewrite-percentage 100 # 当前AOF文件大小超过上次重写大小的100%
auto-aof-rewrite-min-size 64mb # AOF文件最小重写大小
# 加载AOF时遇到错误处理
aof-load-truncated yes
# 开启混合持久化(Redis 4.0+)
aof-use-rdb-preamble yes策略 | 命令执行后的操作 | 数据安全性 | 性能影响 | 适用场景 |
|---|---|---|---|---|
always | 立即同步到磁盘 | 最高(不丢失数据) | 最差(每次写都fsync) | 金融、交易等对数据一致性要求极高的场景 |
everysec | 每秒同步一次 | 高(最多丢失1秒数据) | 适中(折中方案) | 生产环境推荐,兼顾性能和数据安全 |
no | 由操作系统决定(通常30秒) | 低(可能丢失较多数据) | 最好 | 可容忍数据丢失的非关键业务 |
AOF文件会随着时间增长而变大,其中包含大量冗余命令(如多次set同一个key),重写可以:
# 手动触发重写
redis-cli BGREWRITEAOF
# 自动重写触发条件(默认配置):
# 当前AOF文件大小 > 上次重写后大小的2倍
# 且AOF文件大小 > 64MB主进程
│
├─ 检查重写条件
│
├─ fork()创建子进程
│ │
│ 子进程
│ ├─ 读取内存当前数据状态
│ ├─ 生成新的AOF临时文件
│ └─ 替换旧AOF文件
│
├─ 继续接收写命令
│ 写入AOF缓冲区
│ 写入AOF重写缓冲区 ← 关键!
│
└─ 子进程完成后,主进程将重写缓冲区内容追加到新AOF文件# Redis启动时自动执行:
1. 检查是否存在AOF文件
2. 如果存在,按顺序重放所有写命令
3. 重建内存数据库# 开启AOF文件校验
aof-load-truncated yes
# Redis会:
# 1. 检查AOF文件末尾是否完整
# 2. 如果文件损坏,会尝试截取完整部分加载
# 3. 如果aof-load-truncated=no,则拒绝启动# 开启混合持久化
aof-use-rdb-preamble yes文件格式:
[前部分:RDB格式的全量数据]
[后部分:AOF格式的增量命令]