WiredTiger 存储引擎
WiredTiger 存储引擎是默认的存储引擎。对于现有部署,如果您没有指定--storageEngine
或storage.engine
设置,mongod
实例可以自动确定用于在 --dbpath
或 storage.dbPath
中创建数据文件的存储引擎。
以下环境中的部署可以使用 WiredTiger 存储引擎
MongoDB Atlas:云中 MongoDB 部署的全托管服务
注意
所有MongoDB Atlas部署都使用WiredTiger存储引擎。
MongoDB企业版:基于订阅的自管理MongoDB版本
MongoDB社区版:开源、免费使用和自管理的MongoDB版本
了解更多关于WiredTiger内存使用对于托管在MongoDB Atlas中的部署,请参阅内存。
操作和限制
以下操作说明和限制适用于WiredTiger引擎
您不能将文档固定在WiredTiger缓存中。
WiredTiger不会为读取和写入分别保留缓存的一部分。
重写工作负载可能会影响性能,但WiredTiger在这种情况下优先考虑索引缓存。
WiredTiger将其缓存分配给整个
mongod
实例。WiredTiger不在数据库或集合级别分配缓存。
事务(读取和写入)并发
从7.0版本开始,MongoDB使用默认算法动态调整最大并发存储引擎事务(读取和写入票据)的数量。动态并发存储引擎事务算法优化了集群过载时的数据库吞吐量。最大并发存储引擎事务(读取和写入票据)的数量不会超过128个读取票据和128个写入票据,并且可能在不同节点之间有所不同。单个节点内的最大读取票据和写入票据数量始终相等。
要指定动态最大值不能超过的最大读取和写入事务(读取和写入票据)数量,请使用storageEngineConcurrentReadTransactions
和storageEngineConcurrentWriteTransactions
。
如果您想禁用动态并发存储引擎事务算法,请提交支持请求与MongoDB技术服务工程师合作。
要查看WiredTiger存储引擎中允许的并发读事务(读票据)和写事务(写票据)数量,请使用serverStatus
命令,并查看queues.execution
响应文档。
注意
available
在queues.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内部缓存大小增加到默认值以上。