文档菜单
文档首页
/
MongoDB 手册
/

WiredTiger 存储引擎

本页内容

  • 操作和限制
  • 事务(读/写)并发性
  • 文档级别并发性
  • 快照和检查点
  • 日志
  • 压缩
  • 内存使用

WiredTiger 存储引擎是默认的存储引擎。对于现有部署,如果您没有指定--storageEnginestorage.engine 设置,mongod 实例可以自动确定用于在 --dbpathstorage.dbPath 中创建数据文件的存储引擎。

以下环境中的部署可以使用 WiredTiger 存储引擎

  • MongoDB Atlas:云中 MongoDB 部署的全托管服务

注意

所有MongoDB Atlas部署都使用WiredTiger存储引擎。

了解更多关于WiredTiger内存使用对于托管在MongoDB Atlas中的部署,请参阅内存

以下操作说明和限制适用于WiredTiger引擎

  • 您不能将文档固定在WiredTiger缓存中。

  • WiredTiger不会为读取和写入分别保留缓存的一部分。

  • 重写工作负载可能会影响性能,但WiredTiger在这种情况下优先考虑索引缓存。

  • WiredTiger将其缓存分配给整个mongod实例。WiredTiger不在数据库或集合级别分配缓存。

从7.0版本开始,MongoDB使用默认算法动态调整最大并发存储引擎事务(读取和写入票据)的数量。动态并发存储引擎事务算法优化了集群过载时的数据库吞吐量。最大并发存储引擎事务(读取和写入票据)的数量不会超过128个读取票据和128个写入票据,并且可能在不同节点之间有所不同。单个节点内的最大读取票据和写入票据数量始终相等。

要指定动态最大值不能超过的最大读取和写入事务(读取和写入票据)数量,请使用storageEngineConcurrentReadTransactionsstorageEngineConcurrentWriteTransactions

如果您想禁用动态并发存储引擎事务算法,请提交支持请求与MongoDB技术服务工程师合作。

要查看WiredTiger存储引擎中允许的并发读事务(读票据)和写事务(写票据)数量,请使用serverStatus命令,并查看queues.execution响应文档。

注意

availablequeues.execution中的低值并不表示集群过载。将排队读和写票据的数量作为集群过载的指标。

WiredTiger使用文档级别并发控制进行写操作。因此,多个客户端可以同时修改集合中的不同文档。

对于大多数读和写操作,WiredTiger使用乐观并发控制。WiredTiger仅在全局、数据库和集合级别使用意向锁。当存储引擎检测到两个操作之间的冲突时,其中一个将产生写冲突,导致MongoDB透明地重试该操作。

一些全局操作,通常是涉及多个数据库的短暂操作,仍然需要全局“实例级”锁。其他一些操作,例如renameCollection,在特定情况下仍然需要独占数据库锁。

WiredTiger使用多版本并发控制(MVCC)。在操作开始时,WiredTiger为操作提供数据的时间点快照。快照呈现了内存中数据的一致视图。

当写入磁盘时,WiredTiger以一致的方式将快照中的所有数据写入磁盘,涵盖所有数据文件。现在被称为持久化的数据在数据文件中充当检查点。该检查点确保数据文件的一致性,直到并包括最后一个检查点;即检查点可以作为恢复点。

MongoDB将WiredTiger配置为创建检查点,具体来说,每隔60秒将快照数据写入磁盘。

在写入新的检查点期间,之前的检查点仍然有效。因此,即使MongoDB在写入新检查点时终止或遇到错误,MongoDB也可以从最后一个有效检查点恢复。

当WiredTiger的元数据表原子性地更新以引用新的检查点时,新的检查点变得可访问且永久。一旦新的检查点可访问,WiredTiger就会从旧的检查点释放页面。

从MongoDB 5.0开始,您可以使用minSnapshotHistoryWindowInSeconds参数来指定WiredTiger保留快照历史的时间。

增加minSnapshotHistoryWindowInSeconds的值会增加磁盘使用量,因为服务器必须维护指定时间窗口内旧修改值的记录。使用的磁盘空间量取决于您的负载,高容量负载需要更多的磁盘空间。

MongoDB在您的指定dbPath中的WiredTigerHS.wt文件中维护快照历史。

WiredTiger使用预写日志(即期刊)结合检查点来确保数据持久性。

WiredTiger期刊持久化检查点之间的所有数据修改。如果MongoDB在检查点之间退出,它将使用期刊重新播放自上次检查点以来修改的所有数据。有关MongoDB将期刊数据写入磁盘的频率信息,请参阅日志过程。

WiredTiger期刊使用snappy压缩库进行压缩。要指定不同的压缩算法或不进行压缩,请使用storage.wiredTiger.engineConfig.journalCompressor设置。有关更改期刊压缩器的详细信息,请参阅更改WiredTiger期刊压缩器。

注意

如果日志记录小于或等于128字节(WiredTiger的最小日志记录大小),则WiredTiger不会压缩该记录。

提示

另请参阅

使用WiredTiger,MongoDB支持所有集合和索引的压缩。压缩通过额外的CPU代价最小化存储使用。

默认情况下,WiredTiger对所有集合使用snappy压缩库进行块压缩,对所有索引使用前缀压缩

对于集合,以下块压缩库也可用

要指定不同的压缩算法或不进行压缩,请使用storage.wiredTiger.collectionConfig.blockCompressor设置。

对于索引,要禁用前缀压缩,请使用storage.wiredTiger.indexConfig.prefixCompression设置。

在集合和索引创建过程中,也可以按集合和索引逐个配置压缩设置。请参阅指定存储引擎选项db.collection.createIndex() 存储引擎选项

对于大多数工作负载,默认的压缩设置在存储效率和处理需求之间取得了平衡。

WiredTiger日志默认也是压缩的。有关日志压缩的信息,请参阅日志。

使用WiredTiger时,MongoDB同时利用WiredTiger内部缓存和文件系统缓存。

默认的WiredTiger内部缓存大小是以下两者中的较大者

  • RAM - 1 GB的50%,或

  • 256 MB。

例如,在总共有4GB RAM的系统上,WiredTiger缓存使用1.5GB的RAM(0.5 * (4 GB - 1 GB) = 1.5 GB)。相反,在总共有1.25GB RAM的系统上,WiredTiger将256 MB分配给WiredTiger缓存,因为这是总RAM减去1GB的一半以上的值(0.5 * (1.25 GB - 1 GB) = 128 MB < 256 MB)。

注意

在某些情况下,例如在容器中运行时,数据库可能具有低于系统总内存的内存限制。在这种情况下,此内存限制而不是总系统内存被用作最大RAM。

要查看内存限制,请参阅hostInfo.system.memLimitMB

默认情况下,WiredTiger对所有集合使用Snappy块压缩,对所有索引使用前缀压缩。压缩默认设置可以在全局级别配置,也可以在集合和索引创建期间按集合和索引逐个设置。

在WiredTiger内部缓存和磁盘格式中使用了不同的数据表示

  • 文件系统缓存中的数据与磁盘格式相同,包括数据文件中任何压缩的好处。文件系统缓存由操作系统用于减少磁盘I/O。

  • 在WiredTiger内部缓存中加载的索引与磁盘格式中的数据表示不同,但仍可以利用索引前缀压缩来减少RAM使用。索引前缀压缩会从索引字段中去除重复的前缀。

  • WiredTiger内部缓存中的集合数据未压缩,并且与磁盘格式中的表示不同。块压缩可以提供显著的磁盘存储节省,但数据必须解压缩才能由服务器操作。

使用文件系统缓存,MongoDB会自动使用所有未由WiredTiger缓存或其他进程使用的空闲内存。

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

返回

存储