关于Redis中持久化机制RDB

关于Redis中持久化机制RDB

引言:这是我参与新手入门的第2篇文章

Redis中有两种持久化方案,RDB(Redis DataBase)和AOF(Append Only File)。本文较为基础的讲解一下RDB的机制。
复制代码

RDB简介

RDB是什么?

RDB是Redis用来持久化的一种方式,其通过在指定时间间隔内将内存中的数据集快照写入磁盘,也就是Snapshot快照,它恢复时是将文件直接读取到内存中。

其备份是如何进行的

Redis 会单独创建(Fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换掉上次持久化的那个文件。 整个过程中主进程不进行任何IO操作,这确保了极高的性能。如果要进行大规模数据的恢复,而且对数据完整性不是那么敏感的话,RDB方式是个不错的选择,不过RDB最后一次持久化后的数据有可能会丢失

如RDB还在进行持久化操作,并且已经备份到最后一次操作了,当RDB读取到一半的时候,Redis突然崩溃了,RDB无法从Redis中读取到数据,导致最后一次持久化数据不完全

RDB触发方式

RDB可以设置自动触发和手动触发(默认为自动触发)。

  • save 该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。显然该命令对于内存比较大的实例会造成长时间阻塞,这是致命的缺陷,为了解决此问题,Redis提供了第二种方式。
  • bgsave 执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。具体操作是Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。

相关配置项

image.png

  • save 默认设置是900秒内改动1次或者300秒内改动10次以及60秒内改动10000次就进行快照,当然可以自己设置。

image.png

  • stop-writes-on-bgsave-error 默认值为yes。当启用了RDB最后一次后台保存数据失败,Redis是否停止接收数据。这会让用户意识到数据没有正确持久化到磁盘上,否则没有人会注意到灾难(disaster)发生了。如果Redis重启了,那么又可以重新开始接收数据

  • rdbcompression 默认值是yes。对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,Redis会采用LZF算法进行压缩(简单的说就是将相同类型的指令整合起来进行执行)。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能,但是存储在磁盘上的快照会比较大。

image.png

  • rdbchecksum 默认为yes。存储快照后,数据库启动时候会判断快照是否损坏如果损坏则停止启动。这个可能会损失一部分性能,如果追求最高的性能可以关闭该功能。

RDB文件恢复

当Redis服务器启动时候,如果Redis 根目录存在 RDB 文件 dump.rdb,Redis 就会自动加载 RDB 文件恢复持久化数据。

验证RDB文件是否被加载

如果启动时候RDB文件加载了则会提示该消息
*DB loaded from dis:0.000 seconds

小提示:此外Redis服务器在加载期间会一直处于阻塞状态,直到工作完成为止。

RDB优缺点

RDB优点

  • RDB的内容为二进制的数据,占用内存更小更紧凑,更适合作为备份文件
  • RDB进行数据恢复的速度很快,适合大规模数据恢复
  • RDB采用写时复制技术进行持久化,这也使得在生成RDB文件时候,redis主进程不需要进行任何磁盘IO操作。

RDB劣势

  • RDB数据丢失风险大
  • RDB采用特定二进制格式保存且版本演进过程中有多个格式的RDB版本,存在老版本无法兼容新版本的问题
  • RDB需要经常fork子进程进行保存数据集到硬盘,当数据集比较大时,fork的过程非常耗时,可能导致Redis在一些毫秒级不能响应客户端请求。
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享