数据持久化的两种方式
# 介绍
Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(AOF)里面(这称为“全持久化模式”)。
由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。redis提供两种方式进行持久化,
- 一种是RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化),
- 一种是AOF(append only file)持久化(原理是将Reids的操作日志以追加的方式写入文件)。
# RDB
# 使用RDB
1.自动RDB快照备份,在配置文件中编辑
#指定保存备份周期下面这个就是 60秒之后至少有10000个key发生改变则执行bgsave进行快照保存
save 60 10000
#启用RDB文件压缩
rdbcompression yes
#指定文件名称
dbfilename dump.rdb
#指定文件存储位置
dir ./
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
2.手动保存快照
#异步保存数据
bgsave
#同步保存数据,不常用,多用于redis收到shutdown、term命令后执行这个指令保存后进行快照备份,然后关闭服务器
save
1
2
3
4
2
3
4
# 优点
- RDB就是一个二进制的单文件,非常适合备份,比如24小时保存一次RDB文件,这样如果想回滚到某天的数据也是很轻松。
- 与AOF相比,RDB允许大型数据集更快地重启。
- RDB最大限度地提高了Redis的性能,因为Redis父进程为了持久化所需要做的唯一工作就是fork一个子进程,后子进程负责将快照写入硬盘,而父进程则继续处理命令请求。
# 缺点
- 可能会丢失数据,如果保存时间间隔设置的比较长,如果出现服务崩溃,那么最近的数据还没有保存快照则丢失了。
- 如果数据量很大,并且CPU性能不佳,那fork出一个子进程可能会很耗时,则可能导致父进程暂停几毫米甚至一秒钟。
# AOF
简单来说,AOF持久化会将被执行的写命令写到AOF文件的末尾,以此来记录数据发生的变化。因此,Redis只要从头到尾重新执行一次AOF文件包含的所有写命令,就可以恢复AOF文件所记录的数据集。
# 使用AOF
配置文件中编辑
#启用AOF
appendonly yes
#设置文件名称,文件夹同RDB的一样,也是dir指定
appendfilename appendonly.aof
#执行同步到文件的三种频率,如果不知道就使用erverysec
# appendfsync always
appendfsync everysec
# appendfsync no
#当AOF文件的体积大于64MB,并且AOF文件的体积比上一次重写之后的体积大了至少一倍(100%)的时候,Redis将执行bgrewriteaof命令。
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
注意:
- 如果使用了 appendfsync always,那么每次执行指令都会写入文件,这样可能照成大量的磁盘IO。
- 如果使用了appendfsync no,那么Redis将不对AOF文件执行任何显式的同步操作,而是由操作系统来决定应该在何时对AOF文件进行同步。这个选项在一般情况下不会对Redis的性能带来影响,但系统崩溃将导致使用这种选项的Redis服务器丢失不定数量的数据。另外,如果用户的硬盘处理写入操作的速度不够快的话,那么当缓冲区被等待写入硬盘的数据填满时,Redis的写入操作将被阻塞,并导致Redis处理命令请求的速度变慢。因为这个原因,一般来说并不推荐使用。
手动重写AOF,会删除冗余命令,减少文件大小。
bgrewriteaof
1
# 优点
- 服务崩溃时候数据丢失比较小,只丢失1秒钟。
- AOF日志是仅追加的日志,因此,如果断电,则不会出现寻道或损坏问题。即使由于某种原因(磁盘已满或其他原因)以半写命令结束日志,redis-check-aof工具也可以轻松修复它。
- AOF以易于理解和解析的格式包含所有操作的日志。您甚至可以轻松导出AOF文件。
- 误删恢复,比如执行了flushall命令则可以用这个aof文件恢复
# 缺点
- 文件体积比RDB大。也会导致数据还原时间会很长。
- 因为AOF重写也会fork子进程,那么耗时问题还是存在,这个时候如果去rewrite一个很大的AOF文件,那么删除文件可能就会导致操作系统挂起数秒。
- 根据确切的fsync策略,AOF可能比RDB慢。
# 总结
- RDB持久性按指定的时间间隔保存内存中这个时间点的数据快照
- AOF就是记录每次写命令到文件,下次启动的时候从文件中读取再重新执行一次。
RDB和AOF可以同时工作,但是启动的时候会使用AOF文件来重建数据集。根据特性选择合适的策略。
# 参考
在 GitHub 编辑此页 (opens new window)
上次更新: 2024/02/25, 12:11:11