gpt4 book ai didi

mongodb - MongoDB 日志是否保证持久性?

转载 作者:IT老高 更新时间:2023-10-28 13:13:01 26 4
gpt4 key购买 nike

即使打开了日志,在 MongoDB 中是否还有机会丢失写入?

“默认情况下,丢失写入的最大程度,即那些未写入日志的写入,是在最后 100 毫秒内写入的写入。”

这是来自 Manage Journaling ,这表明您可能会丢失自上次将日志刷新到磁盘以来所做的写入。

如果我想要更多的持久性,“要强制 mongod 更频繁地提交日志,可以指定 j:true。当一个带有 j:true 的写操作处于挂起状态时,mongod 会将 journalCommitInterval 减少到设置值的三分之一。”

即使在这种情况下,将日志刷新到磁盘似乎也是异步的,因此仍有可能丢失写入。我是否遗漏了有关如何保证写入不会丢失的内容?

最佳答案

发布一个新的答案来清理这个问题。我进行了测试并再次阅读了源代码,我确信愤怒来自 write concern documentation 中的一个不幸的句子。 .启用日记功能和 j:true 写入关注点后,写入是持久的,并且没有神秘的数据丢失窗口。

Even if journaling is on, is there still a chance to lose writes in MongoDB?

是的,因为持久性还取决于各个操作的写入关注点。

"By default, the greatest extent of lost writes, i.e., those not made to the journal, are those made in the last 100 milliseconds."

This is from Manage Journaling, which indicates you could lose writes made since the last time the journal was flushed to disk.

没错。日志由一个单独的线程异步刷新,因此您可能会丢失自上次刷新以来的所有内容。

If I want more durability, "To force mongod to commit to the journal more frequently, you can specify j:true. When a write operation with j:true is pending, mongod will reduce journalCommitInterval to a third of the set value."

这也激怒了我。这是它的意思:

当您使用 j:true 发送写入操作时,它不会立即触发磁盘刷新,也不会在网络线程上触发。这是有道理的,因为可能有几十个应用程序与同一个 mongod 实例通信。如果每个应用程序都大量使用日志,那么 db 会非常慢,因为它一直在 fsync。

相反,“持久性线程”将接收所有未决的日志提交并将它们刷新到磁盘。线程是这样实现的(我的评论):

sleepmillis(oneThird); //dur.cpp, line 801
for( unsigned i = 1; i <= 2; i++ ) {
// break, if any j:true write is pending
if( commitJob._notify.nWaiting() )
break;
// or the number of bytes is greater than some threshold
if( commitJob.bytes() > UncommittedBytesLimit / 2 )
break;
// otherwise, sleep another third
sleepmillis(oneThird);
}

// fsync all pending writes
durThreadGroupCommit();

所以一个挂起的 j:true 操作将导致日志提交线程比正常情况更早提交,并且它将所有挂起的写入提交到日志,包括那些没有 j:true 设置。

Even in this case, it looks like flushing the journal to disk is asynchronous so there is still a chance to lose writes. Am I missing something about how to guarantee that writes are not lost?

带有 j:true 日志写入问题的写入(或 getLastError 命令)将等待持久性线程完成同步,所以没有数据丢失的风险(只要操作系统和硬件保证)。

句子“但是,当写入操作不完全持久时,日志提交之间存在一个窗口”可能是指在启用日志的情况下运行的 mongod 接受 NOT 使用 j:true 写关注。在这种情况下,自上次日志提交以来写入可能会丢失。

我提交了 docs bug report为此。

关于mongodb - MongoDB 日志是否保证持久性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18488209/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com