Mongodb 和持久化数据

Arr*_*rrr 1 persistence mongodb

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

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

 {
     UserId: "X-123456",
     //Rest of user data,
     Payments: [
        {
            TransactionId: "X-123456"
            //Rest of payment data
        }
     ]
 }
Run Code Online (Sandbox Code Playgroud)

当用户付款时,服务器收到付款成功响应,在响应添加到文档后大约几秒钟内,电源熄灭,服务器关闭。例如:

 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
Run Code Online (Sandbox Code Playgroud)

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

Vin*_*ren 5

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

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

以下是日记的内容:

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

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

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

以下是 writeConcern 的情况:

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