Redis持久化原理
Redis数据是放在内存中的,如果断电、故障、内存满都会丢失数据。因此,有的时候需要将数据持久化到磁盘中,故障恢复后,将重要的数据重新加载到内存中。一般提供了两种方式:RDB和AOF,抑或两者的结合。以下对两种方式进行阐述和对比优缺点。
RDB
基本概念
RDB是Redis Database的简称,是在指定时间间隔对内存中的数据进行的快照存储,默认生成的文件名为:dump.rdb
使用
- 使用
save
命令,同步操作,将数据持久化到硬盘上,注意此过程无法接收其他操作; - 使用
bgsave
命令,异步操作,fork个子进程持久化。 - 服务器自动触发操作,配置文件如下:
1
2
3
4
5
6# 900s内至少达到一条写命令
save 900 1
# 300s内至少达至10条写命令
save 300 10
# 60s内至少达到10000条写命令
save 60 10000
优点
- RDB 是一个非常紧凑(compact)的文件,它保存了 Redis 在某个时间点上的数据集,并且恢复的速度也很快,非常适合数据备份;
- 通过RDB进行数据备,由于使用子进程生成,所以对Redis服务器性能影响较小。
缺点
- 会丢失一部分数据,还没到备份的时间点,出现故障的情况下,就会丢失上一次备份后的数据;
- 数据集大的时候,造成资源紧张。
AOF
基本概念
AOF(Append-only file)持久化方式,会记录客户端对服务器的每一次写操作命令,并将这些写操作以Redis协议追加保存到以后缀为aof文件末尾,在Redis服务器重启时,会加载并运行aof文件的命令,以达到恢复数据的目的。
使用
需要配置redis.conf
文件:
1 | # 开启aof机制 |
优点
- 你可以设置不同的 fsync 策略,比如无 fsync ,每秒钟一次 fsync ,或者每次执行写入命令时 fsync 。 AOF 的默认策略为每秒钟 fsync 一次,在这种配置下,Redis 仍然可以保持良好的性能,并且就算发生故障停机,也最多只会丢失一秒钟的数据( fsync 会在后台线程执行,所以主线程可以继续努力地处理命令请求)。
- AOF 文件是一个只进行追加操作的日志文件(append only log), 因此对 AOF 文件的写入不需要进行 seek , 即使日志因为某些原因而包含了未写入完整的命令(比如写入时磁盘已满,写入中途停机,等等), redis-check-aof 工具也可以轻易地修复这种问题。
- Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写: 重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合。 整个重写操作是绝对安全的,因为 Redis 在创建新 AOF 文件的过程中,会继续将命令追加到现有的 AOF 文件里面,即使重写过程中发生停机,现有的 AOF 文件也不会丢失。 而一旦新 AOF 文件创建完毕,Redis 就会从旧 AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操作。
- AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松。 导出(export) AOF 文件也非常简单: 举个例子, 如果你不小心执行了 FLUSHALL 命令, 但只要 AOF 文件未被重写, 那么只要停止服务器, 移除 AOF 文件末尾的 FLUSHALL 命令, 并重启 Redis , 就可以将数据集恢复到 FLUSHALL 执行之前的状态。
缺点
- 对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积。
- 根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB 。
注意事项
AOF文件出错了怎么办,正在写aof,服务器宕机,redis重启时就会拒绝载入这个文件,此时的做法是:
- 备份当前的aof文件;
- 命令进行修复
redis-check-aof --fix
; - 使用
diff -u
对比修复前后文件的异同; - 重启redis,等待服务器载入AOF文件,并进行数据恢复。
对比
方式 | RDB | AOF |
---|---|---|
启动优先级 | 低 | 高 |
文件大小 | 小 | 大 |
恢复速度 | 快 | 慢 |
数据安全性 | 会丢失一部分数据 | 由策略决定 |
轻重 | 重 | 轻 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 张国丰!
评论