关于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
文档中保留吗?
答案 0 :(得分:3)
简短回答:是的,数据仍然可用。
长答案介绍:是的;一方面,MongoDB复杂的日志系统意味着电源必须在50ms内耗尽才能丢失数据。另一方面,如果您使用更高的 writeConcern ,那么您可以确保数据永不丢失。
以下是日记的内容:
进入MongoDB数据库的每个更改(可能影响无,一个或多个文档)首先会更改为一系列单文档更改,称为journal。它首先存储在RAM缓冲区中,但该缓冲区每隔50ms写入磁盘。这意味着:
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中文档的写入时间取决于
文档的大小(max size 16MB per document),
WriteConcern我们已指定,
在插入文档时需要更新的集合索引数
Replica Sets的数量(MongoDB中设置的副本是一组维护相同数据集的mongod进程。副本集提供冗余和高可用性)