Mongodb的起源可以说是和nosql以及大数据密切关联的。2007年,Dwight Merriman, Eliot Horowitz和Kevin Ryan成立10gen软件公司,在成立之初,这家的公司目标进军云计算行业。他们觉得传统的关系型数据库无法满足他们的要求,他们想要一款程序员不懂SQL语言也可以使用的数据存储产品——Mongodb。
mongodb是个可扩展、高性能、开源、面向文档(document-oriented)的数据库,由c++实现。
一、mongodb的数据逻辑结构
MongoDB是一种面向文档的数据库管理系统,它使用文档的方式来存储数据。具体来说,MongoDB中的数据是以BSON(Binary JSON)文档的形式组织的,每个文档都是一个键值对的集合,可以包含任何类型的数据。JSON是一个很方便的数据交换格式,但是其类型比较有限。BSON在其基础上增加了“byte array”数据类型。这使得二进制的存储不再需要先base64转换后再存成JSON。大大减少了计算开销和数据大小。MongoDB提供了动态查询的能力,允许在运行时灵活地添加、修改和删除文档中的字段和索引。这种灵活性使得MongoDB能够适应不断变化的数据模型需求。
ongoDB 数据逻辑结构分为数据库(database)、集合(collection)、文档(document)三层 :
-
一个mongod实例中允许创建多个数据库。
-
一个数据库中允许创建多个集合(集合相当于关系型数据库的表)。
-
一个集合则是由若干个文档构成(文档相当于关系型数据库的行,是MongoDB中数据的基本单元)。
1.1.集合特点
- 前面介绍MongoDB的时候提到过,集合是schema-less的(无模式或动态模式),这意味着集合不需要在读写数据前创建模式就可以使用,集合中的文档也可以拥有不同的字段,随时可以任意增减某个文档的字段。
- 在集合上可以对文档进行增删改查以及进行聚合操作。
- 在集合上还可以对文档中的字段创建索引。
- 除了一般的集合外,还可以创建一种叫做**定容集合(capped collection)**类型的集合,这种集合与一般集合主要的区别是,它可以限制集合的容量大小,在数据写满的时候,又可以从头开始覆盖最开始的文档进行循环写入。
- 副本集就是利用这种类型的集合作为oplog,记录primary节点上的写操作,并且同步到从节点重放,以实现主副节点数据复制的功能。
1.2.文档特点
- 文档中的键/值对是有序的,不同序则是不同文档。并且键是区分大小写的,否则也为不同文档。
- 文档的键是字符串,而值除了字符串,还可以是int, long, double,boolean,子文档,数组等多种类型。
- 文档中不能有重复的键。
- 每个文档都有一个默认的_id键,它相当于关系型数据库中的主键,这个键的值在同一个集合中必须是唯一的,_id键值默认是ObjectId类型,在插入文档的时候,如果用户不设置文档的_id值得话,MongoDB会自动生成生成一个唯一的ObjectId值进行填充。
二、WiredTiger存储引擎
2.1数据结构
存储引擎要做的事情无外乎是将磁盘上的数据读到内存并返回给应用,或者将应用修改的数据由内存写到磁盘上。如何设计一种高效的数据结构和算法是所有存储引擎要考虑的根本问题,目前大多数流行的存储引擎是基于B-Tree或LSM(Log Structured Merge) Tree这两种数据结构来设计的。
MongoDB来说,采用了插件式存储引擎架构,底层的WiredTiger存储引擎还可以支持B-Tree和LSM两种结构组织数据,但MongoDB在使用WiredTiger作为存储引擎时,目前默认配置是使用了B-Tree结构。
2.2事务机制
WT在实现事务的时使用主要是使用了三个技术:snapshot(事务快照)、MVCC (多版本并发控制)和redo log(重做日志)。
三、其他
3.1索引
MongoDB的索引机制是一种基于B-tree的索引实现,类似于MySQL的B-tree索引。MongoDB支持单字段、多字段、复合、文本、地理位置等多种类型的索引。创建过多的索引会占用大量的存储空间,影响性能,因此需要根据实际需求进行选择。索引会增加写入操作的开销,因为每次写入操作都需要更新索引。如果写入操作频繁,可以考虑使用稀疏索引或者禁用索引。
3.2分布式架构
MongoDB是一种分布式文档型数据库,具有天生的分布式架构设计。MongoDB的分布式架构包含多个组件,包括分片、副本集和分布式查询路由。
- 分片:MongoDB的分片技术将数据分割成多个分片(shard),每个分片存储部分数据,多个分片组成一个分片集群。在分片集群中,有一个特定的MongoDB节点充当分片协调器(mongos),负责接收客户端的请求,将请求路由到对应的分片节点上,并将结果返回给客户端。
- 副本集:为了提高数据的可靠性和可用性,MongoDB采用副本集(replica set)技术。副本集包括一个主节点和多个从节点,主节点负责处理写请求和同步数据到从节点,从节点负责处理读请求和备份数据。
- 分布式查询路由:MongoDB的分布式查询路由机制将查询请求路由到合适的分片节点上。当客户端向mongos发送查询请求时,mongos会将请求转发给对应的分片节点,如果请求涉及多个分片,mongos会自动将结果聚合返回给客户端。为了提高查询性能,MongoDB支持在每个分片上执行部分查询,然后将结果返回给mongos,在mongos上再进行聚合。
四、适用场景
- 灵活的数据结构可以轻松适应多样化的内容格式,如文章、评论、用户信息等。
- 支持存储和管理商品信息、用户订单、购物车等业务数据,适应频繁的字段变化。
- MongoDB:适合内容管理系统、实时分析、物联网、社交媒体、缓存层(数据模型灵活,大规模数据处理)
- 海量数据场景:MongoDB能够轻松扩展以存储和处理物联网设备生成的大量数据,确保数据的高可用性和持久性。