Redis 持久化介绍
概述
持久性指的是将数据写入持久存储,例如固态硬盘(SSD)。Redis 提供了一系列持久化选项。这些包括:
- RDB(Redis Database):RDB 持久化在指定的时间间隔内对您的数据集执行点时间快照。
- AOF (Append Only File) : AOF 持久化记录服务器接收到的每个写操作。这些操作可以在服务器启动时再次回放,重建原始数据集。命令使用与 Redis 协议相同的格式进行记录。
- 无持久性:您可以完全禁用持久性。这有时用于缓存。
- RDB + AOF:您还可以在同一实例中同时使用 AOF 和 RDB。
RDB
RDB创建数据集的快照
格式
RDB 是一个非常紧凑的单文件(二进制文件 dump.rdb),代表了 Redis 在某个时间点上的数据快照。
生成操作
- save 同步保存
- bgsave 异步保存
原理
- Redis 进行分叉。现在我们有一个子进程和一个父进程。
- 子进程开始将数据集写入一个临时的关系数据库文件。
- 当子进程写完新的 RDB 文件后,它会替换旧的文件。
自动持久化
配置文件
save <second> <changes> |
这个指令可以设置多次,每个设置定义了一个时间间隔(秒)和该时间内发生的变更次数阈值。
save 900 1 |
这意味着:
- 如果至少有 1 个键被修改,900 秒后自动触发一次 RDB 持久化。
- 如果至少有 10 个键被修改,300 秒后自动触发一次 RDB 持久化。
- 如果至少有 10000 个键被修改,60 秒后自动触发一次 RDB 持久化。
满足以上任一条件,RDB 持久化就会被自动触发。
SHUTDOWN 关闭的时候也会进行一次自动持久化
AOF
AOF(Append Only File)文件主要用于增量持久化数据,他会记录redis执行的具体命令序列
格式
- AOF 文件中的每个命令采用 Redis 协议(RESP,Redis Serialization Protocol)的格式进行序列化。
配置
开启AOF
appendonly yes |
设置fsync规则
appendfsync always # 每次写入数据都同步,保证数据不丢失,但性能较低 |
设置重写
auto-aof-rewrite-percentage 100 # 增长到原大小的100%时触发重写 |
原理
策略
为了将缓冲区中的命令持久化到磁盘中的 AOF 文件,Redis 提供了几种不同的同步策略:
- always:每次写命令都会同步到 AOF 文件,这提供了最高的数据安全性,但可能因为磁盘 I/O 的延迟而影响性能。
- everysec(默认):每秒同步一次,这是一种折衷方案,提供了较好的性能和数据安全性。如果系统崩溃,最多可能丢失最后一秒的数据。
- no:只会在 AOF 关闭或 Redis 关闭时执行, 或由操作系统内核触发。在这种模式下,如果发生宕机,那么丢失的数据量由操作系统内核的缓存冲洗策略决定。
重写
AOF文件会随着程序的执行逐渐变多;比如对一个计数器修改100次,就会有一百条记录
AOF重写就是根据当前数据库的状态,生成一份新的AOF数据,此时这100条数据就会压缩成一条,从而节约内存
AOF原理如下(Redis < 7.0):
- Redis 进行分叉,因此现在我们有一个子进程和一个父进程。
- 子进程开始在临时文件中写入新的 AOF。
- 父进程将所有新更改累积在内存缓冲区中(但同时将新更改写入旧的只追加文件,如果重写失败,我们仍然安全)。
- 当子进程完成重写文件后,父进程收到信号,并将孩子生成的内存缓冲区追加到文件末尾。
- 现在 Redis 将新文件原子性地重命名为旧文件,并开始将新数据追加到新文件中。
当Redis ≥ 7.0时,会有所变化,具体是父进程打开一个新的 AOF 增量文件以继续写入更新,而不再使用内存缓冲区;此举有助于节约内存。
手动执行 AOF 重写的命令是:
bgrewriteaof |
实践
同时启用 RDB 和 AOF 被认为是最佳实践:
- 使用 RDB 进行快照备份。
- 使用 AOF 保证崩溃后的最大数据完整性。
数据恢复
待补充