存储引擎是数据库的一部分,负责管理内存和磁盘上数据的存储方式。 许多数据库支持多个存储引擎,其中不同的引擎对特定工作负载的性能更好。 例如,一个存储引擎可能为读取繁重的工作负载提供更好的性能,另一个可能支持更高的写入操作吞吐量。更多详情请参见存储引擎
可以。 你可以拥有使用不同存储引擎的副本集成员。
注意: MongoDB 4.0不推荐使用MMAPv1存储引擎。
在设计这些多存储引擎部署时,请考虑以下事项:
可以,详情请参见:
压缩数据与未压缩数据的比率取决于你的数据和使用的压缩库。 默认情况下,WiredTiger中的集合数据使用Snappy块压缩; zlib压缩也可用。 索引数据默认使用前缀压缩。
使用WiredTiger,MongoDB同时使用WiredTiger内部缓存和文件系统缓存。
从MongoDB 3.4开始,默认的WiredTiger内部缓存大小是以下两者中的较大者:50%(RAM - 1 GB)或256 MB
例如,在总共4GB RAM的系统上,WiredTiger缓存将使用1.5GB的RAM(0.5 *(4 GB - 1 GB)= 1.5 GB)。 相反,一个总共1.25 GB RAM的系统将为WiredTiger缓存分配256 MB,因为这超过总RAM的一半减去1 GB(0.5 *(1.25 GB - 1 GB)= 128 MB <256 MB)。
默认情况下,WiredTiger对所有集合使用Snappy块压缩,对所有索引使用前缀压缩。 压缩默认值可在全局级别配置,也可在收集和索引创建期间基于每个集合和每个索引进行设置。
WiredTiger内部缓存中的数据与磁盘格式使用不同的表示形式:
通过文件系统缓存,MongoDB自动使用WiredTiger缓存或其他进程未使用的所有可用内存。
要调整WiredTiger内部缓存的大小,请参阅storage.wiredTiger.engineConfig.cacheSizeGB和–wiredTigerCacheSizeGB。 避免将WiredTiger内部缓存大小增加到其默认值以上。
注意
storage.wiredTiger.engineConfig.cacheSizeGB限制了WiredTiger内部缓存的大小。 操作系统将使用可用的空闲内存用于文件系统缓存,这允许压缩的MongoDB数据文件保留在内存中。 此外,操作系统将使用任何空闲RAM来缓冲文件系统块和文件系统缓存。
为了容纳额外的RAM使用者,你可能必须减少WiredTiger内部缓存大小。
从版本3.6开始,MongoDB配置WiredTiger以60秒的间隔创建检查点(即将快照数据写入磁盘)。 在早期版本中,MongoDB在WiredTiger中以60秒的间隔设置检查点,或者在写入2 GB的日志数据时,以先发生者为准。
MongoDB根据以下间隔或条件写入磁盘:
WiredTiger存储引擎在删除文档时维护数据文件中的空记录列表。 此空间可以由WiredTiger重用,但除非在非常特定的情况下,否则不会返回到操作系统。
可供WiredTiger重用的空白空间量反映在db.collection.stats()的输出中,可在wiredTiger.block-manager.file for reuse下看到。
要允许WiredTiger存储引擎将此空白空间释放到操作系统,你可以对数据文件进行解组。 这可以使用compact命令实现。 有关其行为和其他注意事项的更多信息,请参阅compact。
内存映射文件是一个文件,其中包含操作系统通过mmap()系统调用在内存中放置的数据。 mmap()因此将文件映射到虚拟内存区域。 内存映射文件是MongoDB中MMAPv1存储引擎的关键部分。 通过使用内存映射文件,MongoDB可以将其数据文件的内容视为内存中的内容。 这为MongoDB提供了一种访问和操作数据的极其快速和简单的方法。
MongoDB使用内存映射文件来管理和交互所有数据。
内存映射将文件分配给具有直接逐字节相关性的虚拟内存块。 MongoDB内存在访问文档时将数据文件映射到内存。 未访问的数据未映射到内存。
映射后,文件和内存之间的关系允许MongoDB与文件中的数据进行交互,就像它是内存一样。
在MMAPv1存储引擎的默认配置中,MongoDB每隔60秒写入磁盘上的数据文件,并且大约每100毫秒写入日志文件。
要更改写入数据文件的时间间隔,请使用storage.syncPeriodSecs设置。 有关日志文件,请参阅storage.journal.commitIntervalMs设置。
这些值表示完成写入操作与MongoDB写入数据文件或日志文件之间的最长时间。 在许多情况下,MongoDB和操作系统更频繁地将数据刷新到磁盘,因此上述值代表理论上的最大值。
数据目录中的数据文件(默认配置中的/data/db目录)可能大于插入数据库的数据集。 考虑以下可能的原因:
预分配的数据文件
MongoDB预先分配其数据文件以避免文件系统碎片,因此,这些文件的大小不一定反映数据的大小。
storage.mmapv1.smallFiles选项将减小这些文件的大小,如果磁盘上有许多小型数据库,这可能很有用。
oplog
如果此mongod是副本集的成员,则数据目录包含oplog.rs文件,该文件是本地数据库中预分配的上限集合。
在64位安装上,默认分配大约是磁盘空间的5%。在大多数情况下,您不需要调整oplog的大小。有关更多信息,请参阅Oplog大小调整。
journal
数据目录包含日志文件,它们在MongoDB将数据应用到数据库之前将写入操作存储在磁盘上。请参阅Journaling。
Empty records
MMAPv1存储引擎在删除文档和集合时维护数据文件中的空记录列表。此空间可以重用于同一数据库中的新记录分配,但默认情况下,MMAPv1不会将此空间返回给操作系统。
要允许MMAPv1存储引擎更有效地重用空记录中的空间,您可以对数据进行解组。要解压缩,请使用compact命令。该压缩程序需要最多2千兆字节的额外磁盘空间才能运行。如果磁盘空间严重不足,请不要使用紧凑型。有关其行为和其他注意事项的更多信息,请参阅compact。
compact仅从集合中的MongoDB数据文件中删除碎片,并且不向操作系统返回任何磁盘空间。要将磁盘空间返回给操作系统,请参阅如何回收磁盘空间
你无需为MongoDB回收磁盘空间以重用已释放的空间。 有关重用已释放空间的信息,请参阅空记录。
对于副本集的辅助成员,可以通过停止辅助成员重新同步,从成员的数据目录中删除所有数据和子目录,然后重新启动辅助成员来执行成员的重新同步。 有关详细信息,请参阅重新同步副本集的成员。
通过dropDatabase删除未使用的数据库也将删除关联的数据文件并释放磁盘空间。
使用MMAPv1存储引擎时,可能会发生页面错误,因为MongoDB会将数据读取或写入当前未位于物理内存中的部分数据文件。 相反,当物理内存耗尽且物理内存页面交换到磁盘时,会发生操作系统页面错误。
如果有空闲内存,则操作系统可以在磁盘上找到该页面并直接将其加载到内存中。 但是,如果没有空闲内存,操作系统必须:
在活动系统上,此过程可能需要很长时间,特别与读取已在内存中的页面相比。
有关详细信息,请参阅Page faults。
当具有MMAP存储引擎的MongoDB需要访问当前不在活动内存中的数据时,会发生页面错误。 “硬”页面错误是指MongoDB必须访问磁盘才能访问数据的情况。 相反,“软”页面错误仅将存储器页面从一个列表移动到另一个列表,例如从操作系统文件高速缓存移动。