Redis RDB持久性如何在幕后发挥作用?

Redis RDB持久性如何在幕后发挥作用?

问题描述:

我正在经历Redis RDB持久性。我对RDB持久性的缺点有一些疑问。Redis RDB持久性如何在幕后发挥作用?

了解到目前为止:

我们应该用RDB持久性时,我们需要当前内存中保存的数据集的快照在一些固定的时间间隔。

我可以理解,通过这种方式,我们可以在服务器的情况下丢失一些数据崩溃。但另一个我无法理解的缺点是如何使用rdb持久保存大型数据集时,fork可能会非常耗时。

从文档

引用RDB需要常常为了使用子 过程在磁盘上坚持到叉()。 fork()的可能会非常耗时,如果数据集是大的,并且可能 结果Redis的停止服务的客户为一些毫秒或 一个甚至第二,如果数据集是非常大的,并且CPU性能不 很大。 AOF也需要调用fork(),但你可以调整你想要多久 重写你的日志上没有任何耐久性权衡。

我知道叉如何工作按我的知识,当父进程派生它创建一个新的子进程,我们可以允许一些代码,子进程将执行基于它的PID,或者我们可以提供它的一些新的可执行文件,它将使用exec()系统调用。

但是事情,我不明白怎么会是繁重的任务时,数据集的大小比较大?

我想我知道答案,但我不是知道这一点

从这个链接https://www.bottomupcs.com/fork_and_exec.xhtml

引用当一个进程调用fork那么

操作系统将创建一个新的进程,与父进程完全相同。这意味着复制了之前讨论过的所有状态,包括打开文件,寄存器状态和所有内存分配,其中包括程序代码。

根据以上声明,redis的整个数据集将被复制到子项。

难道我的理解对不对?

+0

我个人很喜欢AOF的方法,这种方法更耐用,速度更快。对于我的经验,这两种方法都需要x2内存,但RDB方法需要更多的IO到HD,所以如果你的数据库很大,这将需要时间... – h0x91B

+0

我已经回答了为什么fork可以慢,为什么rdb保存可以很慢,但你可能想让你的问题更加具体,减少喧闹,并更新你的问题标题。 – nnog

当标准叉被称为与写入时复制的操作系统还必须复制所有的页表项,如果你有小的4K页面和一个巨大的数据集可能需要一些时间的时间,这是什么使得实际叉( )时间慢。

如果您的数据集以稀疏方式进行大量更改,您还可以发现大量时间和内存,因为随着写入时复制语义触发了在原始更改时复制的实际内存页面。 Redis还执行增量重新刷新并保持到期等,因此更活跃的实例通常需要更长时间才能保存到磁盘。

更多阅读:

Faster forking of large processes on Linux?

http://kirkwylie.blogspot.co.uk/2008/11/linux-fork-performance-redux-large.html