体系结构与物理存储
mongod 是保存数据并处理请求的数据库进程。单机、复制集成员和分片中的 Shard 都运行 mongod;分片集群还使用 mongos 路由请求,并用 Config Server Replica Set 保存集群元数据。
运行组件
| 组件 | 作用 |
|---|---|
| 网络与命令层 | 认证、解析命令、选择执行计划并返回结果 |
| WiredTiger Cache | 缓存数据页、索引页和更新版本 |
| Storage Engine | 管理页、Checkpoint、压缩、并发与持久化 |
| Journal | WiredTiger 的 Write-Ahead Log,用于恢复 Checkpoint 后的变化 |
| Oplog | 复制集的逻辑操作历史,Secondary 用于复制和重放 |
| Diagnostic Log | 记录运行事件和慢操作,不用于恢复数据 |
Journal 与 Oplog 不是一回事:Journal 解决单个节点的崩溃恢复;Oplog 解决复制集成员之间的数据复制,也支撑 Change Stream 等能力。
WiredTiger
WiredTiger 是 MongoDB 的默认存储引擎。它使用文档级并发控制,并通过 Snapshot 提供操作的一致视图。数据和索引支持压缩,但压缩比例取决于字段重复、值分布、索引数量和压缩算法。
WiredTiger Cache 与操作系统文件缓存共同工作。数据库进程内存看起来较高不一定是泄漏;判断压力需要同时观察 Cache Dirty、Eviction、读入写出、Page Fault、磁盘延迟和系统可回收内存。
Checkpoint 与 Journal
Checkpoint 提供数据文件的一致恢复点;Journal 保存两个 Checkpoint 之间需要恢复的变化。只有 Journal 没有数据文件无法恢复完整数据库,只有旧 Checkpoint 没有所需 Journal 则会丢失其后的变化。
现代版本中 Journaling 默认且持续启用。持久性仍取决于 Write Concern、文件系统、磁盘控制器是否真实履行持久化语义,以及运行环境是否完整保存数据目录。
数据文件与空间
WiredTiger 为 Collection 和 Index 管理独立的内部表与文件。删除文档后释放的空间通常先供同一数据文件内部复用,不等于文件立即缩小并归还操作系统。
影响磁盘占用的主要部分包括:
- Collection 数据和文档填充空间。
- 所有 Index,数组索引可能为一个文档产生多个索引键。
- Journal、Oplog 和复制或恢复保留的数据。
- WiredTiger History Store 与长时间 Snapshot 需要的历史版本。
- 临时排序、构建索引、备份快照和诊断日志。
磁盘容量规划不能只用业务 BSON 大小乘副本数。索引、压缩率、更新放大、Oplog 窗口、初始同步和维护操作都需要独立余量。