7

MongoDB 有一个写机制fire and forget。但这能保证我的写入最终会写入磁盘吗?所以如果我有这样的声明(在 pymongo 中)

collection.insert(doc)     #not passing safe=True

我了解我在上述声明中的写入不会立即到达磁盘,但是否可以保证它会到达磁盘(可能是第二天或一周后)或者它会丢失并且永远不会回来。我的应用程序不希望写入同步完成,但他们希望写入即使在几个小时后也能发生。

4

3 回答 3

11

“一劳永逸”(又名 MongoDB 的默认写入)的含义是驱动程序不会与服务器确认写入。您的写入被放置在网络上,驱动程序确认它到达网络传输但过去没有执行其他检查。

只要服务器和网络正常,预计写入就会成功。但是,这也意味着您不会发现诸如违反唯一索引之类的问题。

写入最初发生在内存中,并且至少每 60 秒刷新一次到磁盘。如果你打开了日志,写入将在 100 毫秒内进入日志——这个日志可以在 mongod 重新启动时崩溃的情况下恢复。

如果要验证写入是否已写入 mongod 并成功应用于内存,则应设置 safe=True

于 2012-07-19T15:24:55.590 回答
1

AFAIK Fire and Forget 无法保证 - 如果您需要它们,请使用安全 [这就是它的用途!]

请参阅MongoDB 的插入安全模式有多安全?

于 2012-07-19T15:07:28.993 回答
0

它可能会丢失并且永远不会回来。这可能由于断电、硬件故障或其他环境问题而发生。如果文档违反了某些唯一索引,也会发生这种情况。

safe=True将确保插入时没有任何数据库引擎错误。这使得驱动程序在写入后立即发出getLastError命令,如果写入违反唯一索引或存在一些潜在的 Mongo 问题,它将返回错误。但是,如果您在内存写入和写入日志之间断电,这将无济于事。

您可以通过该选项传递许多其他选项,以确保写入要么进入日志(持久),要么在命令返回之前被复制。我们通常会告诉人们至少在他们关心的文章中使用日记选项。getLastErrorsafe

于 2012-07-19T15:09:25.420 回答