Mongodb -持久化

来源:互联网 发布:最终幻想14优化 编辑:程序博客网 时间:2024/05/24 04:33

概述

mongodb在写入时会建立一条日志(journal),日志中记载了此次写入操作具体更改的磁盘地址和字节。因此,一旦服务器突然停电,可以在启动时对日志进行重放,从而重新执行哪些停机前没有刷新到磁盘的操作。
数据文件默认每60s刷盘一次。数据文件存放到/data/db/journal目录里。
数据库被正常关闭后,journal日志文件被刷盘,journal被清空。

使用 kill -9 可以模拟mongodb突然停电,宕机

批量提交写入操作

mongodb默认每隔100毫秒或者写入数据达到若干兆字节后,便会将这些操作写入到日志。即mongodb不会在每次写入的时候都写入到日志,而是会成批量的提交更改。因此,在默认设置情况下,mongodb不会丢失超过100毫秒的数据。
因此,在Mongodb中存在丢失数据的可能。

如何实现更持久化的操作

可通过getLastError传递j选项,来确保写入操作的成功。getLastError会等待前一次操作成功的写入到日志中。而日记在下一批操作写入前,只会等待30毫秒,而不是默认的100毫秒。
如:

  db.foo.insert({"x":1});  db.runCommand({"getLastError":1,"j":true})  //the {"x":1} the document is now safely on disk
注:如果使用了getLastError中的j 选项为true,在实际上每秒被限制写入33次。(1次/30毫秒)* (1000毫秒/秒) = 33.3次/秒。如果允许mongodb对大部分数据进行批量写入,而不是每次写入单独提交,则mongodb性能会更好。

优化单次写入操作

提交一次写入操作,会提交这之前的所有操作。
因此,对应50个写入操作,前49使用getLastError中”j”=false的普通操作,最后一次使用getLastError中j=true的操作,如果成功的话,就知道50次写入已安全的写入到磁盘上了。

设定日志提交间隔

调整两次提交间的时间间隔,可减少数据的丢失。调整时间间隔通过以下命令来实现:journalCommitInterval,间隔的范围为(2毫秒-500ms)。
如,设置mongodb每隔10毫秒将写入数据写入到日志文件中。

  db.adminCommand({"setParameter":1,"journalCommitInterval":10});

无论时间间隔设置为多少,使用带”j”:true选项的getLastError命令都会将该值减少到原来的1/3

mongodb限制写入的唯一情况

如果客户端的写入速度超过了日志的刷新速度,mongodb会限制写入操作,知道日记完成磁盘的写入。

mongodb关闭日志系统

在生产环境上不建议这么早,除非数据允许丢失。