MongoDB 研究报告

张开发
2026/4/10 13:54:18 15 分钟阅读

分享文章

MongoDB 研究报告
MongoDB 研究报告1. 产品定位MongoDB是MongoDB Inc.(纳斯达克上市,代码 MDB)推出的文档型 NoSQL 数据库。最新版本是MongoDB 8.0(2024年发布)。一句话定位:基于 JSON/BSON 文档模型的数据库,通过分片集群水平扩展,支持分布式事务,主打灵活 Schema 和高并发写入。跟关系型数据库的区别:MongoDB 不是关系型数据库,不支持标准 SQL JOIN。它用嵌套文档和数组替代多表关联,以换取 Schema 的灵活性——字段随时可以增减,不用改表结构。跟竞品的区分:同样是分布式数据库,TiDB/OceanBase 兼容 MySQL 协议,MongoDB 则完全走了另一条路:放弃 SQL 兼容,换取文档模型的表达力和灵活度。2. 技术架构2.1 两种核心架构:副本集 vs 分片集群MongoDB 实际上只有两种部署形态,搞清楚这个就理解了一半:架构适用场景副本集(Replica Set)中小规模,高可用优先,写入不需扩展分片集群(Sharded Cluster)TB 级数据,高并发写入,需要水平扩展两种架构的核心区别在于"写入能不能分布到多台机器"。副本集写入都在一个主节点,分片集群则分散到多个 Shard。2.2 副本集架构应用层 │ │ 读写都连 Primary ▼ ┌───────────────┐ │ Primary │ ◄── 唯一可写节点 └───────┬───────┘ │ oplog 异步复制 ▼ ┌───────────────┐ ┌───────────────┐ │ Secondary │ │ Secondary │ │ (可读) │ │ (可读) │ └───────────────┘ └───────────────┘三个节点之间通过oplog(操作日志)保持数据同步。Primary 挂了之后,两个 Secondary 会自动投票选出新主,这个过程通常 10-30 秒。节点角色一览:节点类型可写可读投票存数据Primary✅✅✅✅Secondary❌✅✅✅Arbiter❌❌✅❌2.3 分片集群架构这是生产环境最常用的形态:应用层 │ │ 标准 Wire Protocol ▼ ┌─────────────────┐ │ mongos │ ◄── 查询路由器,客户端唯一入口(无状态,可多实例) └────────┬────────┘ │ ▼ ┌─────────────────┐ │ Config Server │ ◄── 元数据中心,存储"分片键范围→Shard映射" │ 副本集(3节点) │ └────────┬────────┘ │ ├────────────────────┬────────────────────┐ ▼ ▼ ▼ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ Shard1 副本集 │ │ Shard2 副本集 │ │ Shard3 副本集 │ │ · Primary │ │ · Primary │ │ · Primary │ │ · Secondary │ │ · Secondary │ │ · Secondary │ │ · Secondary │ │ · Secondary │ │ · Secondary │ └──────────────┘ └──────────────┘ └──────────────┘三个组件各司其职:组件做什么能否水平扩展mongos路由查询,解析分片键,查询 Config Server 找目标 Shard✅ 无状态,随便加Config Server存集群元数据(数据库/集合定义、分片键范围、Chunk 分布)❌ 3节点固定shard存实际数据,每个 shard 都是一个副本集✅ 核心扩展点2.4 MongoDB vs MySQL 数据结构对比这是理解 MongoDB 的关键:MySQLMongoDB说明DatabaseDatabase同一层,概念一致Schema❌ 不存在MySQL 里 Database = SchemaTableCollection集合,存文档RowDocument文档(BSON),可嵌套对象和数组ColumnField文档里的字段MySQL 的关联 vs MongoDB 的嵌套:MySQL 需要多表 JOIN:-- MySQL:两张表 + JOIN SELECT u.name, o.amount FROM users u JOIN orders o ON u.id = o.user_id WHERE o.amount 100;MongoDB 把有关联的数据直接嵌套进去:// MongoDB:一个文档搞定,不用 JOIN db.users.insertOne({ _id: 1, name: "张三", orders: [ { id: "o1", amount: 150 }, { id: "o2", amount: 200 } ] }) // 查询直接对嵌套字段操作 db.users.find({ "orders.amount": { $gt: 100 } })这种设计叫做“反范式化”——用数据冗余换查询效率。代价是更新嵌套数据时需要整体更新,但 MongoDB 的原子操作保证了不会读到不一致的数据。2.5 存储引擎引擎默认版本适用场景WiredTiger(默认)MongoDB 3.2+通用 OLTP,文档级锁,压缩存储In-Memory企业版低延迟,但断电会丢数据静态加密企业版TDE,敏感数据合规3. 部署架构3.1 最小配置场景最小配置开发测试1 台机器跑单节点生产最小3 节点副本集分片集群9 台机器(3 mongos + 3 Config Server + 3 Shard,每个 Shard 配 3 副本)3.2 硬件配置建议角色CPU内存磁盘说明mongos8-16 核16-32 GB无数据盘纯路由,CPU 密集

更多文章