存储引擎
该存储引擎是负责管理数据的存储,无论是在内存和磁盘数据库的组成部分。MongoDB支持多个存储引擎,因为不同的引擎对于特定的工作负载性能更好。为您的用例选择合适的存储引擎会极大地影响应用程序的性能。
从4.2版开始,MongoDB删除不推荐使用的MMAPv1存储引擎。
WiredTiger存储引擎(默认)
WiredTiger是从MongoDB 3.2开始的默认存储引擎。它非常适合大多数工作负载,建议用于新部署。WiredTiger提供了文档级并发模型,检查点和压缩以及其他功能。
在MongoDB Enterprise中,WiredTiger还支持静态 加密。请参阅 加密的存储引擎。(社区版本不可用)
内存中存储引擎(社区版本不可用)
内存中存储引擎在MongoDB Enterprise中可用。它不是将文档存储在磁盘上,而是将它们保留在内存中,以提供更可预测的数据延迟。
WiredTiger存储引擎
-
文档级并发
对于大多数读取和写入操作,WiredTiger使用乐观并发控制
WiredTiger仅在全局,数据库和集合级别使用意图锁。
当存储引擎检测到两个操作之间存在冲突时,将引发写冲突,从而导致MongoDB透明地重试该操作。
-
快照和检查点
WiredTiger使用MultiVersion并发控制(MVCC)
写入磁盘时,WiredTiger将所有数据文件中的快照中的所有数据以一致的方式写入磁盘。现在持久的 数据充当数据文件中的检查点。该检查点可确保数据文件直到最后一个检查点(包括最后一个检查点)都保持一致;即检查点可以充当恢复点。
MongoDB将WiredTiger配置为以60秒的间隔创建检查点.
-
日记
WiredTiger将预写日志(即日志)与检查点结合使用 以确保数据的持久性。
WiredTiger日记保留检查点之间的所有数据修改。如果MongoDB在检查点之间退出,它将使用日志重播自上一个检查点以来修改的所有数据。有关MongoDB将日志数据写入磁盘的频率的信息,请参阅Journaling Process。
WiredTiger日记使用快速压缩库进行压缩。若要指定其他压缩算法或不进行压缩,请使用该 storage.wiredTiger.engineConfig.journalCompressor
设置。有关更改日志压缩器的详细信息,请参阅“ 更改WiredTiger日志压缩器”。
您可以通过将设置storage.journal.enabled
为来禁用独立实例 false
的日志记录,这样可以减少维护日志记录的开销
-
压缩
使用WiredTiger,MongoDB支持对所有集合和索引进行压缩。压缩可以最大程度地减少存储使用量,但会增加CPU的开销。
默认情况下,WiredTiger使用块压缩与活泼的 全部收集和压缩库前缀压缩 所有索引。
对于集合,还提供以下块压缩库:
要指定替代压缩算法或不压缩,请使用该storage.wiredTiger.collectionConfig.blockCompressor
设置。
对于索引,要禁用前缀压缩,请使用 storage.wiredTiger.indexConfig.prefixCompression
设置。
压缩设置还可以在收集和索引创建期间基于每个集合和每个索引进行配置。请参见 指定存储引擎选项和 db.collection.createIndex()storageEngine选项。
对于大多数工作负载,默认压缩设置可以平衡存储效率和处理要求。
-
内存使用
通过WiredTiger,MongoDB可以利用WiredTiger内部缓存和文件系统缓存。
从MongoDB 3.4开始,默认的WiredTiger内部缓存大小是以下两者中的较大者:
- 50%(RAM-1 GB),或
- 256 MB。
例如,在总共有4GB RAM的系统上,WiredTiger缓存将使用1.5GB RAM()。相反,总内存为1.25 GB的系统将为WiredTiger缓存分配256 MB,因为这是总RAM的一半以上减去1 GB()。0.5 * (4 GB - 1 GB) = 1.5 GB0.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内部缓存的大小增加到其默认值以上。