深入了解MongoDB如何存储数据之前,有一个概念必须清楚,那就是Memeory-Mapped Files。
Memeory-Mapped Files
下图展示了数据库是如何跟底层系统打交道的。
- 内存映射文件是OS通过mmap在内存中创建一个数据文件,这样就把文件映射到一个虚拟内存的区域。
- 虚拟内存对于进程来说,是一个物理内存的抽象,寻址空间大小为2^64
- 操作系统通过mmap来把进程所需的所有数据映射到这个地址空间(红线),然后再把当前需要处理的数据映射到物理内存(灰线)
- 当进程访问某个数据时,如果数据不在虚拟内存里,触发page fault,然后OS从硬盘里把数据加载进虚拟内存和物理内存
- 如果物理内存满了,触发swap-out操作,这时有些数据就需要写回磁盘,如果是纯粹的内存数据,写回swap分区,如果不是就写回磁盘。
MongoDB的存储模型
- 有了内存映射文件,要访问的数据就好像都在内存里面,简单化了MongoDB访问和修改数据的逻辑
- MongoDB读写都只是和虚拟内存打交道,剩下都交给OS打理
- 虚拟内存大小=所有文件大小+其他一些开销(连接,堆栈)
- 如果journal开启,虚拟内存大小差不多翻番
- 使用MMF的好处1:不用自己管理内存和磁盘调度2:LRU策略3:重启过程中,Cache依然在。
- 使用MMF的坏处1:RAM使用会受磁盘碎片的影响,高预读也会影响2:无法自己优化调度算法,只能使用LRU
- 磁盘上的文件是有extent构成,分配集合空间的时候也是以extent为单位进行分配的
- 一个集合有一个或者多个etent
- ns文件里面命名空间记录指向那个集合的第一个extent
数据文件与空间分配
当创建数据库时(其实MongoDB没有显式创建数据库的方法,在向数据库中的集合写入数据时会自动创建该数据库),MongoDB会在磁盘上分配一组数据文件,所有集合,索引和数据库的其他元数据都保存在这些文件里。数据文件被放在启动时指定的dbpath里,默认放入/data/db下面。典型的一个文件组织结构如下:
$ cat /data/db $ ls -al -rw------- 1 root root 16777216 09-18 00:54 local.ns -rw------- 1 root root 67108864 09-18 00:54 local.0 -rw------- 1 root root 2146435072 09-18 00:55 local.1 -rw------- 1 root root 2146435072 09-18 00:56 local.2 -rw------- 1 root root 2146435072 09-18 00:57 local.3 -rw------- 1 root root 2146435072 09-18 00:58 local.4 -rw------- 1 root root 2146435072 09-18 00:59 local.5 -rw------- 1 root root 2146435072 09-18 01:01 local.6 -rw------- 1 root root 2146435072 09-18 01:02 local.7 -rw------- 1 root root 2146435072 09-18 01:03 local.8 -rw------- 1 root root 2146435072 09-18 01:04 local.9 -rw------- 1 root root 2146435072 09-18 01:05 local.10 -rw------- 1 root root 16777216 09-18 01:06 test.ns -rw------- 1 root root 67108864 09-18 01:06 test.0 -rw------- 1 root root 134217728 09-18 01:06 test.1 -rw------- 1 root root 268435456 09-18 01:06 test.2 -rw------- 1 root root 536870912 09-18 01:06 test.3 -rw------- 1 root root 1073741824 09-18 01:07 test.4 -rw------- 1 root root 2146435072 09-18 01:07 test.5 -rw------- 1 root root 2146435072 09-18 01:09 test.6 -rw------- 1 root root 2146435072 09-18 01:11 test.7 -rw------- 1 root root 2146435072 09-18 01:13 test.8 ... -rwxr-xr-x 1 root root 6 09-18 13:54 mongod.lock drwxr-xr-x 2 root root 4096 11-13 18:39 journal drwxr-xr-x 2 root root 4096 11-13 19:02 _tmp
- mongod.lock中存储了服务器的进程ID,是一个进程锁定文件。数据文件是依据所属的数据库命名的。
- test.ns是第一个生成的文件(ns扩展名就是namespace的意思),数据库中的每个集合和索引都有自己的命名空间,每个命名空间的元数据都存放在这个文件里。默认情况下,.ns文件大小固定在16MB,大约可以存储24000个命名空间。也就是说数据库中的索引和集合总数不能超过24000,该值可以通过mongod的--nssize选项进行定制。
- 像test.0这样以0开始的整数结尾的文件就是集合和索引数据文件。刚开始的时候,即使只有一条数据,MongoDB也会预分配几个文件,这种预分配的做法,能让数据尽可能连续存储,减少磁盘碎片。在像数据库添加数据时,MongoDB会分配更多的数据文件。每个新数据文件的大小都是上一个已分配文件的两倍(64M->128M->256M),直到预分配文件大小的上限2G。此处基于一个假设,如果总数据大小呈恒定速率增长,应该逐渐增加数据文件分配的空间。当然这个预分配策略也是可以通过--noprealloc关掉,但是不建议在production环境下使用。
- 默认的local数据库,该数据库不参与replication。当mongod是一个副本集的成员时,在local数据库中就有一个叫做oplog.rs的预分配的capped集合,预分配的大小为磁盘空间的5%。这个大小可以通过--oplogSize进行调整。oplog主要用于副本集Primary和Secondary成员见的replication,它的大小限制了两个副本集之间,在重新完全同步之前,允许多长时间不同步。
- journal目录,journal功能2.4版本默认是开启的。
- 可以使用db.stats()来确认已使用空间和已分配空间。
-
{ "db" : "test", "collections" : 37, "objects" : 317894523, #文档总个数 "avgObjSize" : 232.3416429039893, #单位是字节 "dataSize" : 73860135744, #集合中所有数据实际大小(包括padding factor为每个文档分配的额外空间以允许文档增长)。该值在文档size变小的时候,这个值不会减少,除非文档被删除,或者执行compact或者repairDatabase操作 "storageSize" : 97834319392, #分配给集合的空间大小(包括为集合增长预留的额外空间和未分配的已删除空间,即不会因为文档size变小或者删除而减小),实际上从数据文件中分配给集合的空间是以块为单位,也称之为extents,即分配的extents的大小 "numExtents" : 385, "indexes" : 86, "indexSize" : 58687466992, "fileSize" : 182380920832, #所有数据文件大小之和,不包括命名空间文件(ns文件) "nsSizeMB" : 16, "dataFileVersion" : { "major" : 4, "minor" : 5 }, "ok" : 1 }
- 使用db.accesslog.stats()确认某个集合的使用量
-
{ "ns" : "test.accesslog", "count" : 145352932, "size" : 37060264352, #实际数据大小,不包括索引 "avgObjSize" : 254.967435758365, "storageSize" : 45794676448, #预分配的数据存储空间 "numExtents" : 42, "nindexes" : 4, "lastExtentSize" : 2146426864, "paddingFactor" : 1, #当文档因更新size增长时事先padding可以提速,减少碎片的产生 "systemFlags" : 1, "userFlags" : 0, "totalIndexSize" : 31897944512, "indexSizes" : { "_id_" : 6722168208, "action_1_time_1" : 8606482752, "gz_id_1_action_1_time_1" : 10753778336, "time_1" : 5815515216 }, "ok" : 1 } http://www.cnblogs.com/foxracle/p/3421893.html
相关推荐
Node.js 实践: 使用 MongoDB 存储数据 MongoDB命令行工具的使用 在项目中如何有效组织和使用Mongoose
在Asp.Net MVC框架中使用MongoDB存储数据是一种常见的做法,因为MongoDB作为一个NoSQL数据库,提供了非结构化数据的高效存储和查询能力。本文将深入探讨如何在Asp.Net MVC项目中集成MongoDB,包括安装必要的库、配置...
MongoDB提供了强大的空间数据存储功能,能够存储大量的矢量数据。MongoDB矢量数据存储方式有多种,包括GeoJSON、WKT等。 三、Geoserver连接MongoDB Geoserver可以连接MongoDB数据库,实现矢量数据的存储和发布。...
MongoDB的数据中心感知性允许企业以符合法律法规的方式存储和处理数据。 7. 跨区域复制:MongoDB Atlas云数据库服务提供了跨区域复制功能,允许用户在多个地理区域之间复制数据,从而确保业务的连续性和数据的高...
MongoDB使用JSON格式的文档(BSON)作为其数据存储单位,这种格式易于理解和处理,尤其适合处理结构松散或半结构化数据。数据库由集合组成,集合又由文档构成。它支持丰富的查询语法,可以进行复杂的聚合操作,同时...
本文主要介绍了关于MongoDB存储数据的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 想要深入了解MongoDB如何存储数据之前,有一个概念必须清楚,那就是Memeory-Mapped Files。 Memeory-Mapped ...
4. 序列化和反序列化:由于MongoDB存储的是JSON格式,因此需要将.NET对象转换为BSON(Binary JSON)格式,反之亦然。 5. 错误处理和事务:处理可能的网络错误和异常,并理解MongoDB不支持多文档ACID事务,但可以使用...
1. **文档数据库**:MongoDB存储数据以JSON(JavaScript Object Notation)格式的文档形式,这使得数据结构灵活,可以方便地存储复杂的数据类型如数组和嵌套对象。 2. **集合和数据库**:在MongoDB中,数据存储在...
**标题解析:** "Pure JS (4.1): 使用 MongoDB 进行数据存储和管理" 暗示本文将探讨如何使用纯JavaScript与MongoDB数据库进行交互,以实现数据的存储和管理,而不依赖任何特定的前端或后端框架。 **描述分析:** ...
- **灵活数据模型**:MongoDB支持文档型数据模型,允许快速存储和查询复杂结构的数据,非常适合处理半结构化和非结构化数据。 - **高吞吐、高并发**:MongoDB能够处理大量并发请求,提供高性能的服务。 - **动态...
在MongoDB中,元数据存储在特定的系统集合中,这些集合以dbname.system.*的形式命名,其中dbname代表数据库的名称。下面是一些重要的系统命名空间: 1. dbname.system.namespaces:这个集合记录了数据库中的所有...
MongoDB是一种非关系型数据库系统,它使用JSON风格的数据存储方式(称为BSON格式),这使得数据存储更加灵活高效。MongoDB支持动态查询、索引、聚合等多种功能,特别适用于需要处理大量复杂数据的应用场景。 #### ...
MongoDB 使用 BSON(类似 JSON 的数据格式)来存储数据,支持丰富的数据类型和索引。 二、MongoDB 安装和配置 要使用 MongoDB,首先需要安装 MongoDB 服务器。可以从官方网站下载安装包,接着解压文件并将其移动到...
综上所述,"SpringBoot+MongoDB+Echarts图表数据可视化"项目利用SpringBoot作为后端处理逻辑,MongoDB作为数据存储,Echarts作为前端数据展示工具,共同实现了高效、直观的数据可视化解决方案。这个组合在现代Web...
在MongoDB中,数据以BSON(Binary JSON)格式存储,这种格式允许高效地存储和检索复杂的数据结构。 MongoDB 默认的数据目录是 `/data/db`,在这个目录下,每个数据库都有自己的文件系统表示。每个数据库至少包含一...
非结构化数据库MongoDB的数据存储 一、MongoDB的基本概念和特点 MongoDB是一种基于分布式文件存储的数据库,它采用NoSQL(Not Only SQL)架构,以文档为单位进行数据存储。与传统的关系型数据库相比,MongoDB具有...
1. **文档型数据库**:MongoDB存储数据的方式是文档,这些文档通常是JSON格式(JavaScript Object Notation)或BSON(Binary JSON)格式,允许嵌套数据结构。这使得MongoDB能够轻松地存储和处理复杂的数据模型,如...
在这个压缩包中,"数据资源"可能包含了多个文档或JSON文件,每个文件代表一个MongoDB的集合,用于模拟实际应用场景中的数据存储。 首先,我们需要理解MongoDB的基本概念。MongoDB使用的是文档数据库模型,文档是...
在本项目中,我们将探讨如何使用Python爬虫技术获取链家网站上的二手房房价数据,并将这些数据存储到MongoDB数据库中,以便后续进行数据分析。首先,让我们逐一了解涉及的关键知识点。 1. **Python爬虫**:Python是...