Files
Cloud-book/数据库/Redis_2025/05_Redis持久化.md
2025-08-27 17:10:05 +08:00

502 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Redis 持久化
Redis 是一个内存数据库为了保证数据的持久性和可靠性Redis 提供了多种持久化机制。理解和正确配置持久化是 Redis 生产环境部署的关键。
## RDB 持久化
### RDB 概述
RDBRedis Database是 Redis 的一种持久化方式,它将某个时间点的数据集快照保存到磁盘上。
**RDB 特点:**
- **快照方式**:保存某个时间点的完整数据集
- **紧凑格式**:二进制格式,文件体积小
- **恢复快速**:启动时直接加载,恢复速度快
- **性能影响小**:通过 fork 子进程执行,对主进程影响小
- **数据丢失风险**:两次快照间的数据可能丢失
**适用场景:**
- 对数据完整性要求不高的场景
- 需要定期备份的场景
- 主从复制的从节点
- 数据恢复速度要求高的场景
### RDB 配置
**自动触发配置**
```shell
# redis.conf 配置文件中的 RDB 相关配置
# 自动保存条件save <seconds> <changes>
# 在指定时间内,如果至少有指定数量的键发生变化,则执行 BGSAVE
save 900 1 # 900秒内至少1个键发生变化
save 300 10 # 300秒内至少10个键发生变化
save 60 10000 # 60秒内至少10000个键发生变化
# 禁用自动保存(注释掉所有 save 行或使用空字符串)
# save ""
# RDB 文件名dump.rdb
# RDB 文件保存目录:/var/lib/redis
# 当 RDB 持久化出现错误时,是否停止接受写命令
stop-writes-on-bgsave-error yes
# 是否压缩 RDB 文件
rdbcompression yes
# 是否对 RDB 文件进行校验和检查
rdbchecksum yes
```
**手动触发配置**
```shell
# 查看当前 RDB 配置
redis-cli CONFIG GET save
redis-cli CONFIG GET dbfilename
redis-cli CONFIG GET dir
# 动态修改 RDB 配置
redis-cli CONFIG SET save "900 1 300 10 60 10000"
redis-cli CONFIG SET dbfilename "backup.rdb"
redis-cli CONFIG SET rdbcompression yes
# 保存配置到文件
redis-cli CONFIG REWRITE
```
### RDB 操作命令
**手动生成 RDB 文件**
```shell
# SAVE 命令(阻塞方式)
# 在主进程中执行,会阻塞所有客户端请求
redis-cli SAVE
# BGSAVE 命令(非阻塞方式,推荐)
# 在后台子进程中执行,不阻塞主进程
redis-cli BGSAVE
# 检查 BGSAVE 是否正在执行
redis-cli LASTSAVE # 返回最后一次成功执行 SAVE/BGSAVE 的时间戳
# 获取 RDB 相关信息
redis-cli INFO persistence
```
**RDB 文件管理**
```shell
# 查看 RDB 文件信息
ls -la /var/lib/redis/dump.rdb
# 备份 RDB 文件
cp /var/lib/redis/dump.rdb /backup/redis/dump_$(date +%Y%m%d_%H%M%S).rdb
# 验证 RDB 文件完整性
redis-check-rdb /var/lib/redis/dump.rdb
# 从 RDB 文件恢复数据
# 1. 停止 Redis 服务
systemctl stop redis
# 2. 替换 RDB 文件
cp /backup/redis/dump_xxx.rdb /var/lib/redis/dump.rdb
chown redis:redis /var/lib/redis/dump.rdb
# 3. 启动 Redis 服务
systemctl start redis
# 4. 验证数据恢复
redis-cli DBSIZE
```
### RDB 文件格式
**RDB 文件结构**
```shell
RDB 文件结构:
+-------+-------------+-----------+-----------------+-----+-----------+
| REDIS | RDB-VERSION | SELECT-DB | KEY-VALUE-PAIRS | EOF | CHECK-SUM |
+-------+-------------+-----------+-----------------+-----+-----------+
详细说明:
- REDIS: 文件标识符5字节
- RDB-VERSION: RDB 版本号4字节
- SELECT-DB: 数据库选择器
- KEY-VALUE-PAIRS: 键值对数据
- EOF: 文件结束标识1字节
- CHECK-SUM: 校验和8字节
```
**分析 RDB 文件**
```bash
# 使用 redis-rdb-tools 分析 RDB 文件
pip install rdbtools python-lzf
# 将 RDB 转换为 JSON 格式
rdb --command json /var/lib/redis/dump.rdb > dump.json
# 生成内存使用报告
rdb --command memory /var/lib/redis/dump.rdb > memory_report.csv
# 按键类型统计
rdb --command memory /var/lib/redis/dump.rdb --bytes 128 --largest 10
# 查看特定键的信息
rdb --command memory /var/lib/redis/dump.rdb | grep "user:"
```
## AOF 持久化
### AOF 概述
AOFAppend Only File是 Redis 的另一种持久化方式,它记录服务器接收到的每个写操作命令。
**AOF 特点:**
- **命令记录**:记录每个写操作命令
- **数据安全性高**:可配置每秒或每个命令同步
- **文件可读**:文本格式,可以直接查看和编辑
- **自动重写**:定期压缩 AOF 文件
- **恢复较慢**:需要重放所有命令
**适用场景:**
- 对数据完整性要求高的场景
- 需要最小数据丢失的场景
- 主节点持久化
- 需要审计写操作的场景
### AOF 配置
**基本配置**
```shell
# redis.conf 配置文件中的 AOF 相关配置
# 启用 AOF 持久化
appendonly yes
# AOF 文件名
appendfilename "appendonly.aof"
# AOF 同步策略
# always: 每个写命令都同步到磁盘(最安全,性能最低)
# everysec: 每秒同步一次(推荐,平衡安全性和性能)
# no: 由操作系统决定何时同步(性能最高,安全性最低)
appendfsync everysec
# 在 AOF 重写期间是否同步
no-appendfsync-on-rewrite no
# AOF 自动重写配置
# 当 AOF 文件大小超过上次重写后大小的指定百分比时触发重写
auto-aof-rewrite-percentage 100
# AOF 文件最小重写大小
auto-aof-rewrite-min-size 64mb
# AOF 加载时是否忽略最后一个不完整的命令
aof-load-truncated yes
# 是否使用 RDB-AOF 混合持久化
aof-use-rdb-preamble yes
```
**动态配置**
```shell
# 查看当前 AOF 配置
redis-cli CONFIG GET appendonly
redis-cli CONFIG GET appendfsync
redis-cli CONFIG GET auto-aof-rewrite-percentage
# 动态启用 AOF
redis-cli CONFIG SET appendonly yes
# 修改同步策略
redis-cli CONFIG SET appendfsync everysec
# 修改自动重写配置
redis-cli CONFIG SET auto-aof-rewrite-percentage 100
redis-cli CONFIG SET auto-aof-rewrite-min-size 64mb
# 保存配置
redis-cli CONFIG REWRITE
```
### AOF 操作命令
**手动重写 AOF**
```shell
# 手动触发 AOF 重写
redis-cli BGREWRITEAOF
# 检查 AOF 重写状态
redis-cli INFO persistence | grep aof
# 查看 AOF 相关统计信息
redis-cli INFO persistence
```
**AOF 文件管理**
```shell
# 查看 AOF 文件
ls -la /var/lib/redis/appendonly.aof
tail -f /var/lib/redis/appendonly.aof
# 检查 AOF 文件完整性
redis-check-aof /var/lib/redis/appendonly.aof
# 修复损坏的 AOF 文件
redis-check-aof --fix /var/lib/redis/appendonly.aof
# 备份 AOF 文件
cp /var/lib/redis/appendonly.aof /backup/redis/appendonly_$(date +%Y%m%d_%H%M%S).aof
```
### AOF 文件格式
**AOF 命令格式**
AOF 文件使用 RESPRedis Serialization Protocol格式记录命令
```shell
# AOF 文件内容示例
*3 # 数组长度3个元素
$3 # 字符串长度3字节
SET # 命令
$4 # 字符串长度4字节
name # 键名
$5 # 字符串长度5字节
Alice # 键值
*3
$3
SET
$3
age
$2
25
*2
$4
INCR
$7
counter
```
**分析 AOF 文件**
```shell
# 查看 AOF 文件内容
cat /var/lib/redis/appendonly.aof
# 统计 AOF 文件中的命令
grep -c "^\*" /var/lib/redis/appendonly.aof
# 查看最近的命令
tail -20 /var/lib/redis/appendonly.aof
# 提取特定命令
grep -A 10 "SET" /var/lib/redis/appendonly.aof
# 使用工具分析 AOF 文件python 脚本工具
```
### AOF 重写机制
**重写原理**
AOF 重写是为了解决 AOF 文件不断增长的问题:
```shell
# 重写前的 AOF 文件可能包含:
SET counter 1
INCR counter
INCR counter
INCR counter
DEL temp_key
SET temp_key value
DEL temp_key
# 重写后的 AOF 文件只包含:
SET counter 4
# temp_key 相关的命令被完全移除,因为最终结果是键不存在
```
**重写配置和监控**
```shell
# 查看重写相关配置
redis-cli CONFIG GET auto-aof-rewrite-*
# 查看重写统计信息
redis-cli INFO persistence | grep -E "aof_rewrite|aof_current_size|aof_base_size"
# 手动触发重写
redis-cli BGREWRITEAOF
# 监控重写进度
watch -n 1 'redis-cli INFO persistence | grep aof_rewrite_in_progress'
```
**重写性能优化**
```shell
# 优化重写性能的配置
# redis.conf
# 重写期间不进行 fsync提高性能
no-appendfsync-on-rewrite yes
# 调整重写触发条件
auto-aof-rewrite-percentage 100 # 文件大小翻倍时重写
auto-aof-rewrite-min-size 64mb # 最小64MB才考虑重写
# 使用混合持久化减少重写后的文件大小
aof-use-rdb-preamble yes
```
## 混合持久化
### 混合持久化概述
Redis 4.0 引入了混合持久化,结合了 RDB 和 AOF 的优点。
**混合持久化特点:**
- **快速恢复**RDB 部分快速加载
- **数据安全**AOF 部分保证最新数据
- **文件较小**:比纯 AOF 文件小
- **兼容性好**:向后兼容
**文件结构:**
```
混合 AOF 文件结构:
+---------------------+------------------------+
| RDB 格式的数据快照 | AOF 格式的增量命令 |
+---------------------+------------------------+
```
### 混合持久化配置
```shell
# 启用混合持久化
# redis.conf
appendonly yes
aof-use-rdb-preamble yes
# 动态启用
redis-cli CONFIG SET aof-use-rdb-preamble yes
redis-cli CONFIG REWRITE
# 验证配置
redis-cli CONFIG GET aof-use-rdb-preamble
```
### 混合持久化操作
```shell
# 触发混合持久化重写
redis-cli BGREWRITEAOF
# 检查文件格式
file /var/lib/redis/appendonly.aof
head -c 20 /var/lib/redis/appendonly.aof | xxd
# 如果是混合格式,开头应该是 "REDIS" 而不是 "*"
```
## 持久化策略选择
### 不同场景的持久化策略
**高性能场景**
```shell
# 配置:仅使用 RDB较长的保存间隔
save 900 1
save 300 10
save 60 10000
appendonly no
# 适用场景:
# - 缓存系统
# - 数据丢失容忍度高
# - 性能要求极高
```
**高可靠性场景**
```shell
# 配置AOF + 每秒同步
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes
# 可选:同时启用 RDB 作为备份
save 900 1
# 适用场景:
# - 金融系统
# - 重要业务数据
# - 数据丢失容忍度低
```
**平衡场景**
```shell
# 配置:混合持久化
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes
save 900 1
save 300 10
# 适用场景:
# - 大多数生产环境
# - 平衡性能和可靠性
# - 中等数据量
```
### 持久化最佳实践
**生产环境配置建议**
```shell
# 推荐的生产环境配置
# redis.conf
# 启用混合持久化
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes
# RDB 配置(作为备份)
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
# AOF 重写配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
no-appendfsync-on-rewrite no
aof-load-truncated yes
# 文件路径配置
dir /var/lib/redis
dbfilename dump.rdb
appendfilename "appendonly.aof"
```
## 实践操作