Mongodb 和持久数据

Mongodb and persistent data

关于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 文档中可用吗?

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
What happens to the data in this case? Will it be still available in the User document?

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

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

MongoDB在CAP(Consistency Availability Partitioning)定理上的CP,通过Consistency MongoDB保证我们保存的数据是正确的当我们请求 it/query 时返回给我们。更多信息 - Mongodb ACID and CAP theorem

MongoDB 一个 NoSQL 数据库,具有在给定秒内写入更多文档的良好能力 - A sample statistics on insertion

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

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

  2. WriteConcern我们指定了,

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

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

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

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

记录日志的过程如下:

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

  1. 如果在将数据写入日志缓冲区后 50 毫秒内断电,则数据将丢失。
  2. 50 毫秒后,日志已写入磁盘。服务器将所有这些日志条目分批写入数据库中,大约每 60 秒一次;所以最多 60 秒你的新数据在日志中,但还没有在数据库中。不过,就算现在停电了,也没关系。服务器在重新启动时会将所有这些日志条目写入数据库 - 即 您的数据没有丢失

50 毫秒 window 意味着丢失数据的风险很小但非零。

writeConcern 的情况如下:

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