NoSQL中的提交和磁盘持久性(MongoDB)

时间:2014-05-17 01:55:12

标签: mongodb nosql

在NoSQL数据库中我们没有事务(commit)所以我想知道db如何提交持久性?

当我们告诉db只保存对象时,它并不意味着它在磁盘上,刷新缓存应该处理磁盘持久性。我RDBMS事务的提交保证数据在磁盘上,MongoDB或其他NoSQL怎么样?

n,

1 个答案:

答案 0 :(得分:5)

我想知道这个模因的来源。首先, nothing 确实保证了由于所有缓存层而将任何内容写入实际的HDD,甚至传统的RDBMS也不会一直尝试写入文件,否则它们不会如此速度很快,但细节差异很大(例如参见adaptive flushing in InnoDB)。

您应该只关心第一层,这实际上是数据库尝试写入磁盘时的问题。现在有第一个缓存层:许多DB(包括MongoDB)使用日记功能而不是写入实际的表/集合:写入仅附加文件,该文件将定期合并回实际数据文件。在任何事情发生变化,它都在日记中,你很好。

现在的问题是你是否想写日记以及如何去做。在MongoDB中,您可以使用write concern来控制它,即您可以让应用程序代码等到MongoDB写入日志以进行特定写入(或所有写入)。在MongoDB中,如果日志和数据文件位于不同的块设备上,则等待日志提交最多需要10毫秒(如果日志和数据文件位于不同的块设备上),如果它们位于同一块设备上则为33毫秒。如果需要,也可以修改journalCommitInternval

我收集了有关MongoDB的日记in another answer的一些细节。

作为旁注,耐久性与交易并没有多大关系。事务提供隔离和一致性,例如你可以一次改变多个东西,读者可以保证得到新的或旧的,但不能得到一些中间状态。换句话说,事务安全数据库可以是内存数据库,根本不写入磁盘。