什么是 MongoDB?
MongoDB 是一种 NoSQL 数据库,由 C++ 编写。它是一个开源的,高性能的,可扩展的文档型数据库。它的数据模型是基于文档的,以 BSON 格式(二进制 JSON)存储数据,可以灵活地存储类似于 JSON 格式的文档、数组、嵌套的对象等结构化数据。
MongoDB 内部运行机制
存储引擎
MongoDB 中使用了多种存储引擎,其中最常用的是 WiredTiger 引擎。WiredTiger 是一种高性能、可靠、可扩展的存储引擎,支持事务、压缩、多版本控制、内存映射等特性。
WiredTiger 存储引擎由两个组成部分:存储引擎和数据库核心。其中存储引擎管理数据的物理存储和相关操作,数据库核心则管理存储引擎和其他组件之间的交互和协调。
内存管理
MongoDB 使用了内存映射技术来管理内存,这就意味着数据从磁盘读取时会被映射到进程的虚拟内存中,MongoDB 会对虚拟内存地址进行管理。这种方式的好处是可以节省内存,MongoDB 只会加载访问到的数据到内存中。
MongoDB 中的内存管理主要由以下两个部分组成:mongod 和 mongos。
mongod 是 MongoDB 的主要服务器进程,它扮演着数据存储的角色。mongod 负责将数据写入磁盘,并将其从磁盘读取到内存中进行查询操作。mongod 通过使用内存映射技术,使用 mmap 系统调用将数据从磁盘读取到内存中。
mongos 则是 MongoDB 的路由服务,它负责将查询请求路由到正确的 shard 上。mongos 通过使用 mongod 实例上的缓存和内部元数据来处理查询请求。mongos 中的内存管理会使用 LRU 策略(最近最少使用)来管理内存。一旦 mongos 缓存的空间用完了,它会从最旧的数据中删除一部分,以腾出更多的空间。
分片技术
MongoDB 中的分片技术可以帮助用户处理数据的扩展性问题。在分片技术中,MongoDB 将一个数据集分成多个分片(shard),每个分片都是一个独立的 MongoDB 实例,有自己的数据集和存储系统。
在分片技术中,MongoDB 的 mongos 会将查询请求路由到正确的 shard 上。mongos 会使用 mongod 实例上的缓存和内部元数据来处理查询请求,如果缓存没有合适的数据,则将请求转发到正确的 shard 上。
事务处理
MongoDB 中自带的事务处理主要是基于 WiredTiger 存储引擎的。MongoDB 的事务处理允许用户将多个文档的更改捆绑在一起,以确保强一致性。事务处理的两个核心概念是 ACID 和 MVCC。
ACID 是指事务必须满足原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。MongoDB 的事务处理中,每次事务都是原子性的操作,如果其中一个操作失败,将会回滚整个事务。
MVCC 是指多版本并发控制(Multi-Version Concurrency Control),是解决数据库事务中并发访问的一种技术。MongoDB 的 MVCC 是基于版本号来实现的。
数据备份与恢复
MongoDB 提供了多种备份和恢复数据的方法。其中可能最常用的方法是使用 mongodump 和 mongorestore。
mongodump 是 MongoDB 中导出数据的工具,它会将数据以 BSON 格式导出。mongorestore 则是 MongoDB 中导入数据的工具。它会将 BSON 文件以 MongoDB 数据库中的格式导入,以便之后使用。
总结
在本文中,我们对 MongoDB 的内部运行机制进行了介绍。我们了解到了 MongoDB 中的存储引擎、内存管理、分片技术、事务处理、数据备份与恢复等内容。这些知识对于我们了解 MongoDB 的内部运行机制、灵活使用 MongoDB 应该有很大的指导意义。以下是 MongoDB 的示例代码:
-- -------------------- ---- ------- -- -- ------- --- ----- -------- - -------------------- -------------------------------------------- ----------------- ------- -- -- ------ ----- ---------- - --- ----------------- ----- ------- ---- ------- ------ ------ --- -- -- ----- ----- ---- - ---------------------- ------------ -- ---- ----- ---- - --- ------ ----- ------ ---- --- ------ --------------- --- ----------------------- - -- ----- - ----------------- - ---- - ----------------- ----- ---------------- - --- -- ---- ------------- ------------- ------ - -- ----- - ----------------- - ---- - ------------------- - --- -- ---- ---------------------------- ------- ----- ---- ------------- ----- - -- ----- - ----------------- - ---- - ----------------- ------- ---------------- - --- -- ---- ---------------------------- ------- ------------- ----- - -- ----- - ----------------- - ---- - ----------------- ------- ---------------- - ---
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f2e43ff6b2d6eab3c70ef8