Redis数据持久化的实现路径

3周前发布 gsjqwyl
10 0 0

概述

Redis是一种基于内存的非关系型数据库,数据通常存储在内存中。若要将内存中的数据保存到磁盘,就需要借助Redis的持久化机制。Redis的持久化机制能够把内存里的数据保存到磁盘,以便在重启后恢复数据。Redis主要有两种主要的持久化方式:一是RDB(Redis数据库)快照,二是AOF(仅追加文件)日志。在Redis4.0版本之后,引入了混合持久化方式,也就是RDB和AOF相结合的形式。

RDB持久化方式阐述

RDB持久化机制以轻巧、高效为突出特点,适用于对数据实时性要求不高但需要快速恢复数据的场景。在生产环境中,通常会与AOF配合使用(混合持久化),以此来平衡数据安全性和性能。合理配置触发策略、监控文件生成状态以及做好备份管理,是保障RDB机制稳定运行的关键。

其适用场景一般为:
* 缓存场景:允许部分数据丢失(例如缓存热点数据),优先采用RDB来提高恢复速度。
* 定期全量备份:比如每天生成一次RDB文件,用于历史数据存档或者容灾切换。
* 主从复制:在Redis主从集群中,主节点通过RDB向从节点同步初始数据,增量同步则通过AOF来实现。

RDB实现原理

RDB是Redis在某个时刻把数据写入一个临时文件(快照),持久化完成后,用这个临时文件替换之前的持久化文件,从而达成数据持久化的目标。

RDB触发持久化的方式

手动触发

  • SAVE命令:会阻塞主线程,直到RDB文件生成完毕,此期间无法处理客户端请求。
  • BGSAVE命令:fork出一个子进程来生成RDB文件,主线程继续处理请求,不会阻塞。

自动触发

通过配置文件(redis.conf)中的save配置项,当满足条件时自动执行BGSAVE。

# 基础配置项
save 900 1        # 900秒内至少有1个键被修改,触发快照
save 300 10       # 300秒内至少有10个键被修改,触发快照
save 60 10000     # 60秒内至少有10000个键被修改,触发快照

# RDB文件存储路径(建议使用独立磁盘,避免与系统盘混用)
dir /data/redis/rdb
# RDB文件名(可包含日期戳,便于区分版本)
dbfilename "dump-${DATE}.rdb"  # 需配合脚本动态生成,Redis不支持变量直接替换
# 压缩配置(生产环境建议保持默认)
rdbcompression yes
# 校验配置(加载时校验RDB文件完整性,默认开启)
rdbchecksum yes

RDB文件管理

文件存储位置与命名

  • 存储路径:由配置项dir决定,默认值为/var/lib/redis(可通过config get dir查看)。
  • 文件名:由配置项dbfilename决定,默认值为dump.rdb(可通过config get dbfilename查看)。

压缩配置

  • RDB文件默认采用LZF算法压缩,可通过配置项rdbcompression yes|no来开启或关闭(默认是yes)。
  • 关闭压缩能够提高生成速度,但会增大文件体积,适用于CPU资源紧张的场景。
  • 二进制格式:RDB文件是二进制格式,无法直接读取,但体积小、恢复速度快。

RDB恢复方式及时机

  • 当Redis宕机重启后会自动加载rdb文件(如果同时开启了AOF,则优先加载AOF)。
  • 若想强制加载RDB,忽略AOF,可在配置中设置appendonly no,或者在启动时指定–loadrdb参数。
  • 手动加载指定的RDB文件
# --dbfilename:指定dump.rdb文件的路径
redis-server  --dbfilename /path/dump.rdb

RDB实战

# 创建模拟数据
127.0.0.1:6379> set test1 1
OK
127.0.0.1:6379> set test2 2
OK
127.0.0.1:6379> set test3 3
OK
127.0.0.1:6379> keys *
1) "test1"
2) "test2"
3) "test3"

# 执行快照
127.0.0.1:6379> bgsave
Background saving started

[root@master /data00/data/redis]# ll
total 96
-rw-r--r-- 1 root root   125 May 29 19:28 dump.rdb

模拟删除dump.rdb文件后重启,数据是否存在?

[root@master /data00/data/redis]# mv dump.rdb ~
# 强制停止redis
[root@master ~]# ps -ef | grep redis
root      908803  635754  0 19:38 pts/0    00:00:00 grep redis
root     1818909       1  0 May20 ?        00:19:44 redis-server 0.0.0.0:6379
[root@master ~]# pkill redis-server

启动Redis服务

[root@master ~]# redis-server /data00/data/redis/redis.conf
[root@master ~]# ss -lntup | grep 6379
tcp   LISTEN 0      511                           0.0.0.0:6379       0.0.0.0:*    users:(("redis-server",pid=1807376,fd=6)) 

检查数据是否存在

127.0.0.1:6379> keys *
(empty array)

模拟恢复dump.rdb文件

# 将dump.rdb文件迁移到Redis数据目录下
[root@master /data00/data/redis]# mv ~/dump.rdb /data00/data/redis

# 检查rdb文件是否损坏
[root@master /data00/data/redis]# redis-check-rdb dump.rdb
[offset 0] Checking RDB file dump.rdb
[offset 27] AUX FIELD redis-ver = '6.2.18'
[offset 41] AUX FIELD redis-bits = '64'
[offset 53] AUX FIELD ctime = '1748518107'
[offset 68] AUX FIELD used-mem = '875088'
[offset 84] AUX FIELD aof-preamble = '0'
[offset 86] Selecting DB ID 0
[offset 125] Checksum OK
[offset 125] \o/ RDB looks OK! \o/
[info] 3 keys read
[info] 0 expires
[info] 0 already expired

# 启动Redis并检查数据
[root@master ~]# redis-server /data00/data/redis/redis.conf
[root@master ~]# redis-cli 
127.0.0.1:6379> auth !Xinxin123
OK
127.0.0.1:6379> keys *
1) "test2"
2) "test1"
3) "test3"

AOF持久化方式剖析

AOF(仅追加文件)是Redis提供的一种实时性更强的持久化方式,它通过记录所有写操作命令(而非数据本身)来确保数据的完整性。

核心原理

  • 客户端发送写命令(例如SET key value)。
  • Redis执行命令并将结果返回给客户端。
  • 将命令写入AOF缓冲区(内存)。
  • 根据配置策略将缓冲区内容同步到磁盘。

刷盘策略(appendfsync)

  • always:每个写命令都同步到磁盘,最多丢失一个命令。
  • everysec:每秒同步一次磁盘(默认配置),最多丢失1秒数据。
  • no:由操作系统决定何时刷盘(通常约30秒,取决于内核调度),可能丢失大量数据。

AOF相关配置

# 启用AOF(默认关闭)
appendonly yes

# 刷盘策略(推荐everysec,兼顾安全与性能)
appendfsync everysec

# AOF文件名(默认appendonly.aof)
appendfilename "appendonly.aof"

# AOF文件存储目录(与RDB共享,由dir参数决定)
dir /var/lib/redis

# 开启混合持久化(Redis 4.0+ 支持)
aof-use-rdb-preamble yes

AOF重写机制

为何需要重写?

随着写命令不断追加,AOF文件会越来越大,可能会引发以下问题:
* 文件体积膨胀:占用大量磁盘空间。
* 恢复速度变慢:重启时需要重放更多命令。

重写原理

通过BGREWRITEAOF命令触发,Redis会:
* fork子进程遍历当前内存数据。
* 生成最简命令集(例如合并多个SET为一个)。
* 替换原有AOF文件,保证原子性。

自动触发重写

在redis.conf中配置:

# 当AOF文件比上次重写后增长超过100%时触发
auto-aof-rewrite-percentage 100

# AOF文件至少达到64MB才触发重写(避免频繁重写小文件)
auto-aof-rewrite-min-size 64mb

AOF恢复机制

Redis自动加载AOF日志

Redis服务器启动时会优先尝试加载AOF文件来恢复数据,前提是满足以下条件:
1、配置文件中需启用AOF持久化,在Redis的配置文件(redis.conf)中,appendonly参数需设置为yes:

appendonly yes

2、存在有效的AOF文件,Redis会检查appendfilename参数指定的AOF文件名(默认是appendonly.aof)是否存在,且文件内容未损坏。

混合持久化机制解说

Redis的混合持久化机制是Redis4.0版本及以上的新特性,它结合了AOF和RDB两种持久化方式的优点,旨在提供更高效的数据恢复能力和更细粒度的数据安全性。

工作原理

混合持久化机制的核心是:在执行AOF重写(BGREWRITEAOF)时,将当前内存中的数据以RDB快照格式写入AOF文件,后续的写命令继续以AOF格式追加到文件末尾。

具体流程如下:
* 启用混合持久化:在redis.conf中配置aof-use-rdb-preamble yes(默认关闭)。
* AOF重写触发:当AOF文件达到一定大小或手动执行BGREWRITEAOF时,Redis会:
* 生成RDB快照数据(二进制格式,紧凑高效)。
* 将RDB数据写入新AOF文件的开头。
* 继续将后续的写命令以文本协议格式追加到AOF文件末尾。
* 数据恢复:Redis启动时,先加载RDB部分(快速恢复大部分数据),再执行AOF追加部分的命令(恢复最新操作)。

混合持久化相关配置

appendonly yes                # 启用AOF持久化
aof-use-rdb-preamble yes      # 启用混合持久化(Redis 4.0+ 支持)

# 触发AOF重写
auto-aof-rewrite-percentage 100  # AOF文件大小比上次重写后增长100%时触发
auto-aof-rewrite-min-size 64mb   # AOF文件最小达到64MB时触发

数据恢复流程

当Redis服务器重启时,加载混合AOF文件的流程:
* 检查文件格式:识别AOF文件是否包含RDB前缀。
* 加载RDB部分:快速解析二进制RDB数据,重建内存状态。
* 执行AOF部分:继续执行RDB之后的AOF命令,恢复最新操作。

混合持久化 vs 纯AOF vs 纯RDB区别

特性 混合持久化 纯AOF 纯RDB
数据恢复速度 快(RDB加载 + 少量AOF命令) 较慢(逐行执行命令) 最快(直接加载快照)
文件体积 小(RDB二进制 + 增量AOF) 大(纯文本命令) 中等(二进制快照)
数据安全性 高(接近AOF,仅丢失未同步数据) 高(取决于fsync策略) 低(可能丢失最后一次快照后的数据)
写操作开销 中等(重写时生成RDB) 高(频繁fsync) 低(定期快照)
兼容性 Redis 4.0+ 全版本支持 全版本支持
© 版权声明

相关文章

暂无评论

暂无评论...