news 2026/8/4 7:34:50

MongoDB 8.0——存储

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MongoDB 8.0——存储

存储

    • 1、存储介绍
    • 2、WiredTiger存储引擎
      • 2.1、WiredTiger存储引擎介绍
      • 2.2、事务(读写)并发
      • 2.3、文档级并发性
      • 2.4、快照和检查点
      • 2.5、日志与压缩
      • 2.6、内存使用
    • 3、日志
      • 3.1、日志和WiredTiger存储引擎
      • 3.2、日志记录进程
      • 3.3、Journal Files
      • 3.4、日志和内存存储引擎

1、存储介绍

MongoDB数据库存储引擎是MongoDB负责管理数据的主要组件。MongoDB提供多种存储引擎,可以选择最适合自己应用程序的引擎。WiredTiger存储引擎是MongoDB数据库默认支持的,其具有如下特点:

  • 提供文档级锁定。
  • 内存和磁盘的性能都很好。
  • 支持文档级的并发。
  • 高压缩率。
  • 加密支持。

本文介绍的日志是WiredTiger预写日志,而不是MongoDB数据库日志文件。预写日志是帮助数据库在发生硬中止时恢复数据的记录。它提供了多个可配置选项,允许在特定场景下平衡性能和可靠性。

GridFS是一种用于自管理部署的多功能存储系统,专门用于处理大型文件,比如超过16MB文档大小限制的文件。

2、WiredTiger存储引擎

2.1、WiredTiger存储引擎介绍

MongoDB数据库的WiredTiger存储引擎是默认的存储引擎。对于现有部署,如果未指定–storageEngine或storage.engine设置,则mongod实例可以自动确定用于在–dbpath或storage.dbPath中创建数据文件的存储引擎。

MongoDB在以下环境中托管的部署可以使用WiredTiger存储引擎。

  • MongoDB Atlas:用于云中MongoDB部署的完全托管服务。

需要注意,所有MongoDB Atlas部署均使用WiredTiger存储引擎。WiredTiger存储引擎主要包括MongoDBEnterprise和MongoDB Community两个版本。MongoDB Enterprise是基于订阅、自我管理的MongoDB版本,MongoDB Community是基于源代码可用、免费使用且可自行管理的MongoDB版本。

关于WiredTiger引擎的操作和使用限制说明如下:

  • 不能将文档固定到WiredTiger缓存中。
  • WiredTiger不会保留一部分缓存用于读取,并将另一部分缓存用于写入。
  • 大量的写入工作负载可能会影响性能,不过在这种情况下,WiredTiger会优先确保索引缓存。
  • WiredTiger会将其缓存分配给整个mongod实例。
  • WiredTiger不会在每个数据库或每个集合级别分配缓 存。

2.2、事务(读写)并发

从MongoDB 7.0版本开始,MongoDB使用默认算法来动态调整并发存储引擎事务(读取和写入票证)的最大数量。动态并发存储引擎ACID事务算法可优化集群过载期间的数据库吞吐量。

并发存储引擎事务(读取和写入票证)的最大数量永远不会超过128读取票证和128写入票证,并且可能因集群中的节点而异。单个节点内的读取票证和写入票证的最大数量始终相等。

如果要指定动态最大值不能超过的读写事务(读取和写入操作)的最大数量,可使用storageEngineConcurrentReadTransactions和storageEngineConcurrentWriteTransactions。

如果要查看WiredTiger存储引擎支持的并发读事务(读票证)和写事务(写票证)的数量,可执行serverStatus命令并检查queues.execution响应文档。

需要注意,available在queues.execution中的低值并不表示存在集群过载,建议使用排队读取和写入票证数量作为集群过载的指示。

2.3、文档级并发性

MongoDB数据库的WiredTiger存储引擎会对写入操作使用文档级并发控制。因此,多个客户端可以同时修改某一集合中的不同文档。

MongoDB对于大多数读取和写入操作,WiredTiger均使用乐观并发控制。WiredTiger仅在全局、数据库和集合级别使用意向锁。当存储引擎检测到两个操作之间存在冲突时,其中一个操作会引发写入冲突,从而导致MongoDB以透明方式重试该操作。

MongoDB对于某些全局操作(通常是涉及多个数据库的短期操作)仍然需要全局性的“实例范围”锁。在某些情况下,其他一些操作(例如renameCollection)仍然需要独占数据库锁。

2.4、快照和检查点

MongoDB数据库的WiredTiger存储引擎使用多版本并发控制(Multi-Version Concurrency Control,MVCC)。在一个操作开始时,WiredTiger会向该操作提供数据在该时间点的快照,快照提供的视图将与内存中的数据保持一致。

当写入磁盘时,WiredTiger将快照中的所有数据以一致的方式跨所有数据文件写入磁盘。当持久性数据充当数据文件中的检查点时,检查点可确保数据文件在最后一个检查点之前(包括最后一个检查点)保持一致,即检查点可以充当恢复点。

MongoDB会配置WiredTiger以创建检查点,具体操作是每隔60秒将快照数据写入磁盘。在写入新检查点期间,前一检查点仍然有效。因此,即使MongoDB在写入新检查点时终止或出错,它在重新启动后也可以从上一个有效检查点恢复。

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

从MongoDB 5.0版本开始,可以使用minSnapshotHistoryWindowInSeconds参数来指定WiredTiger保留快照历史记录的时长。增大minSnapshotHistoryWindowInSeconds的值会增加磁盘使用量,因为服务器必须在指定的时间窗口内维护早期已修改值的历史记录。使用的磁盘空间量取决于工作负载,工作负载越大,需要的磁盘空间越多。MongoDB在WiredTigerHS.wt文件中维护快照历史记录,该文件位于指定的dbPath中。

2.5、日志与压缩

MongoDB数据库的WiredTiger存储引擎将预写日志与检查点结合使用,以确保数据的持久性。WiredTiger日志会保留各检查点之间的所有数据修改。如果MongoDB在检查点之间退出,其会使用日志来重放自上一个检查点以来修改的所有数据。

WiredTiger日志使用Snappy压缩库进行压缩。如果要指定其他压缩算法或不压缩,可以使用storage.wiredTiger.engineConfig.journalCompressor进行设置。

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

通过利用WiredTiger存储引擎,MongoDB能够支持对所有集合和索引进行压缩。压缩能够最大限度地减少存储使用量,但会消耗额外的CPU资源。默认情况下,WiredTiger对所有集合使用Sappy压缩库进行区块压缩,对所有索引使用前缀压缩。

对于集合,还可以选择使用zlib或zstd区块压缩库。如果需要指定另一种压缩算法或不压缩,可以使用storage.wiredTiger.collectionConfig.blockCompressor设置。对于索引,如果要禁用前缀压缩,可以使用storage.wiredTiger.indexConfig.prefixCompression设置。在创建集合和索引期间,还可以在每个集合和每个索引的基础上配置压缩设置。对于大多数工作负载,默认的压缩设置可以在存储效率和处理需求之间取得平衡。

2.6、内存使用

MongoDB数据库通过WiredTiger存储引擎,可以同时利用WiredTiger内部缓存和文件系统缓存,默认WiredTiger内部缓存大小为以下两者中的较大者:

  • (RAM大小-1 GB)的50%。
  • 256 MB。

例如,在总RAM为4GB的系统上,WiredTiger缓存使用1.5GB RAM,算式如下:(0.5 * (4 GB - 1 GB) = 1.5 GB)。相反,在总RAM为1.25GB的系统上,WiredTiger存储引擎为WiredTiger缓存分配了256 MB,因为这大于总RAM的一半减去1GB,算式如下:0.5 * (1.25 GB - 1 GB) = 128 MB < 256 MB)需要注意,在某些情况下,例如在容器中运行时,数据库的内存约束可以低于系统总内存。在此类情况下,将此内存限制而非系统总内存用作最大可用RAM。

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

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

  • 文件系统缓存中的数据与磁盘上的数据格式相同,并且同样拥有数据文件压缩带来的好处。操作系统使用文件系统缓存来减少磁盘I/O。
  • WiredTiger内部缓存中加载的索引具有与磁盘上格式不同的数据表示形式,但仍可利用索引前缀压缩来减少RAM使用量。索引前缀压缩会对被索引字段中的常用前缀去重。
  • WiredTiger内部缓存中的集合数据未压缩,并使用与磁盘上格式不同的表示形式。区块压缩可大幅节省磁盘上的存储空间,但数据必须解压缩才能由服务器操作。

借助文件系统缓存,MongoDB会自动使用WiredTiger缓存或其他进程未使用的所有空闲内存。

3、日志

3.1、日志和WiredTiger存储引擎

为了在存储引擎发生故障时提供持久性,MongoDB数据库会提前将日志记录写入磁盘上的日志文件(MongoDB数据库数据目录中的顺序二进制日志文档)​。注意,这里提到的日志是指WiredTiger预写日志,而不是MongoDB数据库的日志文件。

WiredTiger使用检查点提供磁盘上数据的一致视图,并允许MongoDB从最后一个检查点恢复。但是,如果MongoDB在检查点之间意外退出,则需要日志来恢复最后一个检查点之后发生的信息。需要注意,从MongoDB6.1版本开始,日志始终处于启用状态。因此,MongoDB会删除storage.journal.enabled选项以及相应的–journal和–nojournal命令行选项。

通过日志记录恢复进程,需要关注以下几点:

  • 在数据文件中查找最后一个检查点的标识符。
  • 在日志文件中搜索与上一个检查点的标识符匹配的记录。
  • 应用日志文件中自上一个检查点以来的操作。

3.2、日志记录进程

MongoDB通过日志记录,WiredTiger存储引擎为每个客户端发起的写入操作创建一条日志记录。日志记录包括由初始写入引起的任何内部写入操作。例如,对集合中文档的更新可能会导致对索引的修改;WiredTiger会创建一条日志记录,其中包括更新操作及其关联的索引修改。

MongoDB配置WiredTiger使用内存缓冲来存储日志记录。线程会进行协调,以分配并复制到它们的缓冲区部分。所有不超过128KB的日记记录都会被缓冲。当满足以下任一条件时,WiredTiger会将缓冲的日志记录同步到磁盘:

  • 对于副本集成员(主节点和从节点成员)​,如果写入操作包含或暗示j: true的写关注。此外,对于从节点,在每次批量应用操作日志条目之后进行。注意,如果writeConcernMajorityJournalDefault为真,则写关注majority默认为j: true。
  • 每100毫秒一次。
  • 当WiredTiger创建新的日志文件时,由于MongoDB使用上限为100 MB的日志文件,因此WiredTiger大约每100 MB数据创建一份新日志文件。

在写入操作之间,虽然日志记录保留在WiredTiger缓冲区中,但硬关闭mongod后可能会丢失更新。

3.3、Journal Files

对于日志文件,MongoDB会在dbPath目录下创建一个名为journal的子目录。WiredTiger日志文件的名称格式为:WiredTigerLog.<sequence>,其中<sequence>是从0000000001开始的零填充数字。

在日志文件中,客户端启动的每个写入操作都有一条记录,具体内容如下:

  • 日志记录包括由初始写入引起的任何内部写入操作。例如,对集合中文档的更新可能会导致对索引的修改;WiredTiger创建一条日志记录,其中包括更新操作及其关联的索引修改。
  • 每条记录都有一个唯一的标识符。
  • WiredTiger的最小日记记录大小为128字节。

默认情况下,MongoDB将WiredTiger配置为对其日志数据使用Snappy压缩。如果要指定不同的压缩算法或不进行压缩,需要使用storage.wiredTiger.engineConfig.journalCompressor设置。如果日志记录小于或等于128字节(WiredTiger的最小日志记录大小)​,WiredTiger不会压缩该记录。WiredTiger日志文件的大小限制约为100MB。一旦文件超过该限制,WiredTiger就会创建一个新的日志文件。

WiredTiger会自动删除旧日志文件,仅保留从上一个检查点恢复所需的文件。如果要确定为日志文件留出多少磁盘空间,需考虑以下因素:

  • 检查点的默认最大大小为2GB。
  • MongoDB从检查点恢复时,可能需要额外的空间来写入新的日志文件。
  • MongoDB压缩日志文件。
  • 恢复检查点所需的时间取决于你的使用案例。
  • 如果覆盖最大检查点大小或禁用压缩,则计算结果可能会有很大不同。

基于这些原因,很难准确计算出需要多少额外空间,因此高估所需要的磁盘空间始终是一种更安全的方法。如果没有为日志文件留出足够的磁盘空间,MongoDB服务器将会崩溃。通常,WiredTiger会预先分配日志文件的大小。

3.4、日志和内存存储引擎

在MongoDB Enterprise中,内存存储引擎是正式发布版(GA)的一部分。由于其数据保存在内存中,因此没有单独的日志。写关注为j: true的写入操作会立即得到确认。如果副本集的任何有投票权成员使用内存存储引擎,则必须将writeConcernMajorityJournalDefault设为false。

注意,从MongoDB 4.2版本开始,如果某个副本集节点使用内存存储引擎(有投票权或无投票权)​,但副本集将writeConcernMajorityJournalDefault设置为true,则该副本集节点会记录一个启动警告。

在将writeConcernMajorityJournalDefault设置为false时,MongoDB不会等待w: "majority"在写入磁盘日志后才确认写入。例如,"majority"写操作可能会在给定副本集中的大部分节点发生临时断连(例如崩溃或重启)的情况下回滚。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/4 7:34:37

免费额度从10分钟到1000分钟2026实测15款语音转文字工具 哪款免费版够用

简短结论 目前这15款语音转文字工具的免费版中&#xff0c;选对场景基本都能满足日常需求&#xff0c;公开资料显示免费额度最高已达上千分钟。单次短音频转写很多工具都可覆盖&#xff1b;听脑AI更适合需要把录音整理成会议纪要、课堂复习材料、访谈摘要或客户跟进事项的用户。…

作者头像 李华
网站建设 2026/8/4 7:33:47

MariaDB从零到一:安装、CRUD、权限管理与性能优化实战指南

1. 项目概述&#xff1a;为什么你需要掌握MariaDB&#xff1f;如果你正在搭建一个网站、开发一个应用&#xff0c;或者仅仅是需要管理一些结构化的数据&#xff0c;数据库几乎是绕不开的一环。你可能听说过MySQL&#xff0c;它是开源数据库领域的“老大哥”。但今天我们要聊的&…

作者头像 李华
网站建设 2026/8/4 7:30:57

度小满大模型技术一面,AI Agent、多 Agent 架构、ReAct、上下文工程、MCP、Tool Calling、RAG 和大模型幻觉全解析!

本文整理自一场 度小满大模型方向技术一面。 本场面试主要围绕 AI Agent、多 Agent 架构、ReAct、上下文工程、MCP、Tool Calling、RAG 和大模型幻觉等内容展开。 文末附有候选人简介&#xff0c;以及候选人面了 70 场的最大心得体会。一、AI Agent 基础 Agent 与 Workflow 什么…

作者头像 李华
网站建设 2026/8/4 7:29:06

如何把开题报告设计成可复核的研究工作流

开题报告可以看作一个研究计划对象&#xff1a;它不仅包含文字&#xff0c;还包含研究问题、材料、方法、阶段任务和验收条件。把这些信息拆开&#xff0c;有助于减少背景、文献、方法和进度互相脱节的问题。 一、先建立研究问题对象 可以先记录以下字段&#xff1a; {"…

作者头像 李华
网站建设 2026/8/4 7:18:54

从零构建高可用站内信系统:WebSocket、消息队列与数据一致性实战

你是不是觉得站内信推送系统很简单&#xff1f;不就是用户发个消息&#xff0c;系统存一下&#xff0c;然后推给另一个用户吗&#xff1f;很多开发者一开始都这么想&#xff0c;直到真正动手时才发现处处是坑&#xff1a;消息延迟、已读状态不同步、海量数据下的性能瓶颈、推送…

作者头像 李华
网站建设 2026/8/4 7:18:49

编译原理核心算法精解:从NFA/DFA到LR分析实战

1. 项目概述&#xff1a;为什么“刷题”是编译原理通关的必经之路又到了学期末&#xff0c;看着《编译原理》教材上那些词法分析、语法分析、LR(1)项目集&#xff0c;是不是感觉头都大了&#xff1f;我当年学编译原理的时候&#xff0c;跟大多数同学一样&#xff0c;觉得这门课…

作者头像 李华