Redis|持久化
文章目录
- 总体介绍
- RDB(Redis DataBase)
- 官网介绍
- 案例演示
- 优势
- 劣势
- 如何检查修复 dump.rdb 文件
- 哪些情况下会触发 RDB 快照
- 如何禁用快照
- RDB 优化配置项详解
- 小总结
- AOF(Append Only File)
- 官网介绍
- 是什么
- 能干嘛
- AOF 持久化工作流程
- AOF 缓冲区三种写回策略
- AOF 配置/启动/修复/恢复案例演示和说明
- 优势
- 劣势
- AOF 重写机制
- AOF 优化配置项详解
- 小总结
总体介绍
- 官网地址:https://redis.io/docs/manual/persistence/
- 持久化双雄:
- RDB(Redis DataBase):RDB 是 Redis 默认的持久化方式,它通过生成数据集的快照(snapshot)来保存数据。RDB 文件是一个经过压缩的二进制文件,包含了某个时间点 Redis 数据库中的所有数据。
- AOF(Append Only File):AOF 持久化通过记录每个写操作来保存数据。AOF 文件是一个追加写入的日志文件,记录了 Redis 执行的所有写命令。在 Redis 重启时,可以通过重新执行 AOF 文件中的命令来恢复数据。
RDB(Redis DataBase)
官网介绍
- RDB (Redis 数据库):RDB 持久化以指定的时间间隔执行数据集的时间点快照。
- 在指定的时间间隔,执行数据集的时间点快照。
- 实现类似照片记录效果的方式,就是把某一时刻的数据和状态以文件的形式写到磁盘上,也就是快照。这样一来即使故障宕机,快照文件也不会丢失,数据的可靠性也就得到了保证。
- 这个快照文件就称为 RDB 文件(dump.rdb),其中,RDB 就是 Redis DataBase 的缩写。
- 在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的 snapshot 内存快照,它恢复时再将硬盘快照文件直接读回到内存里。
- Redis 的数据都在内存中,保存备份时它执行的是全量快照,也就是说,把内存中的所有数据都记录到磁盘中,一锅端。
- RDB 保存的是 dump.rdb 文件。
案例演示
-
RDB 保存到磁盘的文件叫 dump.rdb
-
Redis 6.0.16 及以下:
- Redis 6.2 以及 Redis 7.0.0:
- 操作步骤:
- 自动触发:
- Redis7 版本,按照 redis.conf 里配置的
save <seconds> <changes>
- 本次案例5秒2次修改,
save 5 2
的意思是,如果在 5 秒内发生了 2 次写操作(如 SET 或 DEL),则会触发 RDB 保存。在 5 秒内发生至少 2 次修改,就会触发保存快照。如果在 5 秒内发生了 3 次修改,它满足了这个条件,因此快照会被保存。即使超过了 2 次修改,只要满足时间窗口和修改次数的条件(这里是 5 秒内 2 次修改),快照就会触发。
- 修改 dump.rdb 文件的保存路径
- 修改 dump.rdb 文件名称
- 触发备份
- 第一种情况,5 秒内保存 2 次
- 第二种情况,两次保存间隔超过5秒
-
Redis 启动或者 RDB 快照完成,开始计时,期间 Redis 会记录发生写操作的次数。超过了
<seconds>
后,Redis 会统计这段时间里达到修改次数,满足<changes>
次,会自动触发,每个时间间隔内只会触发一次 -
我看推测配置文件注释描述的应该是距离上次更新超过了
<seconds>
后,Redis 会统计这段时间里达到修改次数,如果满足<changes>
次数,会自动触发 -
如何恢复:
- 将备份文件(dump.rdb)移动到 Redis 安装目录并启动服务即可
- shutdown 命令模拟服务器宕机时,最后那次关机 redis 马上会把当前的快照保存一次,保证跟上一次一致,尽量使其最新
- 备份成功后故意用
flushdb
清空 redis,看看是否可以恢复数据?执行flushall/flushdb
命令也会产生 dump.rdb 文件,但里面是空的,无意义 - 物理恢复,一定要将服务产生的有数据的 RDB 文件备份一份,然后分机隔离,避免生产上物理损坏后备份文件也挂了
-
手动触发:使用
save
或者bgsave
命令 -
redis 提供了两个命令来生成 RDB 文件,分别是 save 和 bgsave
- 生产上只允许用
bgsave
绝对不允许用save
-
save:在主程序中执行会阻塞当前 redis 服务器,直到持久化工作完成执行 save 命令期间,Redis 不能处理其他命令,线上禁止使用
-
bgsave (默认):redis 会在后台异步进行快照操作,不阻塞快照同时还可以相应客户端请求,该触发方式会 fork 一个子进程,由子进程复制持久化过程。
-
Redis 会使用 bgsave 对当前内存中的所有数据做快照,这个操作是子进程在后台完成的,这就允许主进程同时可以修改数据。
-
fork 是什么? 在 Linux 程序中,
fork()
会产生一个和父进程完全相同的子进程,但子进程在此后会exec
系统调用,处于效率考虑,尽量避免膨胀,不要太多 -
LASTSAVE:可以通过lastsave命令获取最后一次成功执行快照的时间
优势
- 官网说明:
-
RDB 是 Redis 数据的一个非常紧凑的单文件时间点表示。RDB 文件非常适合备份。例如,您可能希望在最近的 24 小时内每小时归档一次 RDB 文件,并在 30 天内每天保存一个 RDB 快照。这使您可以在发生灾难时轻松恢复不同版本的数据集。
-
RDB 非常适合灾难恢复,它是一个可以传输到远程数据中心或 Amazon S3 (可能已加密)的压缩文件。
-
RDB 最大限度地提高了 Redis 的性能,因为 Redis 父进程为了持久化而需要做的唯一工作就是派生一个将完成所有其余工作的子进程。父进程永远不会执行磁盘 I/О 或类似操作。
-
与 AOF 相比,RDB 允许使用大数据集更快地重启。
-
在副本上,RDB 支持重启和故障转移后的部分重新同步。
-
小总结:
- 适合大规模的数据恢复
- 按照业务定时备份
- 对数据完整性和一致性要求不高
- RDB 文件在内存中的加载速度要比 AOF 快很多
劣势
- 官网说明:
-
如果您需要在 Redis 停止工作时(例如断电后)将数据丢失的可能性降到最低,那么 RDB 并不好。您可以配置生成 RDB 的不同保存点(例如,在对数据集至少 5 分钟和 100 次写入之后,您可以有多个保存点)。但是,您通常会每五分钟或更长时间创建一次 RDB 快照,因此,如果 Redis 由于任何原因在没有正确关闭的情况下停止工作,您应该准备好丢失最新分钟的数据。
-
RDB 需要经常
fork()
以便使用子进程在磁盘上持久化。如果数据集很大,fork()
可能会很耗时,并且如果数据集很大并且 CPU 性能不是很好,可能会导致 Redis 停止为客户端服务几毫秒甚至一秒钟。AOF 也需要fork()
但频率较低,您可以调整要重写日志的频率,而不需要对持久性进行任何权衡。 -
小总结:
- 在一定间隔时间做一次备份,所以如果 redis 意外 down 掉的话,就会丢失从当前至最近一次快照期间的数据,快照之间的数据会丢失
- 内存数据的全量同步,如果数据量太大会导致 IO 严重影响服务器性能
- RDB 依赖于主进程的 fork,在更大的数据集中,这可能会导致服务请求的瞬间延迟。fork 的时候内存中的数据被克隆了一份,大致 2 倍的膨胀性,需要考虑
-
模拟数据丢失案例:
- 正常录入数据
kill -9
故意模拟意外宕机- redis 重启恢复,查看数据是否丢失
如何检查修复 dump.rdb 文件
- 进入到 redis 安装目录,执行
redis-check-rdb
命令redis-check-rdb ./redisconfig/dump.rdb
哪些情况下会触发 RDB 快照
- 配置文件中默认的快照配置
- 手动
save/bgsave
命令 - 执行
flushdb/fulshall
命令也会产生 dump.rdb 文件,但是也会将命令记录到 dump.rdb 文件中,恢复后依旧是空,无意义 - 执行 shutdown 且没有设置开启 AOF 持久化
- 主从复制时,主节点自动触发
如何禁用快照
- 第一种方法:动态所有停止 RDB 保存规则的方法:
redis-cli config set value ""
- 第二种方法:手动修改配置文件,把注释打开
RDB 优化配置项详解
- 配置文件 SNAPSHOTTING 模块:
save <seconds> <changes>
:配置快照保存条件- dir:配置快照保存目录地址
- dbfilename:配置快照的文件名
- stop-writes-on-bgsave-error:默认 yes,如果配置成 no,表示不在乎数据不一致或者有其他的手段发现和控制这种不一致,那么在快照写入失败时,也能确保 redis 继续接受新的请求
- rdbcompression:默认 yes,对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,Redis 会采用 LZF 算法进行压缩。如果你不想消耗 CPU 来进行压缩的话,可以设置为关闭此功能
- rdbchecksum:默认 yes,在存储快照后,还可以让 redis 使用 CRC64 算法来进行数据校验,但是这样做会增加大约 10% 的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能
- rdb-del-sync-files:在没有持久化的情况下删除复制中使用的RDB文件。默认情况下 no,此选项是禁用的。
小总结
AOF(Append Only File)
官网介绍
是什么
- 以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但是不可以改写文件,redis 启动之初会读取该文件重新构建数据,换言之,redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
- 默认情况下,redis 是没有开启 AOF 的
- 开启 AOF 功能需要设置配置:
appendonly yes
能干嘛
- AOF 保存的是 appendonly.aof 文件
AOF 持久化工作流程
-
Client 作为命令的来源,会有多个源头以及源源不断的请求命令。
-
在这些命令到达 Redis Server 以后并不是直接写入 AOF 文件,会将其这些命令先放入 AOF 缓存中进行保存。这里的 AOF 缓冲区实际上是内存中的一片区域,存在的目的是当这些命令达到一定量以后再写入磁盘,避免频繁的磁盘 IO 操作。
-
AOF 缓冲会根据 AOF 缓冲区同步文件的三种写回策略将命令写入磁盘上的 AOF 文件。
-
随着写入 AOF 内容的增加为避免文件膨胀,会根据规则进行命令的合并(又称 AOF 重写),从而起到 AOF 文件压缩的目的。
-
当 Redis Server 服务器重启的时候会对 AOF 文件载入数据。
AOF 缓冲区三种写回策略
-
always:同步写回,每个写命令执行完立刻同步地将日志写回磁盘
-
everysec:每秒写回,每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,每隔 1 秒把缓冲区中的内容写入到磁盘
-
no:操作系统控制的写回,每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
-
三种写回策略小总结 update
AOF 配置/启动/修复/恢复案例演示和说明
- 配置文件说明 (6 VS 7)
- 如何开启 AOF?
- 使用默认写回策略,everysec
- AOF 文件的保存路径:
- redis 6 及以前,AOF 保存文件的位置和 RDB 保存文件的位置一样,都是通过 redis.conf 配置文件的 dir 配置
- redis 7 最新
- AOF 文件的保存名称:
- redis 6 及以前,有且仅有一个
- redis 7 Multi Part AOF 的设计:从 1 个文件到 3 个文件
-
MP-AOF 实现
-
顾名思义,MP-AOF 就是将原来的单个 AOF 文件拆分成多个 AOF 文件。在 MP-AOF 中,我们将 AOF 分为三种类型, 分别为:
- BASE:表示基础 AOF,它一般由子进程通过重写产生,该文件最多只有一个。base 文件是 AOF 的完整快照,包含某一时刻前所有数据的写入操作。在 AOF 重写(BGREWRITEAOF)时生成,替代旧的 AOF 文件。文件较大,但数据完整,适合作为恢复的基础。
- INCR:表示增量 AOF,它一般会在 AOFRW 开始执行时被创建,该文件可能存在多个。incr 文件记录 base 文件生成后的增量写入操作。每次写入操作都会追加到 incr 文件。文件较小,仅包含增量数据,与 base 文件结合使用以保持数据完整性。
- HISTORY:表示历史 AOF,它由 BASE 和 INCR AOF 变化而来,每次 AOFRW 成功完成时,本次 AOFRW 之前对应的 BASE 和 INCR AOF 都将变为 HISTORY,HISTORY 类型的 AOF 会被 Redis 自动删除。
-
为了管理这些 AOF 文件,我们引入了一个 manifest (清单)文件来跟踪、管理这些 AOF。manifest 文件记录 base 和 incr 文件的元数据及其关系,确保 Redis 重启时能正确加载这些文件。同时,为了便于 AOF 备份和拷贝,我们将所有的 AOF 文件和 manifest 文件放入一个单独的文件目录中,目录名 appenddirname 配置(Redis 7.0 新增配置项)决定。
-
Redis 7.0 config 中对应的配置项
- 正常恢复:
- 修改默认的 appendonly no,改为 yes
- 写操作继续,生成 aof 文件到指定目录(然后将 appendonly 文件备份,使用 flushdb+shutdown 服务器来模拟 redis 宕机数据丢失,删除生成的新 aof 文件,将备份文件恢复)
- 恢复:重启 redis 然后重新加载,结果 OK,将数据重新写入到了 redis
-
在 Redis 中,如果同时存在 dump.rdb 文件和 AOF 文件,Redis 在启动时会按照一定的优先级决定使用哪个文件进行数据恢复,不会发生冲突。
-
Redis 在启动时会按照以下顺序检查持久化文件:
- AOF 文件(如果启用):Redis 会优先使用 AOF 文件进行数据恢复,因为 AOF 文件通常包含更完整的数据(记录所有写操作)。AOF 文件的数据恢复是通过重新执行 AOF 文件中的命令来实现的。
- RDB 文件(如果 AOF 文件不存在或未启用):如果 AOF 文件不存在或未启用 AOF 持久化,Redis 会尝试加载 dump.rdb 文件。RDB 文件是一个快照文件,恢复速度较快,但可能丢失最后一次快照之后的写操作。
-
Redis 的设计确保了 AOF 文件和 RDB 文件不会同时用于恢复。如果 AOF 文件存在,Redis 会优先使用 AOF 文件,而忽略 RDB 文件。如果 AOF 文件不存在或损坏,Redis 会回退到使用 RDB 文件。
-
AOF 文件通常比 RDB 文件更可靠:AOF 文件记录了所有写操作,可以保证数据的完整性(除非 AOF 文件损坏)。RDB 文件是某一时刻的快照,可能会丢失最后一次快照之后的写操作。
-
AOF 文件恢复速度较慢:AOF 文件是通过重放命令来恢复数据的,如果文件较大,恢复时间会较长。RDB 文件恢复速度较快,因为它是直接加载内存的快照。
-
异常恢复:可能存在每一秒钟写入一次,但是内容才写了一小半,没有写完整,突然 redis 挂了导致 AOF 文件错误
- 故意胡乱改动正常的 AOF 文件,模拟网络闪断文件写入 error 不完整等其他异常情况
- 重启 Redis 之后就会进行 AOF 文件的载入,发现启动都不行
- 异常修复命令:
redis-check-aof --fix
进行修复