monggoDB学习笔记

1、mongo是什么

关键词:分布式、可扩展、介于关系与非关系数据库之间、文档存储、JSON格式存储(可对字段建索引,实现关系数据库的某些功能)、默认监听端口27017

MongoDB是一个基于分布式文件存储的开源数据库系统。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。严格来说属于NoSQL.

MongoDB是一个介于关系数据库和非关系数据库(nosql)之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象,叫BSON(即二进制形式的键值对)。字段值可以包含其他文档,数组及文档数组

基本概念:文档、集合、数据库

SQL术语/概念 MongoDB术语/概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins   表连接,MongoDB不支持
primary key primary key 主键,MongoDB自动将_id字段设置为主键

文档是一个键值(key-value)对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。----->即集合无固定模式

如:{"site":"www.runoob.com", "name":"菜鸟教程"}

需要注意的是:

  1. 文档中的键/值对是有序的。
  2. 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
  3. MongoDB区分类型和大小写。
  4. MongoDB的文档不能有重复的键。
  5. 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。

集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。

集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。如,比如,我们可以将以下不同数据结构的文档插入到集合中:

  1. {"site":"www.baidu.com"} {"site":"www.google.com","name":"Google"} {"site":"www.runoob.com","name":"菜鸟教程","num":5}

当第一个文档插入时,集合就会被创建。

2、mongo能做什么

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

整体架构:

3、mongo特性

  • MongoDB的提供了一个面向文档存储,操作起来比较简单和容易。
  • 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。
  • 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
  • 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
  • Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
  • MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
  • Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
  • Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
  • Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
  • GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
  • MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
  • MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
  • MongoDB把数据存储在文件中(默认路径为:/data/db),为提高效率使用内存映射文件进行管理。

  • MongoDB安装简单。

分片:(高吞吐量与处理大数据量)

分片是在多台机器之间存储数据记录的过程,MongoDB是满足数据增长需求的方法。 随着数据的大小增加,单个机器可能不足以存储所有数据,也不能提供可接受的读写吞吐量。 分片解决了水平缩放的问题。 使用分片,可以添加更多的机器来支持数据增长和读写操作的需求。

在上图中,有三个主要组件 -

  • 分片(Shards) - 分片用于存储数据。它们提供高可用性和数据一致性。 在生产环境中,每个分片是一个单独的副本集,该副本集保存了集群整体数据的一部分(若只使用单一服务器,则包含整体数据。一个副本集的各个副本一般分布在不同分区中(容错性,分片宕机时,启动其他副本),即有一个主导副本,接受该副本集中所有读写操作,其它从副本集从主副本复制数据,保持同步,每个副本集一般还包括一个仲裁者,只有投票权,不存储数据)。

  • 复制详细机制参考https://www.cnblogs.com/duanxz/p/10730096.html

  • 配置服务器(Config Servers) - 配置服务器存储集群的元数据(集群各种信息,如分片、分块情况)。 该数据包含集群的数据集与分片的映射。查询路由器使用此元数据将操作定位到特定的分片。 在生产环境中,分片集群正好有3个配置服务器(默认需要3个,保证高度一致性)。

  • 查询路由器(Query Routers) - 查询路由器基本上是 mongos实例,与客户端应用程序的接口和直接操作到适当的分片。 查询路由器处理并将操作定向到碎片,然后将结果返回给客户端。 分片集群可以包含多个查询路由器来分割客户端请求负载。 客户端向一个查询路由器发送请求。 一般来说,分片集群有许多查询路由器。

原文链接:https://www.yiibai.com/mongodb/mongodb_sharding.html#article-start
 

4、同类数据库比较

关系数据库:目前,它是结构化数据存储网络和商务应用的主导技术,遵循A(原子性)C(一致性)I(独立性)D(持久性)原则

分布式系统:多台计算机 、通信软件<------>计算机网络<---------> 多台计算机 、通信软件。分布式系统是建立在网络之上的软件系统,故具有高度的内聚性和透明性。网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件

分布式系统可以应用在在不同的平台上如:Pc、工作站、局域网和广域网上等。

NoSQL:指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。用于超大规模数据的存储,这些类别数据不需要固定模式,无需多余操作便可横向扩展(水平扩展)

为什么要用NoSQL?

数据爆炸性增长,如通过第三方平台(百度、谷歌等)爬取数据,用户的各种信息增长迅速。若要对这些数据进行挖掘,SQL数据库已经不适合这些应用了, NoSQL数据库的发展也却能很好的处理这些大的数据。

RDBMS vs NoSQL

RDBMS
- 高度组织化结构化数据
- 结构化查询语言(SQL) (SQL)
- 数据和关系都存储在单独的表中。
- 数据操纵语言,数据定义语言
- 严格的一致性
- 基础事务

NoSQL
- 代表着不仅仅是SQL
- 没有声明性查询语言
- 没有预定义的模式
-键 - 值对存储,列存储,文档存储,图形数据库
- 最终一致性,而非ACID属性
- 非结构化和不可预知的数据
- CAP定理
- 高性能,高可用性和可伸缩性

mongoDB解析  

mongoDB =  shards(分片,包含mongod,即分片存储数据) + mongos(路由处理,负责路由的选择和协调)+ config server(配置服务器,存储集群的信息,包括分片与块数据信息,供mongos查询) + client(客户端)

分片粒度:数据库粒度与集合粒度(主要,即将集合中的文档进行划分为块,存储在集群各个分片中)。

分片键:shard key,采用某一个字段或多个字段的组合,用以划分和定位文档所属分片以及

分块:分块,块是位于一个分片中的一段连续的分片键范围。单独的块可出现在任意分片上,并且块只是逻辑上的,并非物理上连续的文档。即一个文档分片键属于某个块时,只表明可在该块所在的分片上找到该分片键所指定的文档。与分片中的文档集合中的文档排列没有必然关系。

负载均衡:拆分+迁移。

阈值触发机制----->拆分(分块,一种逻辑上的操作,只操作块的元数据,不会影响文档的物理存储顺序)与迁移(需要物理操作,即文档以块为单位由一个分片迁移至另一分片)。

拆分(块分裂):即一旦分片的某一数据块上存储的文档数或总大小达到某一设定的阈值时,触发系统的分块机制,一般是对半拆分块,将一个块分成两个数量相同的块。

迁移(平衡):当所有分片中文档数最多分片与最少分片相差达到设定的阈值时(8),触发迁移机制,即从数据量多的分片迁移至数据量少的分片,以达到负载均衡的目的。

参考网址:https://blog.csdn.net/wanght89/article/details/77842336

                  https://www.cnblogs.com/duanxz/p/10730121.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章