Dawn's Blogs

分享技术 记录成长

0%

Redis学习 (5) 持久化

Redis提供了两种不同形式的持久化方式:

  • RDB(Redis Database)
  • AOF(Append Only File)

RDB(Redis Database)

RDB持久化指在指定的时间间隔内将内存中的数据集快照写入磁盘。它也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb

对于RDB来说,提供了三种机制:

  • save
  • bgsave
  • 自动化

save

save会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。

bgsave

Redis会fork一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。阻塞只发生在fork阶段,一般时间很短。

bgsave

自动触发

自动触发是通过配置文件完成的,通过规定一定时间间隔内的修改次数来自动触发bgsave:

1
2
3
4
5
6
7
8
9
10
11
12
# Save the DB on disk:
#
# save <seconds> <changes>
# 表示seconds秒内发生changes次修改时,自动触发bgsave

# 以下是默认配置
# after 900 sec (15 min) if at least 1 key changed
# after 300 sec (5 min) if at least 10 keys changed
# after 60 sec if at least 10000 keys changed
save 900 1
save 300 10
save 60 10000

总结

如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失

  • 优势:
    • 适合大规模的数据恢复
    • 对数据完整性和一致性要求不高更适合使用
    • 节省磁盘空间
    • 恢复速度
  • 劣势:
    • 因为是按照一定时间间隔进行备份,如果Redis意外down掉,会丢失最后一次快照后的所有修改

AOF(Append Only File)

RDB是一种全量备份,AOF以日志的形式来记录每个写操作(增量备份),将Redis执行过的所有写指令记录下来(读操作不记录),只允许追加文件但不允许改写文件。默认文件名为appendonly.aof

Redis启动之初会读取该文件重新构建数据,即Redis启动之后就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

若AOF和RDB同时开启,默认读取AOF的数据

AOF持久化流程

  1. 客户端的请求写命令会被追加到AOF缓冲内
  2. AOF缓冲区根据AOF持久化策略appendfsyncalways,everysec,no)将写操作同步到磁盘的AOF文件中
    • always:同步持久化,每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好
    • everysec:异步操作,每秒记录。如果一秒内宕机,有数据丢失
    • no:不主动进行同步,把同步时机交给操作系统
  3. AOF文件大小超过重写策略或手动重写时,会对AOF文件重写,压缩AOF文件容量
  4. Redis服务重启时,会重新加载AOF文件中的写操作达到数据恢复的目的

AOF持久化流程

文件重写

因为AOF只允许对AOF日志文件进行追加操作,随着时间的推移,持久化文件会变的越来越大。为了压缩AOF持久化文件,Redis提供了bgrewriteaof命令,将内存中的数据以命令的方式保存到临时文件中,同时会fork出一条新进程来将文件重写

AOF重写

重写完成后,用临时文件去替换旧的AOF文件。

总结

  • 优势:
    • 备份机制更稳健,丢失数据概率更低
    • AOF日志文件的命令通过可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。比如某人不小心使用了flushall清空了所有数据库,只有重写操作还没有发生,那么就可以立即拷贝AOF文件,将最后一条flushall命令给删了,然后再将该AOF文件放回去,就可以通过恢复机制,自动恢复所有数据
  • 劣势
    • 比起RDB占用更多的磁盘空间
    • 恢复备份速度慢
    • 每次读写都同步的话,有一定的性能压力

混合持久化

RDB 数据恢复速度快,但是容易丢失数据;AOF 更加安全,但是恢复速度慢。所以可以将 AOF 和 RDB 混合使用,称之为混合持久化。混合持久化工作在 AOF 日志重写过程。当开启了混合持久化时,在 AOF 重写日志时:

  • fork 出来的重写子进程会首先以 RDB 的方式写入 AOF 文件
  • 主线程处理的操作命令会被记录在重写缓冲区里,重写缓冲区里的增量命令会以 AOF 方式写入到 AOF 文件
  • 写入完成后通知主进程将新的含有 RDB 格式和 AOF 格式的 AOF 文件替换旧的的 AOF 文件

使用了混合持久化,AOF 文件的前半部分是 RDB 格式的全量数据,后半部分是 AOF 格式的增量数据

这样的好处在于:

  • 重启 Redis 加载数据的时候,由于前半部分是 RDB 内容,这样加载的时候速度会很快。
  • 加载完 RDB 的内容后,才会加载后半部分的 AOF 内容,这里的内容是 Redis 后台子进程重写 AOF 期间,主线程处理的操作命令,可以使得数据更少的丢失。