MongoDB 有一个写机制fire and forget
。但这能保证我的写入最终会写入磁盘吗?所以如果我有这样的声明(在 pymongo 中)
collection.insert(doc) #not passing safe=True
我了解我在上述声明中的写入不会立即到达磁盘,但是否可以保证它会到达磁盘(可能是第二天或一周后)或者它会丢失并且永远不会回来。我的应用程序不希望写入同步完成,但他们希望写入即使在几个小时后也能发生。
MongoDB 有一个写机制fire and forget
。但这能保证我的写入最终会写入磁盘吗?所以如果我有这样的声明(在 pymongo 中)
collection.insert(doc) #not passing safe=True
我了解我在上述声明中的写入不会立即到达磁盘,但是否可以保证它会到达磁盘(可能是第二天或一周后)或者它会丢失并且永远不会回来。我的应用程序不希望写入同步完成,但他们希望写入即使在几个小时后也能发生。
“一劳永逸”(又名 MongoDB 的默认写入)的含义是驱动程序不会与服务器确认写入。您的写入被放置在网络上,驱动程序确认它到达网络传输但过去没有执行其他检查。
只要服务器和网络正常,预计写入就会成功。但是,这也意味着您不会发现诸如违反唯一索引之类的问题。
写入最初发生在内存中,并且至少每 60 秒刷新一次到磁盘。如果你打开了日志,写入将在 100 毫秒内进入日志——这个日志可以在 mongod 重新启动时崩溃的情况下恢复。
如果要验证写入是否已写入 mongod 并成功应用于内存,则应设置 safe=True
AFAIK Fire and Forget 无法保证 - 如果您需要它们,请使用安全 [这就是它的用途!]
它可能会丢失并且永远不会回来。这可能由于断电、硬件故障或其他环境问题而发生。如果文档违反了某些唯一索引,也会发生这种情况。
safe=True
将确保插入时没有任何数据库引擎错误。这使得驱动程序在写入后立即发出getLastError
命令,如果写入违反唯一索引或存在一些潜在的 Mongo 问题,它将返回错误。但是,如果您在内存写入和写入日志之间断电,这将无济于事。
您可以通过该选项传递许多其他选项,以确保写入要么进入日志(持久),要么在命令返回之前被复制。我们通常会告诉人们至少在他们关心的文章中使用日记选项。getLastError
safe