我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MongoDB是怎样存储数据的

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MongoDB是怎样存储数据的

这篇文章给大家分享的是有关MongoDB是怎样存储数据的的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

前言

想要深入了解MongoDB如何存储数据之前,有一个概念必须清楚,那就是Memeory-Mapped Files。

Memeory-Mapped Files

下图展示了数据库是如何跟底层系统打交道的。

  • 内存映射文件是OS通过mmap在内存中创建一个数据文件,这样就把文件映射到一个虚拟内存的区域。

  • 虚拟内存对于进程来说,是一个物理内存的抽象,寻址空间大小为2^64

  • 操作系统通过mmap来把进程所需的所有数据映射到这个地址空间(红线),然后再把当前需要处理的数据映射到物理内存(灰线)

  • 当进程访问某个数据时,如果数据不在虚拟内存里,触发page fault,然后OS从硬盘里把数据加载进虚拟内存和物理内存

  • 如果物理内存满了,触发swap-out操作,这时有些数据就需要写回磁盘,如果是纯粹的内存数据,写回swap分区,如果不是就写回磁盘。

MongoDB是怎样存储数据的

MongoDB的存储模型

MongoDB是怎样存储数据的

  • 有了内存映射文件,要访问的数据就好像都在内存里面,简单化了MongoDB访问和修改数据的逻辑

  • MongoDB读写都只是和虚拟内存打交道,剩下都交给OS打理

  • 虚拟内存大小=所有文件大小+其他一些开销(连接,堆栈)

  • 如果journal开启,虚拟内存大小差不多翻番

  • 使用MMF的好处1:不用自己管理内存和磁盘调度2:LRU策略3:重启过程中,Cache依然在。

  • 使用MMF的坏处1:RAM使用会受磁盘碎片的影响,高预读也会影响2:无法自己优化调度算法,只能使用LRU

MongoDB是怎样存储数据的

MongoDB是怎样存储数据的

MongoDB是怎样存储数据的

  • 磁盘上的文件是有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
}

感谢各位的阅读!关于“MongoDB是怎样存储数据的”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MongoDB是怎样存储数据的

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

HBase中的数据存储结构是怎样的

在HBase中,数据以表的形式进行存储,表由多行组成,每行可以有多个列族,每个列族可以包含多个列。每行都有一个唯一的行键,通过这个行键可以快速查询到对应的数据。数据按照行键的字典顺序进行排序存储,这样可以方便快速查找和扫描数据。在HBas
HBase中的数据存储结构是怎样的
2024-04-09

mongodb数据存储结构是什么

MongoDB的数据存储结构是基于文档模型的,它使用了一种称为BSON(Binary JSON)的二进制编码格式来表示和存储文档数据。一个文档是一个类似于JSON对象的数据结构,由键值对组成。文档可以包含各种数据类型,包括字符串、整数、浮点
2023-09-12

C语言数据在内存中是怎样存储的

这篇文章主要介绍“C语言数据在内存中是怎样存储的”,在日常操作中,相信很多人在C语言数据在内存中是怎样存储的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言数据在内存中是怎样存储的”的疑惑有所帮助!接下来
2023-06-08

mongodb数据存储在哪

mongodb 采用分片集群架构,分片存储特定范围的数据,分片规则定义数据分布方式。副本集作为冗余机制,确保数据可用性。mongodb 使用 bson 格式存储数据,数据存储在集合中,而文档是基本数据单位。存储层包括 wiredtiger
mongodb数据存储在哪
2024-04-08

Cacti系统的数据存储方式是怎样的

Cacti系统的数据存储方式主要是基于RRDTool(Round-Robin Database Tool)数据库。RRDTool是一种用于存储时间序列数据的工具,它使用round-robin文件来存储数据。Round-robin文件是一种特
Cacti系统的数据存储方式是怎样的
2024-03-11

mongodb存储大小数据的方法是什么

MongoDB可以存储任意大小的数据,没有固定的限制。它采用了分片和复制的机制,可以扩展到大规模的数据集和高并发的访问。在MongoDB中,数据是以BSON(Binary JSON)格式存储的,BSON是一种轻量级的二进制表示形式,类似于J
2023-08-24

怎么将json数据储存到mongodb中

将JSON数据存储到MongoDB数据库中,需要建立连接、转换JSON数据、插入文档。PyMongo库提供便捷方法简化交互,如查询集合。bson库用于处理MongoDB的BSON数据格式。注意数据类型兼容性和性能优化,并定期备份。
怎么将json数据储存到mongodb中
2024-04-12

云数据库mongodb存储结构是什么

在MongoDB中,数据以文档的形式存储,文档是MongoDB中的基本单元。文档是一个键值对的序列,类似于JSON对象。MongoDB中的文档可以包含多个字段,每个字段可以是不同类型的数据,如字符串、数字、日期、数组和嵌套文档等。Mongo
2023-05-13

mongodb数据存储文件怎么导出

要将MongoDB中的数据存储文件导出,可以使用MongoDB的命令行工具mongoexport。以下是导出数据的步骤:1. 打开终端或命令提示符窗口,并导航到MongoDB的安装目录中的bin文件夹。2. 运行以下命令来导出数据:```m
2023-08-31

HBase数据是怎么存储的

HBase是一个分布式的、面向列的NoSQL数据库系统,数据存储在HDFS(Hadoop分布式文件系统)中。HBase中的数据是按照行键(Row Key)、列族(Column Family)、列标识符(Column Qualifier)和时
HBase数据是怎么存储的
2024-03-05

Oracle存储过程是怎样的

这篇文章主要介绍“Oracle存储过程是怎样的”,在日常操作中,相信很多人在Oracle存储过程是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Oracle存储过程是怎样的”的疑惑有所帮助!接下来,请跟
2023-06-17

LINQ存储过程是怎样的

这篇文章主要介绍“LINQ存储过程是怎样的”,在日常操作中,相信很多人在LINQ存储过程是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”LINQ存储过程是怎样的”的疑惑有所帮助!接下来,请跟着小编一起来
2023-06-17

MongoDB的JSON数据如何存储与查询

MongoDB是一种文档数据库,它以JSON格式存储数据。在MongoDB中,数据以文档的形式存储在集合中。每个文档是一个键值对的集合,类似于JSON对象。存储JSON数据:要存储JSON数据到MongoDB中,首先需要连接到数据库,选
MongoDB的JSON数据如何存储与查询
2024-05-07

编程热搜

目录