Redis 持久化机制RDB(Redis DataBase)和AOF(Append-Only File) 学习总结

1. RDB(Redis DataBase)快照

通过某个时间点或者每隔一定时间对当前redis 中的所有数据进行备份。

1.1 触发方法:

save命令,bgsave命令,自动化配置

save命令
阻塞当前 redis 服务器,命令执行期间,Redis不能处理其他命令,如果还在被使用期间慎用!

bgsave命令
主进程 fork 一个子进程来完成RDB的过程,完成后自动结束子进程,阻塞时间极短。

自动化配置
作为一个配置项来触发,例如在 redis.conf 中配置
第一行为先关闭 AOF 模式,这样就只开启了 RDB

appendonly no

save 600 10

save 600 10 可以翻译为如果 600 秒内发生有10个或10个以上键发生修改那么就触发备份任务
save 可以写多个例如

save 600 10
save 60 100

写多个时是或的关系,任意一个满足都会触发

1.2 执行流程

1.主进程先检查是否有正在执行的 RDB或AOF 持久化任务,如果有则什么都不做直接结束。

2.主进程会 fork 一个子进程来执行RDB备份任务,fork 操作会短暂阻塞主进程(Redis读写操作) 子进程操作完成后会发消息给主进程,主进程恢复读写能力。

3.子进程根据主进程的当前的内存数据生成临时快照文件,持久化完成后会使用临时快照文件替换掉原有RDB文件。
(该过程中主进程的读写不受影响,但Redis的写操作不会同步到主进程的主内存中,而是会写到一个临时的内存区域作为副本)

4.子进程完成 RDB 持久化后会发消息给主进程通知 RDB 持久化完成(将上阶段内存副本中增量的写操作产生的数据再同步到主内存中)

1.3 优缺点

优点
1.RDB使用一种紧凑的二进制格式来存储数据(RDB格式的文件),因此速度非常快。在恢复大量数据时,它通常比AOF快得多。

2.RDB对于在磁盘上的数据备份和恢复非常有用,子进程操作数据对主进程影响较小。

缺点
RDB 快照是定期执行不是实时执行从而无法保证数据的实时性(读写磁盘文件等都需要时间),同时如果 redis 在生成或者替换快照期间崩溃,将丢失最新的数据。

2. AOF(Append-Only File)

是增量的记录所有写操作到aof 日志文件中,通过重新执行该日志文件中的所有指令来恢复所有数据。

动态的实时的去更新备份数据能比较完成的备份所有数据,但操作过于频繁会对redis 性能有较大的影响。

2.1 触发方法:

开启配置的方法
通过修改 redis.conf 来配置 AOF

开启AOF持久化,去掉注释即可

appendonly yes

持久化策略:
设置持久化策略(always、everysec、no)
例如

appendfsync everysec

always:同步持久化,只要有更改就去更新,虽然保证了数据都可以备份,但是大量数据时对性能而言影响较大
everysec: 异步持久化,每秒去更新数据,最多丢失一秒数据
no:由操作系统决定持久化频率,这种方式相对其他两种而言性能最好,但间隔时间过长时丢失的数据也很多,丢失的量不好估计,不可控。

2.2 优缺点

优点
1.增量的记录写操作,数据几乎都可以完成的记录下来,丢失的很少或者几乎不丢失数据。
2.写入速度快,不需要磁盘中寻址
3.AOF 日志文件过大时,会压缩指令,生成可以恢复全部数据的更小日志文件,不会影响主进程读写。

缺点
1.记录每一个写操作,相比 RDB 操作会更频繁,速度较慢,性能影响较大。
2.使用的写指令恢复数据,相比 RDB 更容易出错。同样的数据 AOF 文件会更大一些,需要定期压缩的清理。

2.3 AOF 重写流程

1.当AOF文件达到一定条件时会触发重写,可以配置修改

如果当前的 AOF 文件比上次执行重写时的文件大 100% 时会再次触发重写操作。
但如果该参数取值为 0 则不会触发重写操作。

auto-aof-rewrite-percentage 100

指定触发重写时AOF文件大小

auto-aof-rewrite-min-size 64mb

默认配置是 当AOF文件大小是上次重写后大小的一倍且文件大于64MB时触发

2.重写时主进程会创建一个子进程生成新的 AOF 日志文件,该文件会保留能恢复数据的最小指令集。

3.在创建新的 AOF 日志文件期间 redis 会额外创建一个缓存区存放创建文件期间的所有写操作。

4.然后读取 redis 中键值对,生成一份能恢复数据的最小文件。新文件生成后再将上面缓存区的写指令也加入,最后替换旧的 AOF 文件。

3.混合持久化

redis 4.0 新增
字面意思,将两种持久化方式都开启使用。

通过配置开启

aof‐use‐rdb‐preamble yes

例如恢复时先恢复上次快照留下的数据,然后再恢复快照后记录的所有写操作指令。

3.1 混合持久化流程

1.在执行 AOF 重写这一刻前内存的数据做 RDB 快照处理
2.然后将 RDB 内的数据和增量的写操作指令一同写入新的 AOF 文件。写入完成后覆盖原有旧文件。

重启时可以先加载RDB 快速恢复大量数据,然后使用AOF 恢复增量写指令,使数据尽量保持完成的情况下还能提高性能和重启速度。

参考资料如下:
https://blog.csdn.net/weixin_37672801/article/details/127476772

https://new-developer.aliyun.com/article/1267270

猜你喜欢

转载自blog.csdn.net/weixin_44131922/article/details/131721620
今日推荐