Redis 持久化操作
RDB(Redis DataBase Backup file)
Redis 数据备份文件,也被叫做 Redis 数据快照。简单来说就是把所有记录都记录到磁盘中。当 Redis 实例故障重启后,从磁盘读取快照文件,恢复数据。
快照文件称为 RDB 文件,默认保存在当前运行目录。
$ redis-cli
# 是由 Redis 主进程来执行 RDB,会阻塞所有命令
> save
# 开启子进程执行 RDB,会阻塞所有命令
> bgsave
Background saving started
默认 Redis 在停机时,会执行一次 RDB。
触发机制
Redis 内部有处罚 RDB 的机制,可以在 redis.conf 文件中找到,格式如下
# 900 秒内,如果至少有 1 个 key 被修改,则执行 bgsave,如果是 save "" 则表示禁用 RDB
save 900 1
save 300 10
save 60 10000
RDB 的其它配置也可以在 redis.conf 文件中设置
# 是否压缩,建议不开启,压缩会消耗 cpu
rdbcompression yes
# RDB 文件名称
dbfilename dump.rdb
# 文件保存路径
dir ./
RDB 实现原理
在操作系统中,每个进程是无法直接操作物理内存的,操作系统会给每个进程维护一个虚拟内存,在虚拟内存中维护了一个页表,对物理内存进行一个映射,基于页表的映射关系,这样进程就操作物理内存。
当进行 bgsave 时,会开始 fork 主进程得到子进程,子进程共享主进程的内存数据(在 fork 阶段,主进程是阻塞的)。完成 fork 后读取内存中的数据并写入 RDB 文件。fork 实质上是拷贝主进程的页表
但是在子进程进行 RDB 操作时,主进程还是可以接收请求,可能会导致读写之间的冲突,存在脏数据,对此,fork 采用的是 copy-on-write 技术
- 当主进程执行读操作时,访问共享内存。
- 当主进程执行写操作时,则会拷贝一份数据,执行写操作。
当然,在极端情况下,如果在子进程写 RDB 文件时,主进程不断有请求,对数据进行修改,如果对每条数据都执行了修改操作,那就会导致内存占用翻倍。
缺点
- RDB 执行间隔时间长,两次 RDB 之间写入数据有丢失风险。
- fork 子进程、压缩、写出 RDB 文件都比较耗时。
AOF(Append Only File)
AOF 全称 Append Only File(追加文件)。Redis 处理的每一个命令都会记录在 AOF 文件,可以看做是命令日志文件。
AOF 默认是关闭的,需要修改 redis.conf 配置文件来开启 AOF
# 是否开启 AOF 功能,默认是 no
appendonly yes
# AOF 文件的名称
appendfilename "appendonly.aof"
AOF 的命令记录频率也可以通过 redis.conf 来配置
# 表示每执行一次写命令,立即记录到 AOF 文件
apendfsync always
# 写命令执行完先放入 AOF 缓冲区,然后表示每隔 1 秒将缓冲区数据写到 AOF 文件,是默认方案
appendfsync everysec
# 写命令执行完先放入 AOF 缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no
问题解决
由于 AOF 是记录每次 redis 的操作,会导致 aof 文件比较大,并且例如,在 set 操作之后,又有 del 操作,会导致效率问题。并且一个 key 可能会有多次 set 操作。
因为是记录命令, AOF文件会比RDB文件大的多。而且AOF会记录对同一-个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof
命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。
例如
set num 123
set name hudu
set num 456
执行bgrewriteaof
之后
# 是后台执行
BGREWRITEAOF
Backgroud append only file rewriting started
文件被压缩,并且命令被简化,可以理解为优化为
mset name hudu num 456
Redis 也会在触发阈值时自动去重写 AOF 文件。阈值也可以在 redis.conf 中配置
# AOF 文件比上次文件 增长超过多少百分比触发重写
auto-aof-rewrite-percentege 100
# AOF 文件体积最小多大以上才触发重写
auto-aof-rewrite-min-size 64mb
对比
RDB | AOF | |
---|---|---|
持久化方式 | 定时对整个内存做快照 | 记录每一次执行的命令 |
数据完整性 | 不完整,两次备份之间会丢失 | 相对完整,取决于刷盘策略 |
文件大小 | 会有压缩,文件体积小 | 记录命令,文件体积很大 |
宕机恢复速度 | 很快 | 慢 |
数据恢复优先级 | 低,因为数据完整性不如 AOF | 高,因为数据完整性更高 |
系统资源占用 | 高,大量 cpu 和内存消耗 | 低,主要是磁盘 IO 资源,但 AOF 重写时会占用大量 cpu 和内存资源 |
使用场景 | 可以容忍数分钟的数据丢失,追求更快的启动速度 | 对数据安全性要求较高 |
本作品采用《CC 协议》,转载必须注明作者和本文链接