当前位置:网站首页>mongoDB 持久化
mongoDB 持久化
2022-06-29 08:17:00 【amateur12】
默认是持久化的
在1.8版本之后开始支持journal,就是我们常说的redo log,用于故障恢复和持久化
在2.0之后的版本,journal都是默认打开的,以确保数据安全
图解:

写入操作会记录journal日志,记录写入操作具体更改的磁盘地址和字节(如果服务器突然崩溃,启动时,journal会重放崩溃前并没有刷新到磁盘上的写操作)
数据文件每隔60s刷新到磁盘上,journal只需要持有60s内的写入数据。journal预分配了几个空文件用于此目的,位于/data/db/journal,命名为_j.0,_j.1等。
MongoDB运行很长时间情况下,在journal目录下,你会看到类似于_j.6217,_j.6218和_j.6219文件。这些文件是当前的journal文件,如果MongoDB一直运行,这些数字会持续增加。当正常关闭MongoDB时,这些文件将被清除,因为正常关机不在需要这些日志。
如果服务器崩溃或kill -9, mongodb再次启动时,会重放journal文件,会输出冗长难懂的检验行,这表明在正常的恢复。
mongod.lock文件,当运行在禁用journal情况下,它是很重要的。
当正常关闭mongod时,会清除mongod.lock文件,下次启动时知道上次是完全关闭的。相反,如果lock文件没有被清除,mongod没有正常的关闭。
如果mongod检测到没有正常的关闭,需要你复制一份数据。然而,有些人已经意识到,可以通过删除这个lock文件来绕过这个检查。但是,不要这么干。在启动时删除lock文件意味着你不知道或不关心你的数据是否已经损坏。除非是这种情况下,请尊重lock文件。
内存中的写入命令达到一定的时间或空间后,写入到日志系统中的日志文件里, 然后日志文件中的内容达到一定时间后,同步到数据文件中,从而保证数据的持久性
从内存同步到硬盘,如果保证强持久化,会导致写入能力下降;如果不设置强持久化,会导致丢失数据的可能; 只能两者之间平衡操作,将写入命令同步到日志的时间间隔尽量缩小
实现更持久的方法:
1.通过 getLastError 传递 j 选项,日记在记录只会等待30毫秒,而不是默认的100毫秒
db.one.insert({title:'123',content:'456'})
db.runCommand({"getLastError":1,'j':true})日志写操作是异步的,默认不会等数据写完后才返回,返回给客户端成功但其写并不一定成功,可以通过使用getLastError命令来保证写是成功的
注:如果使用了getLastError中的 j 选项为true,在实际上每秒被限制写入33次。(1次/30毫秒)* (1000毫秒/秒) = 33.3次/秒。 如果允许mongodb对大部分数据进行批量写入,而不是每次写入单独提交,则mongodb性能会更好。
所以有了优化
提交一次写入操作,会提交这之前的所有操作
即:对应50个写入操作,前49使用getLastError中”j”=false的普通操作,最后一次使用getLastError中j=true的操作,如果成功的话,就知道50次写入已安全的写入到磁盘上了
2.设定日志提交间隔
每隔10毫秒将写入数据写入到日志文件中
db.adminCommand({"setParameter":1,"journalCommitInterval":10});journalCommitInterval参数的值范围为 2-500毫秒; 此值越小,丢失数据越少;
无论时间间隔设置为多少,使用带”j”:true选项的getLastError命令都会将该值减少到原来的1/3
客户端写入操作被限制的唯一情况:
如果客户端的写入速度超过了日志的刷新速度,mongodb会限制写入操作,知道日记完成磁盘的写入
补充:
系统启动时,会将数据文件映射到一块内存区域,称之为Shared view,在不开启journal的系统中,数据直接写入shared view,然后返回,系统每60s刷新这块内存到磁盘,这样,如果断电或down机,就会丢失很多内存中未持久化的数据。
当系统开启了journal功能,系统会再映射一块内存区域供journal使用,称之为private view,mongodb默认每100ms刷新privateView到journal,也就是说,断电或宕机,有可能丢失这100ms数据,一般都是可以忍受的,如果不能忍受,那就用程序写log吧。这也是为什么开启journal后mongod使用的虚拟内存是之前的两倍。
Mongodb的隔离级别是read_uncommitted,不管使用不使用journal,都是以内存中的数据为准,只不过,不开启journal,数据从shared view读取,开启journal,数据从private view读取。
在开启journal的系统中,写操作从请求到写入磁盘共经历5个步骤,在serverStatus()中已经列出各个步骤消耗的时间。
①、Write to privateView
②、prepLogBuffer
③、WritetoJournal
④、WritetoDataFile
⑤、RemaptoPrivateView
总结:
使用journal之后,备份,容灾得到保障,批量提交也使得写入更加快速。我们也需要选用较高级的文件系统和磁盘还有更多的内存来保障journal的良好运行。
边栏推荐
- Mutex mutex
- 二手交易平台碳减排,有了评估标准
- Actual combat memoir starts from webshell to break through the border
- Sed replace value with variable
- P6776-[noi2020] surreal tree
- VMware vcenter/esxi series vulnerability summary
- Target tracking [single target tracking (vot/sot), target detection, pedestrian re identification (re ID)]
- 十大券商账号开户安全吗?是靠谱的吗?
- 重磅发布 | 《FISCO BCOS应用落地指南》
- (pytorch进阶之路三)encoder self attention mask
猜你喜欢

Déclaration de la variable Typescript - - assertion de type

闭关修炼(二十一)Servlet生命周期、service方法源码分析、线程安全问题

【Redis】Redis6学习框架思路和细节

Oracle-子查询

【无标题】

使用adb命令调试夜神模拟器

打印服务IP设置方案

闭关修炼(二十二)session和cookie原理

Set up Jenkins environment and automatically associate packaged project jars for automatic release

51 MCU interrupt and timer counter, based on Puzhong technology hc6800-esv2.0
随机推荐
新版付费塔罗牌测算源码 (附带搭建教程)
Transformer details
A high-frequency problem, three kinds of model thinking to solve this risk control problem
Voice annotation automatic segment alignment tool sppas usage notes
Core development board & debugger
Measure the level of various chess playing activities through ELO mechanism
Oracle-子查询
P6772 [noi2020] gourmet (matrix fast power)
2022 spring summer collection koreano essential reshapes the vitality of fashion
Summary of various series (harmonic, geometric)
The sixth season of 2022 perfect children's model Qingyuan competition area audition came to a successful conclusion
15 things to learn in a year of internship in famous enterprises, so you can avoid detours.
闭关修炼(二十一)Servlet生命周期、service方法源码分析、线程安全问题
Batch processing of experimental contact angle data matlab analysis
Notes on key words in the original English work biography of jobs (VIII) [chapter six]
hostname -f与uname -n的返回值可能不同
(pytorch进阶之路三)encoder self attention mask
闭关修炼(二十五)基础web安全
sql server 用 administrator 权限运行吗?还是以普通用户运行呢?
表格背单词的方法