确认对MongoDB公认的写作问题有基本的了解

时间:2014-08-18 17:09:33

标签: mongodb pymongo

在默认情况下使用MongoDB(通过PyMongo)"确认"写入关注模式,如果我有一行写入数据库(例如,一个mapReduce输出一个新的集合),然后是一行从DB读取,那么读取将始终看到写入的变化?

此外,对于所有更严格的写作问题,上述情况是否真实,而且承认,"即" journaled"并且"复制品承认,"但在#34;未确认"?

的情况下却不是这样

2 个答案:

答案 0 :(得分:3)

如果写入已被确认,则应将其写入内存,因此任何后续查询都应​​获取当前数据。如果您有副本集并且允许从辅助节点读取,那么这将无法工作。

日志写入被写入磁盘上的日志文件,可以在电源/硬件故障等情况下保护您的数据。这不应该对一致性产生影响,一旦数据进入,就会受到影响。存储器中。

写入关注中的任何副本配置都将确保写入需要由副本集中的大多数/所有节点确认。如果您从副本中读取数据或保护数据不受无法访问/死亡的服务器的影响,这只会产生影响。

答案 1 :(得分:0)

例如,在WiredTiger数据库引擎的情况下,内存中的页面缓存会定期从磁盘写入和读取,具体取决于内存压力。并且,在MMAPV1存储引擎的情况下,将存在与磁盘上的页面对应的存储器映射地址空间。现在,二级结构称为期刊。日志是数据库处理的每一件事的日志 - 注意日志也在内存中。

MongoDB setup

什么时候将日志写入磁盘?

当应用程序通过TCP连接向mongodb服务器请求内容时 - 服务器将处理请求。并且它会将其写入内存页面。但是根据内存压力,它们可能不会写入磁盘很长一段时间。它还将更新请求到期刊。默认情况下,在MongoDB驱动程序中,当我们发出数据库请求时,我们会等待响应。说出公认的插入/更新。但我们不会等待将日志写入磁盘。表示的值 - 我们是否要等待服务器确认此写入被称为 w


w = 1
j = false

默认情况下,它设置为 1 1 表示等待此服务器响应写入。默认情况下, j 等于false,j代表journal,表示在继续之前我们是否等待写入该日志以写入磁盘。那么,这些默认值的含义是什么?好吧,其含义是,当我们进行更新/插入时 - 我们确实在内存中执行操作,而不是在磁盘上执行操作。这意味着,它当然非常快。并定期(每隔几秒)将日志写入磁盘。它不会很长,但是在这个漏洞的窗口中,当数据已经被写入服务器的内存到页面中,但是日志还没有被持久化到磁盘,如果服务器崩溃,我们可能会丢失数据。我们还必须意识到,作为一名程序员,只是因为写回来就好了并且它已成功写入内存。如果服务器随后崩溃,它可能永远不会持久存储到磁盘。这是否是问题取决于应用程序。对于某些应用程序,如果有大量写入和记录少量数据,我们可能会发现,如果我们等待日志写入磁盘,就很难跟上数据流,因为磁盘将是每次写入的100倍,比内存慢1000倍。但是对于其他应用程序,我们可能会发现,我们必须等待记录这一点,并且知道它在我们继续之前已经持久存储到磁盘中。所以,它真的由我们决定。

w j 值一起称为写入问题。它们可以在驱动程序,集合级别,数据库级别或客户端级别设置。

write concerns settings

1:等待写入被确认 0:不要等待写入被确认 TRUE:同步到期刊 FALSE:不要同步到期刊

w 还有其他值也有一些意义。使用w=1& j=true我们可以确保这些写入已经保存到磁盘。现在,如果写入已写入日志,那么如果服务器崩溃会发生什么,那么即使页面可能还没有写回磁盘,在恢复时,服务器也可以查看磁盘上的日志 - mongod处理并重新创建尚未保留到页面的所有写入。因为,他们已被写入期刊。所以,这就是为什么这给了我们更高的安全水平。