WiredTiger 存储引擎

在本页面

更改 version 3.2:WiredTiger 存储引擎是 MongoDB 3.2 中的默认存储引擎。对于现有部署,如果未指定--storageEnginestorage.engine设置, MongoDB 3.2 可以自动确定用于在--dbpathstorage.dbPath中创建数据 files 的存储引擎。见默认存储引擎更改

Document Level Concurrency

WiredTiger 使用 document-level 并发控制进行写操作。因此,多个 clients 可以在同一 time 修改集合的不同文档。

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

一些 global 操作,通常是涉及多个数据库的短期操作,仍然需要 global“instance-wide”锁定。其他一些操作(例如删除集合)仍需要独占数据库锁。

快照和检查点

WiredTiger 使用 MultiVersion 并发控制(MVCC)。在操作开始时,WiredTiger 为操作提供数据的 point-in-time 快照。快照显示 in-memory 数据的一致视图。

写入磁盘时,WiredTiger 会以一致的方式将快照中的所有数据写入磁盘,并覆盖所有数据 files。 now- 耐用数据充当数据 files 中的检查点。检查点确保数据 files 一致,包括最后一个检查点; i.e。检查站可以作为恢复点。

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

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

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

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

日志

WiredTiger 将 write-ahead log(i.e.journal)与检查站结合使用以确保数据持久性。

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

使用瞬间 compression library 压缩 WiredTiger 日志。要指定不同的压缩算法或不压缩,请使用storage.wiredTiger.engineConfig.journalCompressor设置。有关更改日志压缩器的详细信息,请参阅更改 WT Journal Compressor

注意 如果 log record 小于或等于 128 字节(mininum WlogTiger 的 log record 大小),则 WiredTiger 不会压缩该 record。

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

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

也可以看看 使用 WiredTiger 记录日记

压缩

使用 WiredTiger,MongoDB 支持对所有集合和索引进行压缩。压缩可以以额外的 CPU 为代价最大限度地减少存储使用。

默认情况下,WiredTiger 对所有集合使用瞬间 compression library 进行块压缩,对所有索引使用前缀压缩

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

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

在收集和创建索引期间,还可以在 per-collection 和 per-index 基础上配置压缩设置。见指定存储引擎选项db.collection.createIndex() storageEngine 选项

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

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

Memory 使用

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

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

  • 50%(RAM - 1 GB),或

  • 256 MB。

注意 在某些情况下,例如在容器中运行时,数据库可能具有低于总系统 memory 的 memory 约束。在这种情况下,此 memory 限制而不是总系统 memory 用作可用的最大 RAM。 要查看 memory 限制,请参阅hostInfo.system.memLimitMB

默认情况下,WiredTiger 对所有集合使用 Snappy 块压缩,对所有索引使用前缀压缩。压缩默认值可在 global level 中配置,也可在收集和索引创建期间以 per-collection 和 per-index 为基础进行设置。

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

  • 文件系统缓存中的数据与 on-disk 格式相同,包括对数据 files 进行任何压缩的好处。操作系统使用文件系统缓存来减少磁盘 I/O。

  • 在 WiredTiger 内部缓存中加载的索引具有与 on-disk 格式不同的数据表示,但仍可利用索引前缀压缩来减少 RAM 使用。索引前缀压缩从索引字段中重复删除 common 前缀。

  • WiredTiger 内部缓存中的集合数据是未压缩的,并使用与 on-disk 格式不同的表示形式。块压缩可以节省大量的 on-disk 存储空间,但数据必须解压缩才能由服务器进行操作。

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

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