Mongodb和持久数据

时间:2018-04-16 06:04:45

标签: mongodb persistence

关于Mongo是一个NoSql数据库并考虑到NoSql Dbs对RAM的严重依赖这一事实,我一直想知道在下面的场景中会发生什么?

假设我在服务器中安装了MongoDb,并且我正在记录文档中的付款。例如:

 {
     UserId: "X-123456",
     //Rest of user data,
     Payments: [
        {
            TransactionId: "X-123456"
            //Rest of payment data
        }
     ]
 }

当用户付款并且服务器收到成功的付​​款响应时,在将响应添加到文档后的几秒钟内,电源就会耗尽,服务器将关闭。例如:

 1- Response received at 04.01.01.100
 2- Response added to Mongo Document at 04.01.01.300
 3- Power goes out at 04.01.05.00

在这种情况下,数据会发生什么变化?它会在User文档中保留吗?

2 个答案:

答案 0 :(得分:3)

简短回答:是的,数据仍然可用。

长答案介绍:是的;一方面,MongoDB复杂的日志系统意味着电源必须在50ms内耗尽才能丢失数据。另一方面,如果您使用更高的 writeConcern ,那么您可以确保数据永不丢失

以下是日记的内容:

进入MongoDB数据库的每个更改(可能影响无,一个或多个文档)首先会更改为一系列单文档更改,称为journal。它首先存储在RAM缓冲区中,但该缓冲区每隔50ms写入磁盘。这意味着:

  1. 如果在写入日志缓冲区的数据的50ms内电源耗尽,则数据将丢失。
  2. 50分钟后,日志已写入磁盘。服务器将所有这些日志条目分批写入数据库,大约每60秒;因此,对于最多60秒,您的新数据将在日志中,但尚未在数据库中正确显示。然而,即使现在电力消失,也没关系。服务器在重新启动时会将所有这些日记条目写入数据库 - 即您的数据尚未丢失
  3. 50毫秒的窗口意味着丢失数据的风险很小但并非零。

    以下是writeConcern的内容:

    使用合适的writeConcern(例如j:true)可以完全消除这种风险。这意味着,当您首次从客户端收到更新时,服务器不会向客户端发送确认,直到数据已写入磁盘日志。这意味着,一旦您的客户端从服务器获得肯定确认,那么数据就可以保证安全。

答案 1 :(得分:1)

  

1-于04.01.01.100收到回复   2-响应添加到Mongo文档04.01.01.300
  3-电源于04.01.05.00发出   在这种情况下,数据会发生什么变化?它仍然可以在用户文档中找到吗?

当您使用适当的WriteConcern时,mongodb会确认数据已存储在文档中。在您的情况下,数据仍然可以在用户文档中使用。

WriteConcern此选项上使用w: 1请求确认写入操作已传播到独立mongodb或副本集中的主要内容。 w: 1是MongoDB的默认写入问题。

MongoDB在CAP(一致性可用性分区)定理中代表 CP ,具有一致性MongoDB确保我们保存的数据在我们请求/查询时返回给我们。更多信息 - Mongodb ACID and CAP theorem

MongoDB是一个NoSQL DB,具有很好的能力,能够在给定的时间内编写更多文档 - A sample statistics on insertion

请注意,MongoDB中文档的写入时间取决于

  1. 文档的大小(max size 16MB per document),

  2. WriteConcern我们已指定,

  3. 在插入文档时需要更新的集合索引数

  4. Replica Sets的数量(MongoDB中设置的副本是一组维护相同数据集的mongod进程。副本集提供冗余和高可用性)