在MongoDB中写“fire and forget”的意思是什么

时间:2012-07-19 15:00:04

标签: mongodb

MongoDB的写入机制为fire and forget。但这是否可以保证我的写入最终会被写入磁盘?所以,如果我有这样的声明(在pymongo)

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

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

3 个答案:

答案 0 :(得分:9)

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

只要服务器&网络上升,预计写入会成功。但是,这也意味着您不会发现违反唯一索引等问题。

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

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

答案 1 :(得分:1)

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

请参阅How safe is MongoDB's safe mode on inserts?

答案 2 :(得分:0)

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

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

getLastError numerous other options可以通过safe选项来确保写入使其成为日志(持久),或者在命令返回之前复制。我们通常会告诉人们至少使用日记选项来处理他们关心的内容。