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

11 KiB
Raw Blame History

Redis 持久化

Redis 是一个内存数据库为了保证数据的持久性和可靠性Redis 提供了多种持久化机制。理解和正确配置持久化是 Redis 生产环境部署的关键。

RDB 持久化

RDB 概述

RDBRedis Database是 Redis 的一种持久化方式,它将某个时间点的数据集快照保存到磁盘上。

RDB 特点:

  • 快照方式:保存某个时间点的完整数据集
  • 紧凑格式:二进制格式,文件体积小
  • 恢复快速:启动时直接加载,恢复速度快
  • 性能影响小:通过 fork 子进程执行,对主进程影响小
  • 数据丢失风险:两次快照间的数据可能丢失

适用场景:

  • 对数据完整性要求不高的场景
  • 需要定期备份的场景
  • 主从复制的从节点
  • 数据恢复速度要求高的场景

RDB 配置

自动触发配置

# 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

手动触发配置

# 查看当前 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 文件

# SAVE 命令(阻塞方式)
# 在主进程中执行,会阻塞所有客户端请求
redis-cli SAVE

# BGSAVE 命令(非阻塞方式,推荐)
# 在后台子进程中执行,不阻塞主进程
redis-cli BGSAVE

# 检查 BGSAVE 是否正在执行
redis-cli LASTSAVE  # 返回最后一次成功执行 SAVE/BGSAVE 的时间戳

# 获取 RDB 相关信息
redis-cli INFO persistence

RDB 文件管理

# 查看 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 文件结构

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 文件

# 使用 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 配置

基本配置

# 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

动态配置

# 查看当前 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

# 手动触发 AOF 重写
redis-cli BGREWRITEAOF

# 检查 AOF 重写状态
redis-cli INFO persistence | grep aof

# 查看 AOF 相关统计信息
redis-cli INFO persistence

AOF 文件管理

# 查看 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格式记录命令

# 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 文件

# 查看 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 文件不断增长的问题:

# 重写前的 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 相关的命令被完全移除,因为最终结果是键不存在

重写配置和监控

# 查看重写相关配置
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'

重写性能优化

# 优化重写性能的配置
# 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 格式的增量命令      |
+---------------------+------------------------+

混合持久化配置

# 启用混合持久化
# 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

混合持久化操作

# 触发混合持久化重写
redis-cli BGREWRITEAOF

# 检查文件格式
file /var/lib/redis/appendonly.aof
head -c 20 /var/lib/redis/appendonly.aof | xxd

# 如果是混合格式,开头应该是 "REDIS" 而不是 "*"

持久化策略选择

不同场景的持久化策略

高性能场景

# 配置:仅使用 RDB较长的保存间隔
save 900 1
save 300 10
save 60 10000
appendonly no

# 适用场景:
# - 缓存系统
# - 数据丢失容忍度高
# - 性能要求极高

高可靠性场景

# 配置AOF + 每秒同步
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes

# 可选:同时启用 RDB 作为备份
save 900 1

# 适用场景:
# - 金融系统
# - 重要业务数据
# - 数据丢失容忍度低

平衡场景

# 配置:混合持久化
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes
save 900 1
save 300 10

# 适用场景:
# - 大多数生产环境
# - 平衡性能和可靠性
# - 中等数据量

持久化最佳实践

生产环境配置建议

# 推荐的生产环境配置
# 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"

实践操作