MongoDB常见问题 —— 存储引擎

MongoDB常见问题 —— 存储引擎

    • 存储引擎基础知识
      • 什么是存储引擎?
      • 可以在副本集中混合存储引擎吗?
    • WiredTiger存储引擎
      • 我可以将现有部署升级到WiredTiger吗?
      • WiredTiger提供多少压缩?
      • 我应该设置WiredTiger内部缓存的大小?
      • WiredTiger写入磁盘的频率如何?
        • Checkpoints
        • Journal Data
      • 如何在WiredTiger中回收磁盘空间?
    • MMAPv1 存储引擎
      • 什么是内存映射文件?
      • 内存映射文件如何工作?
      • MMAPv1写入磁盘的频率如何?
      • 为什么我的数据目录中的文件大于数据库中的数据?
      • 如何回收磁盘空间?
      • 什么是page faults?
      • Soft page faults和hard page faults有什么区别?

存储引擎基础知识

什么是存储引擎?

存储引擎是数据库的一部分,负责管理内存和磁盘上数据的存储方式。 许多数据库支持多个存储引擎,其中不同的引擎对特定工作负载的性能更好。 例如,一个存储引擎可能为读取繁重的工作负载提供更好的性能,另一个可能支持更高的写入操作吞吐量。更多详情请参见存储引擎

可以在副本集中混合存储引擎吗?

可以。 你可以拥有使用不同存储引擎的副本集成员。

注意: MongoDB 4.0不推荐使用MMAPv1存储引擎。

在设计这些多存储引擎部署时,请考虑以下事项:

  • 每个成员上的oplog可能需要以不同的大小来计算不同存储引擎之间的吞吐量差异。
  • 如果备份从MongoDB捕获数据文件,备份恢复可能会变得更加复杂,因为可能需要维护每个存储引擎的备份。

WiredTiger存储引擎

我可以将现有部署升级到WiredTiger吗?

可以,详情请参见:

  • 如何将Standalone更改为WiredTiger
  • 如何将副本集更改为WiredTiger
  • 如何将Sharded Cluster更改为WiredTiger

WiredTiger提供多少压缩?

压缩数据与未压缩数据的比率取决于你的数据和使用的压缩库。 默认情况下,WiredTiger中的集合数据使用Snappy块压缩; zlib压缩也可用。 索引数据默认使用前缀压缩。

我应该设置WiredTiger内部缓存的大小?

使用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内部缓存中的数据与磁盘格式使用不同的表示形式:

  • 文件系统缓存中的数据与磁盘格式相同,包括对数据文件进行任何压缩的好处。 操作系统使用文件系统缓存来减少磁盘I / O.
  • 在WiredTiger内部缓存中加载的索引具有与磁盘格式不同的数据表示,但仍可利用索引前缀压缩来减少RAM使用。 索引前缀压缩从索引字段中删除公共前缀。
  • WiredTiger内部缓存中的收集数据是未压缩的,并使用与磁盘格式不同的表示形式。 块压缩可以节省大量的磁盘存储空间,但数据必须解压缩才能由服务器操作。

通过文件系统缓存,MongoDB自动使用WiredTiger缓存或其他进程未使用的所有可用内存。

要调整WiredTiger内部缓存的大小,请参阅storage.wiredTiger.engineConfig.cacheSizeGB和–wiredTigerCacheSizeGB。 避免将WiredTiger内部缓存大小增加到其默认值以上。

注意
storage.wiredTiger.engineConfig.cacheSizeGB限制了WiredTiger内部缓存的大小。 操作系统将使用可用的空闲内存用于文件系统缓存,这允许压缩的MongoDB数据文件保留在内存中。 此外,操作系统将使用任何空闲RAM来缓冲文件系统块和文件系统缓存。
为了容纳额外的RAM使用者,你可能必须减少WiredTiger内部缓存大小。

WiredTiger写入磁盘的频率如何?

Checkpoints

从版本3.6开始,MongoDB配置WiredTiger以60秒的间隔创建检查点(即将快照数据写入磁盘)。 在早期版本中,MongoDB在WiredTiger中以60秒的间隔设置检查点,或者在写入2 GB的日志数据时,以先发生者为准。

Journal Data

MongoDB根据以下间隔或条件写入磁盘:

  • MongoDB每50毫秒将缓冲的日志数据同步到磁盘(从MongoDB 3.2开始)
  • 如果写入操作包括j:true的写入问题,则WiredTiger强制同步WiredTiger日志文件。
  • 由于MongoDB使用的日志文件大小限制为100 MB,因此WiredTiger大约每100 MB数据创建一个新的日志文件。 当WiredTiger创建新的日志文件时,WiredTiger会同步以前的日志文件。

如何在WiredTiger中回收磁盘空间?

WiredTiger存储引擎在删除文档时维护数据文件中的空记录列表。 此空间可以由WiredTiger重用,但除非在非常特定的情况下,否则不会返回到操作系统。

可供WiredTiger重用的空白空间量反映在db.collection.stats()的输出中,可在wiredTiger.block-manager.file for reuse下看到。

要允许WiredTiger存储引擎将此空白空间释放到操作系统,你可以对数据文件进行解组。 这可以使用compact命令实现。 有关其行为和其他注意事项的更多信息,请参阅compact。

MMAPv1 存储引擎

什么是内存映射文件?

内存映射文件是一个文件,其中包含操作系统通过mmap()系统调用在内存中放置的数据。 mmap()因此将文件映射到虚拟内存区域。 内存映射文件是MongoDB中MMAPv1存储引擎的关键部分。 通过使用内存映射文件,MongoDB可以将其数据文件的内容视为内存中的内容。 这为MongoDB提供了一种访问和操作数据的极其快速和简单的方法。

内存映射文件如何工作?

MongoDB使用内存映射文件来管理和交互所有数据。

内存映射将文件分配给具有直接逐字节相关性的虚拟内存块。 MongoDB内存在访问文档时将数据文件映射到内存。 未访问的数据未映射到内存。

映射后,文件和内存之间的关系允许MongoDB与文件中的数据进行交互,就像它是内存一样。

MMAPv1写入磁盘的频率如何?

在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删除未使用的数据库也将删除关联的数据文件并释放磁盘空间。

什么是page faults?

使用MMAPv1存储引擎时,可能会发生页面错误,因为MongoDB会将数据读取或写入当前未位于物理内存中的部分数据文件。 相反,当物理内存耗尽且物理内存页面交换到磁盘时,会发生操作系统页面错误。

如果有空闲内存,则操作系统可以在磁盘上找到该页面并直接将其加载到内存中。 但是,如果没有空闲内存,操作系统必须:

  • 在内存中找到陈旧或不再需要的页面,并将该页面写入磁盘。
  • 从磁盘读取请求的页面并将其加载到内存中。

在活动系统上,此过程可能需要很长时间,特别与读取已在内存中的页面相比。

有关详细信息,请参阅Page faults。

Soft page faults和hard page faults有什么区别?

当具有MMAP存储引擎的MongoDB需要访问当前不在活动内存中的数据时,会发生页面错误。 “硬”页面错误是指MongoDB必须访问磁盘才能访问数据的情况。 相反,“软”页面错误仅将存储器页面从一个列表移动到另一个列表,例如从操作系统文件高速缓存移动。

你可能感兴趣的:(MongoDB,MongoDB学习随笔)