MongoDB数据存储-深入了解

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
日志服务 SLS,月写入数据量 50GB 1个月
简介:

             "xprev"  "null"
             "nsdiag"  "test.sample"
             "size"  : 8192, 
             "firstRecord"  "0:50b0"
             "lastRecord"  "0:6cb0" 
         }, 
         ... 
        
         ... 
 
可以看到extents在逻辑上是链表形式,以及每个extent的数据量、以及所在data  file 的offset位置.
从上面介绍中已经得知,删除document会导致磁盘碎片,有些update也会导致磁盘碎片,比如update导致文档尺寸变大,进而超过原来分配的空间;当有新的insert操作时,
mongodb会检测现有的extents中是否合适的碎片空间可以被重用,如果有,则重用这些fragment,否则分配新的存储空间。磁盘碎片,对write操作有一定的性能影响,而且
会导致磁盘空间浪费;如果你需要删除某个collection中大部分数据,则可以考虑将有效数据先转存到新的collection,然后直接drop()原有的collection。或者使用
db.runCommand({compact:  '<collection>' })。
 
如果你的database已经运行一段时间,数据已经有很大的磁盘碎片(storageSize与dataSize比较),可以通过mongodump将指定database的所有数据导出,然后将原有的db删除,
再通过mongorestore指令将数据重新导入。(同compact,这种操作需要停机维护)
  
mongod中还有2个默认的database,系统级的, "admin" "local" ;它们的存储原理同上,其中 "admin" 用于存储 "用户授权信息" ,比如每个database中用户的role、权限等;
"local" 即为本地数据库,我们常说的oplog(replication架构中使用,类似与binlog)即保存在此数据库中。
 
 
2)Namespace文件
对于namespace文件,比如 "test.ns" 文件,默认大小为16M,此文件中主要用于保存 "collection" 、index的命名信息,比如collection的 "属性" 信息、每个索引的属性类型等,
如果你的database中需要存储大量的collection(比如每一小时生成一个collection,在数据分析应用中),那么我们可以通过配置文件 "nsSize" 选项来指定。
 
3)journal文件
journal日志为mongodb提供了数据保障能力,它本质上与mysql binlog没有太大区别,用于当mongodb异常crash后,重启时进行数据恢复;这归结于mongodb的数据持久写入
磁盘是滞后的。默认情况下, "journal" 特性是开启的,特别在production环境中,我们没有理由来关闭它。(除非,数据丢失对应用而言,是无关紧要的)
 
 
一个mongodb实例中所有的databases共享journal文件。
对于write操作而言,首先写入journal日志,然后将数据在内存中修改(mmap),此后后台线程间歇性的将内存中变更的数据flush到底层的data files中,时间间隔为60秒;
write操作在journal文件中是有序的,为了提升性能,write将会首先写入journal日志的内存buffer中,当buffer数据达到100M或者每隔100毫秒,buffer中的数据将会flush
到磁盘中的journal文件中;如果mongodb异常退出,将可能导致最多100M数据或者最近100ms内的数据丢失,flush磁盘的时间间隔有配置项 "commitIntervalMs" 决定,默认为
100毫秒。mongodb之所以不能对每个write都将journal同步磁盘,这也是对性能的考虑,mysql的binlog也采用了类似的权衡方式。开启journal日志功能,将会导致write性能
有所降低,可能降低5~30%,因为它直接加剧了磁盘的写入负载,我们可以将journal日志单独放置在其他磁盘驱动器中来提高写入并发能力(与data files分别使用不同的
磁盘驱动器)。
  
如果希望数据尽可能的不丢失,可以考虑:
1)减小commitIntervalMs的值
2)每个write指定 "write concern" 中指定 "j" 参数为 true 
3)最佳手段就是采用 "replica set" 架构模式,通过数据备份方式解决,同时还需要在 "write concern" 中指定 "w" 选项,且保障级别不低于 "majority"
最终需要在 "写入性能" "数据一致性" 两个方面权衡,即CAP理论。
  
根据write并发量,journal日志文件为1G,如果指定了smallFiles配置项,则最大为128M,和data files一样journal文件也采用了 "preallocated" 方式,journal日志保存在
dbpath下 "journal" 子目录中,一般会有三个journal文件,每个journal文件格式类似于 "j._<序列数字>" 。并不是每次buffer flush都生成一个新的journal日志,而是当前
journal文件即将满时会预创建一个新的文件,journal文件中保存了write操作的记录,每条记录中包含write操作内容之外,还包含一个 "lsn" (last sequence number),
表示此记录的ID;此外我们会发现在journal目录下,还有一个 "lsn" 文件,这个文件非常小,只保存了一个数字,当write变更的数据被flush到磁盘中的data files后,也
意味着这些数据已经持久化了,那么它们在 "异常恢复" 时也不需要了,那么其对应的journal日志将可以删除, "lsn" 文件中记录的就是write持久化的最后一个journal记录的ID,
此ID之前的write操作已经被持久写入data files,此ID之前的journal在 "异常恢复" 时则不需要关注;如果某个journal文件中最大 ID小于 "lsn" ,则此journal可以被删除或者重用。
***************当你发现自己的才华撑不起野心时,就请安静下来学习吧***************

本文转自散尽浮华博客园博客,原文链接:http://www.cnblogs.com/kevingrace/p/7909947.html,如需转载请自行联系原作者
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
7月前
|
存储 JSON NoSQL
【MongoDB】MongoDB的数据存储格式
【4月更文挑战第1天】【MongoDB】MongoDB的数据存储格式
|
存储 JSON NoSQL
『MongoDB』MongoDB的数据存储格式Bson比Json有哪些优势?
📣读完这篇文章里你能收获到 - MongoDB存储数据格式BSON介绍 - 使用Bson格式的三大优势
804 1
『MongoDB』MongoDB的数据存储格式Bson比Json有哪些优势?
|
4月前
|
存储 监控 NoSQL
震撼!揭秘高可用 MongoDB 分片集群搭建的神秘魔法,开启数据存储的无敌模式!
【8月更文挑战第9天】在数字化时代,数据至关重要。MongoDB作为流行非关系型数据库,通过搭建高可用分片集群确保系统稳定性和性能。分片技术将大数据集分布于多服务器以实现水平扩展。搭建集群需准备服务器资源,配置环境,启动配置服务器、路由服务器及分片服务器,并设置分片策略。例如,对特定数据库和集合启用分片。此架构适用于高流量应用如大型电商平台,确保数据高效处理和高可用性。搭建过程需持续监控和优化,合理规划分片策略以维持系统稳定运行。
40 3
|
4月前
|
Java 前端开发 Spring
技术融合新潮流!Vaadin携手Spring Boot、React、Angular,引领Web开发变革,你准备好了吗?
【8月更文挑战第31天】本文探讨了Vaadin与Spring Boot、React及Angular等主流技术栈的最佳融合实践。Vaadin作为现代Java Web框架,与其他技术栈结合能更好地满足复杂应用需求。文中通过示例代码展示了如何在Spring Boot项目中集成Vaadin,以及如何在Vaadin项目中使用React和Angular组件,充分发挥各技术栈的优势,提升开发效率和用户体验。开发者可根据具体需求选择合适的技术组合。
83 0
|
6月前
|
存储 数据采集 NoSQL
Scrapy与MongoDB的异步数据存储
在数据采集过程中,处理大量的数据请求和存储任务是常见的需求。使用Scrapy来爬取数据并将其存储到MongoDB中是一个高效的解决方案。本文将介绍如何实现一个异步插入MongoDB的Scrapy管道。
|
7月前
|
存储 监控 NoSQL
数据存储与分析:办公室电脑屏幕监控的MongoDB应用实例
在当今数字时代,数据的存储和分析变得愈发重要,尤其是在办公环境中,对电脑屏幕进行监控成为一种日益普遍的需求。本文将介绍如何利用MongoDB数据库实现办公室电脑屏幕监控,并通过代码实例展示其应用。
259 0
|
存储 JSON NoSQL
大数据数据存储的数据库的非关系型数据库之MongoDB
当今互联网时代,数据的处理和管理已成为各行各业必不可少的一部分。尤其是在大数据领域,数据存储更是至关重要。传统关系型数据库在某些场景下并不能完全满足需求,这时非关系型数据库就应运而生。其中MongoDB作为一个非常受欢迎的非关系型数据库,备受大家关注。本文将介绍MongoDB的概念、特点以及使用方法。
129 0
|
存储 NoSQL MongoDB
MongoDB数据存储-深入了解
https://www.cnblogs.com/kevingrace/p/7909947.html
744 0
|
存储 NoSQL 物联网
全新版本MongoDB数据存储席卷物联网
8月9日2016云栖大会北京峰会拉开帷幕,阿里云数据库技术组专家张友东(林青)带来了“MongoDB在物联网行业数据存储实战经验”的重要演讲。其中首先对物联网进行了模型抽象,着重和大家剖析了MongoDB解决方案,包括文档模型、高可用复制集、分片集群和Aggregation&MapReduce,最后
9351 0