3.3 MongoDB存储引擎 🎉
3.3 MongoDB存储引擎 🎉
存储引擎负责管理数据如何在磁盘和内存中存储,MongoDB支持多种存储引擎,不同的存储引擎都有其在特定工作环境下的特点,选择适合的存储引擎能够有效提高应用程序的性能。
WiredTiger存储引擎 (默认) 💎
WiredTiger适合大多数工作场景,从MongoDB 3.2开始默认的存储引擎是WiredTiger,3.2版本之前的默认存储引擎是MMAPv1,MongoDB 4.x版本不再支持MMAPv1存储引擎。
- 支持document级别并发操作
WiredTiger对写入操作使用document级并发控制。因此,多个客户端可以同时修改集合的不同文档。对于大多数读写操作,WiredTiger使用乐观并发控制。WiredTiger仅在全局、数据库和集合级别使用意向锁。当存储引擎检测到两个操作之间的冲突时,其中一个操作将引发写入冲突,MongoDB会对用户透明地重试该操作。
- Snapshots and Checkpoints(快照和检查点)
WiredTiger使用多版本并发控制(MVCC)。在操作开始时,WiredTiger会向操作提供数据的point-in-time快照,快照显示了数据在内存中的一致性视图。
从3.6版开始,MongoDB将WiredTiger配置为每隔60秒创建检查点(即将快照数据写入磁盘)。在早期版本中,MongoDB将检查点设置为在WiredTiger中每隔60秒或写入2 GB日志数据时(以先发生的为准)对用户数据进行检查。
- Journal(日志)
WiredTiger将日志与检查点结合使用,以确保数据的持久性。WiredTiger日志将保留检查点之间的所有数据修改。如果MongoDB在两个检查点之间退出,它将使用日志重播自上一个检查点以来修改的所有数据
- Compression(压缩)
使用WiredTiger存储引擎,MongoDB会对所有集合和索引进行压缩,压缩以牺牲额外的CPU为代价,最大限度地减少了磁盘的使用。默认情况下,WiredTiger对所有集合使用block compression,并对索引使用prefix compression。
- 内存使用
对于WiredTiger,MongoDB利用WiredTiger内部缓存和文件系统缓存。从MongoDB 3.4开始,默认WiredTiger内部缓存大小为以下两者中的较大值:50% of (RAM - 1 GB)
, 256 MB
In-memory存储引擎 💎
从MongoDB 企业版3.2.6版开始,In-Memory存储引擎是64位版本中广泛使用(general availability GA)的一部分。除某些元数据和诊断数据外,In-Memory存储引擎不维护任何磁盘上的数据,包括配置数据,索引,用户凭据等。
- In-Memory存储引擎设置
配置--storageEngine选项值为inMemory;如果使用配置文件,则配置storage.engine
配置--dbpath,如果使用配置文件则配置storage.dbPath。尽管In-Memory存储引擎不会将数据写入文件系统,但它会在--dbpath中维护小型元数据文件和诊断数据以及用于构建大型索引的临时文件。
mongod --storageEngine inMemory --dbpath <path>
###
storage:
engine: inMemory
dbPath: <path>
- 并发(concurrency)
In-Memory存储引擎对于写入操作使用了document级并发控制。多个客户端可以同时修改集合的不同文档。
- 内存使用
默认情况下,In-Memory存储引擎使用50%的物理RAM减去1 GB。如果写操作的数据超过了指定的内存大小,则MongoDB返回错误:"WT_CACHE_FULL: operation would overflow cache"
"WT_CACHE_FULL: operation would overflow cache"
storage:
engine: inMemory
dbPath: <path>
inMemory:
engineConfig:
inMemorySizeGB: <newSize>
- 事务
从MongoDB 4.2开始,复制集和分片集群上支持事务,其中:主成员节点使用WiredTiger存储引擎,同时,辅助成员使用WiredTiger存储引擎或In-Memory存储引擎。 在MongoDB 4.0中,只有使用WiredTiger存储引擎的复制集才支持事务。
注意
单机使用是不支持事务的,只有在搭建集群的情况下才能使用事务