在之前的Mongodb的博客里我们看到目录文件夹下的集合和索引都是wt的扩展名。
Mongodb 目录结构 和 数据文件 说明
https://www.cndba.cn/dave/article/107955
WT 是WiredTiger存储引擎的缩写。 在MongoDB 2.6版本之前(包括2.6),只有一种存储引擎:MMAP(Memory mapping,内存映射引擎)。 MongoDB 3.0以后,MMAP升级为MMAPv1, 同时提供了插件式引擎API,引入wiredTiger。MongoDB 3.2默认使用WiredTiger引擎,MongoDB 4.0版本删除了MMAP引擎。从4.2版开始,MongoDB删除不推荐使用MMAPv1存储引擎。
存储引擎是负责管理数据的存储,无论是在内存和磁盘数据库的组成部分。MongoDB支持多个存储引擎,因为不同的引擎对于特定的工作负载性能更好。
从MongoDB 4.2开始,有两种存储引擎:
- WiredTiger存储引擎(默认)
WiredTiger是从MongoDB 3.2开始的默认存储引擎。它非常适合大多数工作负载,建议用于新部署。WiredTiger提供了文档级并发模型,检查点和压缩以及其他功能。在MongoDB Enterprise中,WiredTiger还支持静态 加密。 - 内存(In-Memory)存储引擎
内存存储引擎在MongoDB Enterprise中可用。它不是将文档存储在磁盘上,而是将它们保留在内存中,以提供更可预测的数据延迟。
1 WiredTiger存储引擎
从MongoDB 3.2开始,WiredTiger存储引擎是默认存储引擎。
1.1 文档级并发
WiredTiger使用文档级并发控制进行写操作。因此,多个客户端可以同时修改集合中的不同文档。
对于大多数读取和写入操作,WiredTiger使用乐观并发控制。WiredTiger仅在全局、数据库和集合级别使用意向锁(intent locks)。当存储引擎检测到两个操作之间存在冲突时,将引发写冲突,从而导致MongoDB自动重试该操作。
一些全局操作(通常是涉及多个数据库的短暂操作)仍然需要全局“实例范围级别的”锁。 其他一些操作(例如删除集合)仍然需要独占数据库锁。
1.2 快照和检查点
WiredTiger使用多版本并发控制(MVCC)方式。 在操作开始时,WiredTiger为操作提供数据的时间点快照。 快照提供了内存数据的一致视图。
写入磁盘时,WiredTiger将所有数据文件中的所有快照数据以一致的方式写入磁盘。 现在持久的数据充当数据文件中的检查点。 该检查点可确保数据文件直到最后一个检查点(包括最后一个检查点)都保持一致; 即检查点可以充当恢复点。
从3.6版本开始,MongoDB配置WiredTiger以60秒的间隔创建检查点(即将快照数据写入磁盘)。 在早期版本中,MongoDB将检查点设置为在WiredTiger中以60秒的间隔或在写入2GB日志数据时对用户数据进行检查,以先到者为准。
在写入新检查点期间,先前的检查点仍然有效。 这样,即使MongoDB在写入新检查点时终止或遇到错误,重启后,MongoDB仍可从上一个有效检查点恢复。
当WiredTiger的元数据表被原子更新以引用新的检查点时,新的检查点将变为可访问且永久的。 一旦可以访问新的检查点,WiredTiger就会从旧的检查点释放页面。
使用WiredTiger,即使没有日记,MongoDB也可以从最后一个检查点恢复; 但是,要恢复上一个检查点之后所做的更改,请运行日志功能。
从MongoDB 4.0开始,在副本集中使用WiredTiger存储引擎时,无法指定—nojournal选项或storage.journal.enabled: false。
1.3 日志(Journal)
WiredTiger将预写日志(WAL)与检查点结合使用 以确保数据的持久性。
WiredTiger日记保留检查点之间的所有数据修改。如果MongoDB在检查点之间退出,它将使用日志重播自上一个检查点以来修改的所有数据。
WiredTiger日志使用快速压缩算法进行压缩。 要指定其他压缩算法或不进行压缩,请使用storage.wiredTiger.engineConfig.journalCompressor设置参数。
如果日志记录小于或等于128字节( WiredTiger的最小日志记录大小),则WiredTiger不会压缩该记录。
可以通过将storage.journal.enabled设置为false来禁用独立实例的日志记录,这可以减少维护日志记录的开销。 对于独立实例,不使用日志意味着MongoDB意外退出时,您将丢失最后一个检查点之前的所有数据修改信息。
1.4 压缩
使用WiredTiger引擎时,MongoDB支持对所有集合和索引进行压缩。 压缩可以最大程度地减少存储空间的使用量,但会增加CPU的开销。
默认情况下,WiredTiger对所有集合使用snappy算法进行块压缩,对所有索引使用前缀压缩。
对于集合,还提供以下块压缩库:
- zlib
- zstd(从MongoDB 4.2开始可用)
要指定替代压缩算法或不压缩,请使用该storage.wiredTiger.collectionConfig.blockCompressor设置。
对于索引,要禁用前缀压缩,请使用storage.wiredTiger.indexConfig.prefixCompression设置。
压缩设置还可以在收集和索引创建期间基于每个集合和每个索引进行配置。
对于大多数工作负载,默认压缩设置可以平衡存储效率和处理要求。
默认情况下,WiredTiger日志也被压缩。
1.5 内存使用
通过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)。
总内存为1.25 GB的系统将为WiredTiger缓存分配256 MB。 [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内部缓存的大小增加到其默认值以上。
2 内存存储引擎
从MongoDB Enterprise 3.2.6版开始,内存存储引擎是64位版本中通用可用性(GA)的一部分。除了某些元数据和诊断数据之外,内存存储引擎不维护任何磁盘数据,包括配置数据,索引,用户凭据等。
通过避免磁盘I / O,内存存储引擎使数据库操作的延迟更可预测。
2.1 指定内存存储引擎
使用in-memory内存存储引擎,配置启动参数即可:
- 在—storageEngine选项设置inMemory;如果使用配置文件,则设置
storage.engine。 - —dbpath,如果使用配置文件,则设置storage.dbPath。 尽管内存存储引擎不会将数据写入文件系统,但它会在—dbpath中维护小型元数据文件和诊断数据以及用于构建大型索引的临时文件。
例如,从命令行输入参数命令:
mongod —storageEngine inMemory —dbpath
如果使用[YAML配置文件格式]
storage:
engine: inMemory
dbPath: <path>
除与数据持久性相关的那些选项参数(例如日志记录或静态配置加密)外,大多数mongod配置选项均可用于in-memory内存存储引擎。
注意:进程关闭后,内存中存储引擎不会保留数据。
2.2 并发
内存存储引擎将文档级并发控制用于写入操作,多个客户端可以同时修改集合的不同文档。
2.3 内存使用
内存存储引擎要求的所有数据(包括索引, OPLOG )必须适合指定的—inMemorySizeGB命令行选项或storage.inMemory.engineConfig.inMemorySizeGB中设置YAML配置文件。
默认情况下,内存存储引擎使用50%的物理RAM减去1 GB。
如果写操作将导致数据超过指定的内存大小,则MongoDB返回错误:
“WT_CACHE_FULL: operation would overflow cache”
要指定新大小,请使用YAML配置文件格式的storage.inMemory.engineConfig.inMemorySizeGB设置 :
storage:
engine: inMemory
dbPath: <path>
inMemory:
engineConfig:
inMemorySizeGB: <newSize>
或使用命令行选项—inMemorySizeGB:
mongod —storageEngine inMemory —dbpath
—inMemorySizeGB
2.4 耐久性
内存存储引擎是非持久性的,不会将数据写入持久性存储。非持久数据包括应用程序数据和系统数据,例如用户,权限,索引,副本集配置,分片群集配置等。
因此,日志或等待数据变得 持久的概念不适用于内存存储引擎。
如果副本集的任何有投票权的成员使用内存存储引擎,则必须设置writeConcernMajorityJournalDefault为false。
从版本4.2(以及4.0.13和3.6.14)开始,如果副本集成员使用内存存储引擎(投票或不投票),但副本集的writeConcernMajorityJournalDefault设置为true,则副本集成员日志中将会记录一个启动警告。
2.5 交易
从MongoDB 4.2开始,副本集和分片群集上支持事务:
- 主要成员可以使用WiredTiger存储引擎
- 辅助成员可以使用WiredTiger存储引擎或 内存存储引擎。
在MongoDB 4.0中,仅使用WiredTiger存储引擎的副本集支持事务。
无法在将writeConcernMajorityJournalDefault设置为false分片的分片群集上运行事务,例如,具有使用in-memory 内存存储引擎的投票成员的分片集群。
2.6 部署架构
除了独立运行外mongod,使用内存存储引擎的实例还可以作为副本集的一部分或分片群集的一部分运行。
2.6.1 副本集
可以将mongod使用内存中存储引擎的实例部署为副本集的一部分。例如三副本集:
- 两个mongod实例使用内存存储引擎。
- 一个mongod实例使用WiredTiger存储引擎。将WiredTiger成员配置为隐藏成员(
hidden: true 和priority: 0)。
使用此部署模型,只有使用in-memory存储引擎的mongod实例才能成为主要实例。 客户端仅连接到内存存储引擎mongod实例。 即使两个内存存储引擎的mongod实例都崩溃并重新启动,它们也可以从WiredTiger 引擎的成员进行同步。 WiredTiger引擎的隐藏mongod实例会将数据持久保存到磁盘,包括用户数据,索引和复制配置信息。
2.6.2 分片群集
可以将使用内存存储引擎的mongod实例部署为分片群集的一部分。例如:
- 两个内存存储引擎的mongod实例
- 一个WiredTiger存储引擎的mongod实例。将WiredTiger成员配置为隐藏成员(
hidden: true 和priority: 0)。



