Redis 持久化(RDB / AOF)

352次阅读

Redis 提供了不用类型的持久化选项:

  • RDB(Redis Database): RDB是按照指定的时间间隔执行数据的快照。如果Redis意外退出或机器意外关机,那么在此启动Redis时数据会自动恢复,但是可能会丢失一个时间时间段的数据。
  • AOF (Append Only File): AOF持久化会记录服务器接收到的每个写操作,这些操作会被保存到一个临时的文件中,当Redis重新启动时,会被读入并再次执行。使用与Redis协议本身相同的记录格式,并且采用仅追加的方式。当日志太大时,Redis可以在后台重写日志。

在选择持久化方案的时候,最重要的事情就是在RDB和AOF之间权衡利弊。

Redis – RDB

优势

  • 每隔一段时间会全量备份。
  • 灾备简单,RDB文件非常适合备份。例如,您可能希望在最近的24小时内每小时存档一次RDB文件,并在30天之内每天保存一次RDB快照。这样,在发生灾难时,您可以轻松地还原不同版本的数据集。
  • 会启动子进程进行持久化,不会影响主进程,保证数据的完整性。
  • 与AOF相比,RDB允许使用大型数据集更快地重新启动。

缺点

  • 不适合最大程度地减少数据丢失的可能性(如果Redis停止工作,例如在断电之后),则RDB可能会丢失部分数据。(不能实时备份)
  • RDB需要经常使用fork()才能使用子进程将其持久化在磁盘上。如果数据集很大,fork()可能很耗时,并且如果数据集很大且CPU性能不佳,则可能导致Redis停止为客户端服务几毫秒甚至一秒钟。

配置开启

redis.conf中进行配置

dir /usr/local/redis/    # 设置工作目录,dump.rdb会存在这个目录下
dbfilename dump.rdb      # 设置保存的文件名
rdbcompression yes       # yes开启压缩,会增加cpu的占用,但是文件会小
# 设置保存机制
# save <seconds> <changes>
save 60 1                 # 如果1个缓存更新,则60秒后进行备份
save 300 10               # 如果10个缓存更新,则300秒后进行备份

RDB的方式适合大量数据的恢复,但是数据的完整性和一致性可能会不足。

Redis – AOF

优势

  • 适合实时备份
  • 以日志的形式记录,且是仅追加的日志。因此,如果断电,则不会出现寻道,也不会出现损坏问题。即使由于某种原因(磁盘已满或其他原因)命令写了一半结束了,redis-check-aof工具也可以轻松修复它。
  • 让数据量太大时,Redis可以在后台自动重写AOF。重写是完全安全的,因为Redis继续追加到旧文件时,会生成一个全新的文件,其中包含创建当前数据集所需的最少操作集,一旦准备好第二个文件,Redis会切换这两个文件并开始追加到新的那一个。
  • AOF以易于理解和解析的格式包含所有操作的日志。您甚至可以轻松导出AOF文件。例如,即使您不小心使用 flushall 命令刷新了所有内容,只要在此期间未执行日志重写,您仍然可以通过停止服务器,删除最新命令并重新启动Redis来再次保存数据集。

例子:

redis 127.0.0.1:6379> set key1 Hello
OK
redis 127.0.0.1:6379> append key1 " World!"
(integer) 12
redis 127.0.0.1:6379> del key1
(integer) 1
redis 127.0.0.1:6379> del non_existing_key
(integer) 0

Bash复制

Result :

$ cat appendonly.aof 
*2
$6
SELECT
$1
0
*3
$3
set
$4
key1
$5
Hello
*3
$6
append
$4
key1
$7
 World!
*2
$3
del
$4
key1

缺点

  • 对于同一数据集,AOF文件通常大于等效的RDB文件。
  • 如果开启了AOF每次操作都进行备份而不是设置按秒更新会导致redis性能下降。

配置开启

在 redis.conf中进行配置

appendonly yes                      # 开启AOF
appendfilename "appendonly.aof"     # 设置AOF文件名

appendfsync everysec                # 配置备份方式
# appendfsync everysec   每秒钟进行备份,可能会丢失最后一秒的数据
# appendfsync always     每次有新命令都进行备份,性能较差,能保证数据安全
# appendfsync no         可以理解为不开启

no-appendfsync-on-rewrite no        # 重写的时候是否进行备份,否可以保证数据安全

# 当当前AOF文件大小为上次AOF的100%并且文件大小达到64m,就触发重写
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb  

如何选择

  1. 如果可以接受一段时间的数据丢失,可以选择RDB
  2. 如果需要实时备份,可以选择AOF
  3. 可以同时开启RDB和AOF,实现冷、热备份双保险。
正文完