Mongodb(1)——存储引擎WiredTiger的使用

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 内容是个人分析,如有不当,欢迎指正。

wiredtiger

DatabaseHolder:负责创建、关闭、获取DB。
Database:Database的入口,是Database的类的实现,提供了Collection的创建销毁接口。
StorageEngine:存储引擎的抽象类,各类存储引擎事实上都是继承于StorageEngine。
KVEngine:KVStorageEngine实际是调用这个类的操作。
WiredTigerKVEngine:KVEngine实际也只是一个抽象类,具体的实现由WiredTigerEngine完成,我们关心的Wiredtiger存储引擎的工作就是从这开始的,从上层来看,这里就是WiredTiger存储工作的起始;而从下层看,这里只是向外提供了一层接口,真正的使用是在各接口中调用WT的方法。
RecordStore:各类存储引擎的实现类具体工作只是创建RecordStore(以下简称RS),真正负责数据的读取存储都是在RS中完成。
ServiceContext:负责在启动时设置系统环境,StorageEngine的设置也是在其中完成。
CatalogEntry:各类CatalogEntry,几乎每一层概念都会有一个CatalogEntry,其会有一些辅助功能,但这种类的意义我还不是太理解。

1. DB的创建

12
代码如上所示,如果这个dbname不存在就会创建,Collection也是如此。所以可以看到Mongo创建DB的逻辑。

  1. 首先得到dbname,然后检查是否已经存在这个DB,如果没有,就开始创建过程。
  2. 获取storageEngine,在启动的时候storage engine就被设置好了。由storage engine获取 DatabaseCatalogEntry。
  3. 由dbname、entry创建DB,并将DB保存到map中。

2. 创建Collection

创建Collection的过程如下代码所示,我们从Database类的CreateCollection方法开始。至于这个方法在哪里调用有兴趣的可以去跟踪。
3

  1. 前面看到创建DB时传入了DatabaseCatalogEntry,第一步就是通过这个entry的CreateCollection创建,但你继续跟踪的话会发现,这个步骤正如注释的在创建用于存储Collection数据的文件,Mongo的底层并没有区分db,Collection,而是将db.collection作为键值生成一个唯一的文件名,每一个db.collection都是唯一的,对应着一个文件。在后面数据格式的章节会详细说明。
  2. 紧接着这第一步的基础上创建真正的Collection实例,因为第一步会得到RS,而RS是真正存储的地方。
    如下代码是WT创建RS.

4
如下代码是插入一条数据在WiredTigerRecordStore的接口操作。
5
6

3. WT对数据的组织

虽然对用户而言,DB->Collection->Record层次关系十分清晰,但到了底层数据的存储就不在保留这些关系。
WT将db.collection作为一个键值,通过算法计算得到对应的一个唯一的字符串,因为db.collection是唯一的,所以得到这个唯一的字符串也不是什么难事,然后将这个字符串作为文件名生成一个Collection文件,相应的也会生成一个索引文件。在Collection文件中记录着KV对,其中这个Value是插入的数据,而Key是自动加1的。对于每个collection,key都是从0开始递增,然后index文件会生成对应的索引。形式如下:
7
8
说明:上述数据组织很多是个人分析后的推测,具体的生成文件名的方法没有具体看。除了各自的Collection插入KV是自增外,另外应该还会有一个全局的自增,记录每一个DB.Collection。这条记录作为系统的元数据,我暂时不能确定是存在wiredtiger文件还是在collection-0文件。图片引用自:https://yq.aliyun.com/articles/65?spm=5176.100240.searchblog.47.IU5fhf

9

引用:

  1. https://yq.aliyun.com/articles/65?spm=5176.100240.searchblog.47.IU5fhf
  2. https://yq.aliyun.com/articles/61?spm=5176.8091938.0.0.uN6vY4
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
4月前
|
存储 监控 NoSQL
【MongoDB 专栏】MongoDB 的存储引擎选择与优化
【5月更文挑战第11天】MongoDB 的存储引擎选择与优化至关重要,影响数据库性能、可靠性和可扩展性。常见引擎有默认的 WiredTiger(提供高性能读写、文档级并发控制和压缩)和较旧的 MMAPv1。选择引擎需考虑性能需求、数据规模、并发操作和压缩需求。WiredTiger 以其高性能和并发控制脱颖而出。优化策略包括配置参数、规划数据结构、监控性能和定期维护。案例显示,WiredTiger 对于并发访问频繁的电商平台尤为适合。未来,更高效、智能的存储引擎将应运而生,持续优化将是保持数据库系统竞争力的关键。
88 2
【MongoDB 专栏】MongoDB 的存储引擎选择与优化
|
3月前
|
存储 NoSQL 算法
MongoDB存储引擎发展及WiredTiger深入解析(二)
MongoDB存储引擎发展及WiredTiger深入解析(二)
|
10月前
|
存储 缓存 NoSQL
MongoDB 存储引擎
MongoDB 存储引擎
|
10月前
|
存储 NoSQL Shell
如何将阿里云WiredTiger引擎的MongoDB物理备份文件恢复至自建数据库
数据库操作一直是一个比较敏感的话题,动不动“删库跑路”,可见数据库操作对于一个项目而言是非常重要的,我们有时候会因为一个游戏的严重bug或者运营故障要回档数据库,而你们刚好使用的是阿里云的Mongodb,那么这篇文章将给你提供一个思路(或许你按照阿里云官网的文档一顿操作下来,并不是那么顺利,有一些报错,无法登录...)
|
存储 缓存 NoSQL
MongoDB的存储引擎
MongoDB是一个面向文档的NoSQL数据库,其存储原理在不同的存储引擎下可能会有所不同。MongoDB的两个主要存储引擎是MMAPv1(已弃用)和WiredTiger。
674 0
|
存储 缓存 NoSQL
【mongo 系列】mongodb 学习十二,MongoDB 存储引擎
上次我们说到了关于 mongodb 的集群,分为主从集群和分片集群,对于分片集群中的分片这里需要注意如下几点,一起来回顾一下
220 0
|
存储 NoSQL 数据库
Mongodb Wiredtiger存储引擎实现原理
按照Mongodb默认的配置,WiredTiger的写操作会先写入Cache,并持久化到WAL(Write ahead log),每60s或log文件达到2GB时会做一次Checkpoint,将当前的数据持久化,产生一个新的快照。
2121 0
|
存储 算法 Java
MongoDB 3.2版WiredTiger存储引擎性能测试
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/50358711 MongoDB 3.2版WiredTiger存储引擎性能测试 作者:chszs,未经博主允许不得转载。
1270 0