💾 Redis 持久化

保障数据安全的持久化机制

持久化概述

Redis 是内存数据库,数据存储在内存中,服务器重启后数据会丢失。为了保证数据安全,Redis 提供了多种持久化机制,将内存中的数据保存到磁盘上。

内存数据

快速访问

持久化

保存到磁盘

数据恢复

重启后恢复

🔄 RDB 快照持久化

RDB(Redis Database)是 Redis 默认的持久化方式,它将某个时间点的数据集快照保存到磁盘上。

RDB 工作原理

内存数据fork子进程生成RDB文件替换旧文件

特点:二进制格式、文件小、恢复快

RDB 配置参数:

配置项 说明 示例
save 自动保存条件 save 900 1 (900秒内至少1个key变化)
dbfilename RDB文件名 dbfilename dump.rdb
dir 文件保存目录 dir /var/lib/redis
rdbcompression 是否压缩 rdbcompression yes
rdbchecksum 是否校验 rdbchecksum yes

RDB 配置示例:

# redis.conf 配置
# 自动保存策略
save 900 1      # 900秒内至少1个key发生变化
save 300 10     # 300秒内至少10个key发生变化
save 60 10000   # 60秒内至少10000个key发生变化

# RDB文件配置
dbfilename dump.rdb
dir /var/lib/redis/
rdbcompression yes
rdbchecksum yes

# 当RDB保存失败时停止写入
stop-writes-on-bgsave-error yes

手动触发 RDB:

# 阻塞式保存(会阻塞Redis服务)
SAVE

# 非阻塞式保存(推荐)
BGSAVE

# 查看最后一次保存时间
LASTSAVE

# 获取RDB保存状态
INFO persistence

📝 AOF 日志持久化

AOF(Append Only File)记录每个写操作命令,通过重新执行这些命令来恢复数据。

AOF 工作原理

写命令追加到AOF缓冲区同步到AOF文件定期重写

特点:记录操作日志、数据完整性高、文件较大

AOF 配置参数:

配置项 说明 示例
appendonly 启用AOF appendonly yes
appendfilename AOF文件名 appendfilename "appendonly.aof"
appendfsync 同步策略 appendfsync everysec
auto-aof-rewrite-percentage 重写触发百分比 auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 重写最小文件大小 auto-aof-rewrite-min-size 64mb

AOF 同步策略:

策略 说明 性能 安全性
always 每个写命令都同步 最高
everysec 每秒同步一次(推荐)
no 由操作系统决定 最快

AOF 配置示例:

# redis.conf 配置
# 启用AOF
appendonly yes
appendfilename "appendonly.aof"

# 同步策略(推荐everysec)
appendfsync everysec

# AOF重写配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 重写期间是否同步
no-appendfsync-on-rewrite no

# AOF文件损坏时的处理
aof-load-truncated yes

AOF 重写:

# 手动触发AOF重写
BGREWRITEAOF

# 查看AOF重写状态
INFO persistence

# AOF重写示例
# 原始AOF文件可能包含:
SET key1 "value1"
SET key1 "value2"
SET key1 "value3"
DEL key2
SET key2 "new_value"

# 重写后的AOF文件:
SET key1 "value3"
SET key2 "new_value"

🔄 混合持久化

Redis 4.0 引入的混合持久化,结合了 RDB 和 AOF 的优点。

混合持久化配置:

# 启用混合持久化
aof-use-rdb-preamble yes

# 混合持久化文件结构:
# [RDB格式的数据] + [AOF格式的增量数据]

# 优点:
# 1. 文件更小(RDB格式压缩率高)
# 2. 恢复更快(RDB格式加载快)
# 3. 数据更完整(AOF记录增量)

持久化方式对比

特性 RDB AOF 混合持久化
文件大小 中等
恢复速度
数据完整性 可能丢失 完整 完整
性能影响
可读性 二进制 文本 混合

持久化最佳实践

💡 生产环境建议:

  • 同时启用 RDB 和 AOF:RDB 用于备份,AOF 用于数据恢复
  • AOF 使用 everysec:平衡性能和数据安全
  • 定期备份 RDB 文件:复制到其他服务器或云存储
  • 监控磁盘空间:确保有足够空间存储持久化文件
  • 测试恢复流程:定期验证数据恢复的正确性

⚠️ 注意事项:

  • 磁盘性能:持久化会增加磁盘I/O,使用SSD提升性能
  • 内存使用:RDB fork 子进程会临时占用额外内存
  • 文件权限:确保 Redis 进程有读写持久化文件的权限
  • 网络传输:主从复制时需要传输 RDB 文件

🔧 持久化配置示例

完整的生产环境配置:

# redis.conf 生产环境持久化配置

# RDB 配置
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
dir /var/lib/redis/
rdbcompression yes
rdbchecksum yes
stop-writes-on-bgsave-error yes

# AOF 配置
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
no-appendfsync-on-rewrite no
aof-load-truncated yes

# 混合持久化
aof-use-rdb-preamble yes

# 内存优化
maxmemory-policy allkeys-lru
maxmemory 2gb

持久化监控脚本:

#!/bin/bash
# Redis 持久化监控脚本

REDIS_CLI="redis-cli"
LOG_FILE="/var/log/redis-persistence.log"

# 检查RDB状态
rdb_status=$(${REDIS_CLI} LASTSAVE)
echo "$(date): Last RDB save: ${rdb_status}" >> ${LOG_FILE}

# 检查AOF状态
aof_info=$(${REDIS_CLI} INFO persistence | grep aof)
echo "$(date): AOF info: ${aof_info}" >> ${LOG_FILE}

# 检查文件大小
rdb_size=$(du -h /var/lib/redis/dump.rdb 2>/dev/null | cut -f1)
aof_size=$(du -h /var/lib/redis/appendonly.aof 2>/dev/null | cut -f1)
echo "$(date): RDB size: ${rdb_size}, AOF size: ${aof_size}" >> ${LOG_FILE}

# 检查磁盘空间
disk_usage=$(df -h /var/lib/redis | tail -1 | awk '{print $5}')
echo "$(date): Disk usage: ${disk_usage}" >> ${LOG_FILE}

数据恢复流程:

# 1. 停止Redis服务
sudo systemctl stop redis

# 2. 备份当前数据文件
cp /var/lib/redis/dump.rdb /var/lib/redis/dump.rdb.backup
cp /var/lib/redis/appendonly.aof /var/lib/redis/appendonly.aof.backup

# 3. 恢复数据文件
# 从备份恢复RDB文件
cp /backup/dump.rdb /var/lib/redis/dump.rdb
# 或从备份恢复AOF文件
cp /backup/appendonly.aof /var/lib/redis/appendonly.aof

# 4. 设置正确的文件权限
chown redis:redis /var/lib/redis/dump.rdb
chown redis:redis /var/lib/redis/appendonly.aof
chmod 660 /var/lib/redis/dump.rdb
chmod 660 /var/lib/redis/appendonly.aof

# 5. 启动Redis服务
sudo systemctl start redis

# 6. 验证数据恢复
redis-cli INFO keyspace
redis-cli DBSIZE

🚀 性能优化建议

RDB 优化:

  • 调整保存频率:根据业务需求平衡数据安全和性能
  • 使用 BGSAVE:避免使用阻塞式的 SAVE 命令
  • 监控内存使用:fork 时需要额外内存,确保系统内存充足
  • SSD 存储:使用 SSD 提升 I/O 性能

AOF 优化:

  • 选择合适的同步策略:推荐使用 everysec
  • 定期重写:避免 AOF 文件过大影响性能
  • 重写期间配置:合理设置 no-appendfsync-on-rewrite
  • 文件系统优化:使用支持快速写入的文件系统

混合持久化优化:

  • 启用混合模式:获得更好的性能和数据安全平衡
  • 监控文件大小:定期检查持久化文件大小
  • 备份策略:制定完整的备份和恢复策略