Unix Redis RDB持久性在幕后是如何工作的?

Unix Redis RDB持久性在幕后是如何工作的?,unix,process,redis,Unix,Process,Redis,我正在经历Redis RDB持久化。我对RDB持久性有一些怀疑,这与它的缺点有关 迄今为止的理解: 当我们需要以一定的时间间隔保存当前内存中数据集的快照时,应该使用rdb持久性 我可以理解,如果服务器出现故障,我们可能会丢失一些数据。但我无法理解的另一个缺点是,在使用rdb持久化大型数据集时,fork是如何耗时的 引用文献 RDB需要经常分叉,以便使用子级在磁盘上持久化 过程如果数据集很大,Fork可能会很耗时,并且 导致Redis在几毫秒甚至更长的时间内停止为客户端提供服务 如果数据集非常大且

我正在经历Redis RDB持久化。我对RDB持久性有一些怀疑,这与它的缺点有关

迄今为止的理解:

当我们需要以一定的时间间隔保存当前内存中数据集的快照时,应该使用rdb持久性

我可以理解,如果服务器出现故障,我们可能会丢失一些数据。但我无法理解的另一个缺点是,在使用rdb持久化大型数据集时,fork是如何耗时的

引用文献

RDB需要经常分叉,以便使用子级在磁盘上持久化 过程如果数据集很大,Fork可能会很耗时,并且 导致Redis在几毫秒甚至更长的时间内停止为客户端提供服务 如果数据集非常大且CPU性能不稳定,则为1秒 伟大的AOF也需要fork,但您可以调整您希望的频率 重写你的日志,不要在耐用性上做任何权衡

据我所知,当父进程分叉时,我知道分叉是如何工作的。它创建一个新的子进程,我们可以允许子进程根据其pid执行一些代码,或者我们可以使用exec系统调用为它提供一些新的可执行文件

但当数据集的大小更大时,我不明白这将是一项多么繁重的任务

我想我知道答案,但我不确定

引自此链接

当进程调用fork时

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

根据上述声明,整个redis数据集将被复制到child


我理解的对吗?

当使用copy-on-write调用标准fork时,操作系统仍然必须复制所有页表条目,如果有小4k页和大数据集,这可能需要时间,这就是导致实际fork时间变慢的原因

如果您的数据集以稀疏的方式进行大量更改,您也会发现需要大量的时间和内存,因为写入时复制语义会在对原始数据集进行更改时触发要复制的实际内存页。Redis还执行增量重新灰化和维护到期等操作,因此更活跃的实例通常需要更长的时间才能保存到磁盘

更多阅读:


就我个人而言,我更喜欢AOF方法,这种方法更耐用,速度更快。根据我的经验,这两种方法都需要x2内存,但RDB方法需要更多的IO到HD,因此,如果您的DB很大,这将需要时间……我已经回答了为什么fork会慢,为什么RDB save会慢,但您可能希望使您的问题更具体、更不杂乱,并更新您的问题标题。