逻辑架构
MongoDB与MySQL中的架构差不多,底层都使用了可插拔的存储引擎以满足用户的不用需要。用户可以根据程序的数据特征选择不同的存储引擎,在最新版本的MongoDB中使用了WiredTiger作为默认的存储引擎,WiredTiger提供了不用粒度的并发控制和压缩控制,能够为不同种类的应用提供最好的性能和存储率。
MongoDB存储引擎
存储引擎是MongoDB的核心组件,负责管理数据如何存储在硬盘和内存上。MongoDB支持的存储引擎有MMAPv1 ,WiredTiger和InMemory。InMemory存储引擎用于将数据只存储在内存中,只将少量的元数据(meta-data)和诊断日志(Diagnostic)存储到硬盘文件中,由于不需要Disk的IO操作,就能获取所需
的数据,InMemory存储引擎大幅度降低了数据查询的延迟(Latency)。从mongodb3.2开始默认的存储引擎是WiredTiger,3.2版本之前的默认存储引擎是MMAPv1,mongodb4.x版本不再支持MMAPv1存储引擎。
WiredTiger存储引擎
- WiredTiger使用BTree存储,MMAPV1使用线性存储需要Padding
- WiredTiger支持文档级别锁,MMAPV1引擎只支持表级锁
- WiredTiger使用snappy(默认)和zlib压缩方式
- WiredTiger可以指定使用内存的大小
WiredTiger使用了二阶缓存wiredTiger Cache,File System Cache来保证Disk上的数据的最终一致性
WiredTiger引擎包含的文件和作用
WiredTiger.basecfg: 存储基本配置信息,与 ConfigServer有关系
- WiredTiger.lock: 定义锁操作
- table*.wt: 存储各张表的数据
- WiredTiger.wt: 存储table* 的元数据
- WiredTiger.turtle: 存储WiredTiger.wt的元数据
journal: 存储WAL(Write Ahead Log)
WiredTiger存储引擎实现原理
WiredTiger的写操作会默认写入Cache ,并持久化到WAL (Write Ahead Log),每60s或Log文件达到2G做一次checkpoint (当然我们也可以通过在写入时传入 j: true 的参数强制 journal 文件的同步 ,writeConcern{ w: , j: , wtimeout: }) 产生快照文件。WiredTiger初始化时,恢复至最新的快照状态,然后再根据WAL恢复数据,保证数据的完整性。
Cache是基于BTree的,节点是一个page,root page是根节点,internal page是中间索引节点,leafpage真正存储数据,数据以page为单位读写WiredTiger采用Copy on write的方式管理写操作(insert、update、delete),写操作会先缓存在cache里,持久化时,写操作不会在原来的leaf page上进行,而是写入新分配的page,每次checkpoint都会产生一个新的root page。
在数据库宕机时 , 为保证 MongoDB 中数据的持久性,MongoDB 使用了Write Ahead Logging 向磁盘上的 journal 文件预先进行写入。除了 journal 日志,MongoDB 还使用检查点(checkpoint)来保证数据的一致性,当数据库发生宕机时,我们就需要 checkpoint 和 journal 文件协作完成数据的恢复工作。- 在数据文件中查找上一个检查点的标识符
- 在 journal 文件中查找标识符对应的记录
- 重做对应记录之后的全部操作