WiredTiger 存储引擎

在本页面

在版本 3.2 中进行了更改:WiredTiger 存储引擎是从 MongoDB 3.2 开始的默认存储引擎。对于现有部署,如果未指定--storageEnginestorage.engine设置,则 MongoDB 3.2 可以自动确定用于在--dbpathstorage.dbPath中创建数据文件的存储引擎。参见默认存储引擎更改

文档级并发

WiredTiger 使用文档级并发控制进行写操作。结果,多个 Client 端可以同时修改集合的不同文档。

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

一些全局操作(通常是涉及多个数据库的短暂操作)仍然需要全局“实例范围”锁。其他一些操作(例如删除集合)仍然需要独占数据库锁。

快照和检查点

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

写入磁盘时,WiredTiger 将所有数据文件中的快照中的所有数据以一致的方式写入磁盘。现在的durable数据在数据文件中充当检查点。 * checkpoint *确保数据文件直到最后一个检查点(包括最后一个检查点)都是一致的;即检查点可以充当恢复点。

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

在写入新检查点期间,先前的检查点仍然有效。这样,即使 MongoDB 在写入新检查点时终止或遇到错误,重启后,MongoDB 仍可从上一个有效检查点恢复。

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

使用 WiredTiger,即使没有journaling,MongoDB 也可以从最后一个检查点恢复;但是,要恢复在最后一个检查点之后所做的更改,请使用journaling运行。

Journal

WiredTiger 将预写日志(即日志)与checkpoints结合使用,以确保数据持久性。

WiredTiger 日记保留检查点之间的所有数据修改。如果 MongoDB 在检查点之间退出,它将使用日志重播自上一个检查点以来修改的所有数据。有关 MongoDB 将日志数据写入磁盘的频率的信息,请参阅Journaling Process

WiredTiger 日记使用snappy压缩库进行压缩。要指定其他压缩算法或不压缩,请使用storage.wiredTiger.engineConfig.journalCompressor设置。有关更改轴颈压缩机的详细信息,请参见更换 WT Journal Compressor

Note

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

您可以通过将storage.journal.enabled设置为false来禁用日记功能,这样可以减少维护日记的开销。

对于standalone实例,不使用日志意味着 MongoDB 意外退出时,您将丢失最后一个检查点之前的所有数据修改。对于replica sets的成员,复制过程可以提供足够的持久性保证。

Compression

使用 WiredTiger,MongoDB 支持对所有集合和索引进行压缩。压缩可以最大程度地减少存储使用量,但会增加 CPU 的开销。

默认情况下,WiredTiger 将块压缩与snappy压缩库一起用于所有集合,并将prefix compression用于所有索引。

对于集合,还可以使用zlib进行块压缩。要指定替代压缩算法或不压缩,请使用storage.wiredTiger.collectionConfig.blockCompressor设置。

对于索引,要禁用prefix compression,请使用storage.wiredTiger.indexConfig.prefixCompression设置。

压缩设置还可以在收集和索引创建期间基于每个集合和每个索引进行配置。参见指定存储引擎选项db.collection.createIndex()storageEngine 选项

对于大多数工作负载,默认压缩设置可以平衡存储效率和处理要求。

默认情况下,WiredTiger 日志也被压缩。有关日记压缩的信息,请参见Journal

Memory Use

通过 WiredTiger,MongoDB 可以利用 WiredTiger 内部缓存和文件系统缓存。

从 MongoDB 3.4 开始,默认的 WiredTiger 内部缓存大小是以下两者中的较大者:

Note

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

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

默认情况下,WiredTiger 对所有集合使用 Snappy 块压缩,对所有索引使用前缀压缩。压缩默认值是可以在全局级别配置的,也可以在收集和索引创建期间基于每个集合和每个索引进行设置。

WiredTiger 内部缓存中的数据与磁盘格式使用不同的表示形式:

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

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

首页