为什么MongoDB不使用fsync()?

时间:2010-09-17 15:06:03

标签: mongodb database nosql

所以我做了一些研究,发现MongoDB没有做fsync(),这意味着当你告诉数据库写一些东西时,数据库可能会告诉你它的写入,尽管它不是。这不是反对CRUD吗?

如果我是对的,有什么好的理由吗?

2 个答案:

答案 0 :(得分:11)

原因是表现。无需在每次更改时写入磁盘,M​​ongoDB都可以更快地处理更新。

MongoDB会告诉您何时已发送更新,而不是更新已写,因为您可以阅读Verifying Propagation of Writes with getLastError上的文档:

  

注意:当数据已传送到[服务器]时,当前实现将返回。未来的版本将提供更多的交付选项,比如服务器上的物理fsync。

这是针对ACID,更具体地针对D代表耐久性

  

持久性[保证]一旦用户被告知事务成功,事务就不会丢失,事务的数据更改将在系统故障后继续存在,并且所有完整性约束都已得到满足,因此DBMS不需要扭转交易。

ACID属性主要适用于传统的RDBMS系统。 NoSQL系统(包括MongoDB)放弃了一个或多个ACID属性,以实现更好的可伸缩性。在MongoDB的情况下,耐久性已被牺牲,以便在处理大量更新时获得更好的性能。


MongoDB和ACID

大多数ACID属性都是交易级别的担保。事务通常是一组应被视为单个单元的查询。对于performance reasons,MongoDB没有交易概念。因此,大多数ACID属性不适用于MongoDB。

A - 原子性声明交易应该成功还是失败。不允许部分成功;如果部分事务失败,则应回滚整个事务。 MongoDB在文档级别支持atomic operations,但在“事务”级别不支持。

C - 一致性部分是指原子性,但也包括参照完整性。关系数据库负责确保所有外键引用都有效。 MongoDB没有外键概念,因此这个ACID属性不适用。

- 隔离说明不允许两个并发事务相互干扰;如果两个事务尝试修改相同的数据,则第二个事务必须等待第一个事务完成。为此,数据库将锁定数据。 MongoDB没有锁定的概念,因此它不支持多个操作 1)的隔离。单一操作是孤立的。

D - 耐久性如上所述。就ACID-ic耐久性而言,MongoDB不支持真正的耐久性。

现在,您可能认为MongoDB与RDBMS系统相比毫无用处,因为它缺少事务和大多数ACID保证。但是,事务存在的部分原因是关系数据库需要将某些数据视为单个实体,但此数据已标准化为多个表

MongoDB允许您将您的数据存储为单个实体。在大多数情况下,这消除了对外键和引用完整性的需要。您也不需要多查询事务,因为您不需要多个表来更新单个实体。大多数情况下,您只需要更新单个文档,而这些操作在MongoDB中是原子的。

1)根据first comment on this pagedb.eval()为多个操作提供隔离。但是,根据the documentation,您通常希望避免使用db.eval()

答案 1 :(得分:2)

这是相关的吗?

durability: added occasinal file sync
default: sync every 60 seconds, confiruable with syncdelay

http://github.com/mongodb/mongo/commit/c44bff08fd95616302a73e92b48b2853c1fd948d