Mongo的持久化过程
先将内存中的多个写入命令(包括插入,修改操作) 达到一定的时间或空间后,写入到日志系统中的日志文件(硬盘)里, 然后日志文件中的内容 在达到一定时间后,同步到数据文件中,从而保证数据的持久性;
也就是 一个插入操作,需要在内存中 同步到硬盘的日志文件中,再同步到数据文件中 共3个过程;
其中可能存在的 丢失数据的情况 在 内存中的命令同步到日志文件的过程中; mongo默认每100毫秒或达到规定字节时 同步到日志文件, 也就是 顶多有100毫秒的数据会丢失;
Mongo设置绝不丢失数据,及副作用
可以通过设置 强制同步到日志的命令 将 每个写入命令 同步到日志;
命令如下:
db.runCommand({"getLastError":1,'j':true})
此命令 在写入命令同步到日志后,会等待30毫秒,才能进行下一次同步到日志; 因此会限制 写入操作的次数(1s/30毫秒=33次),导致 写入能力下降;
设置 写入命令同步到日志的时间间隔
命令如下:
db.adminCommand({'setParameter':1,'journalCommitInterval':10})
journalCommitInterval参数的值范围为 2-500毫秒; 此值越小,丢失数据越少;
总结
- mongo从内存同步到硬盘 如果保证强持久化,会导致写入能力下降;如果不设置强持久化 会导致 丢失数据的可能; 只能两者之间平衡操作(或根据需求) 将 写入命令同步到日志时间间隔尽量小;