Code前端首页关于Code前端联系我们

民工哥MongoDB教程:知识体系及基本概念

terry 2年前 (2023-09-26) 阅读数 85 #数据库

民工哥 MongoDB 教程:知识体系与基础概念

MongoDB知识体系介绍

民工哥 MongoDB 教程:知识体系与基础概念

MongoDB生态介绍

民工哥 MongoDB 教程:知识体系与基础概念

NoSQL是什么?

NoSQL是一种非关系型DMS,不需要固定的架构,可以避免连接,并且易于扩展。 NoSQL数据库用于分布式数据存储,数据存储需求巨大。 NoSQL 用于大数据和实时 Web 应用程序。例如,Twitter、Facebook 和 Google 等大公司每天可以生成数 TB 的用户数据。

NoSQL 数据库代表“Not just SQL”或“Not SQL”。尽管 NoRELNoSQL 是一个更好的术语。 Carl Strozz 在 1998 年提出了 NoSQL 概念。

传统的 RDBMS 使用 SQL 语法来存储和查询数据。相比之下,NoSQL 数据库系统包括多种数据库技术,可以存储结构化、半结构化、非结构化和多态数据。 民工哥 MongoDB 教程:知识体系与基础概念

为什么使用NoSQL?

NoSQL数据库的概念在处理大量数据的互联网巨头(如Google、Facebook、Amazon等)中开始流行。当您使用RDBMS处理海量数据时,系统的响应时间会减少。

要解决这个问题,当然可以通过升级现有硬件来“横向扩展”我们的系统。但成本很高。

此问题的替代方法是随着负载的增加将数据库负载分散到多个主机上。这种方法称为“横向扩展”。 民工哥 MongoDB 教程:知识体系与基础概念NoSQL 数据库是非关系数据库,因此在设计时考虑了 Web 应用程序,并且比关系数据库具有更好的扩展性。

NoSQL 数据库简史

  • 1998 - Carlo Strozzi 在他的轻量级开源关系数据库中使用 NoSQL 一词
  • 2000 - 图形数据库 Google Neo4‷ 推出 2❙❙ 4 Google 推出
  • 2005 –启动 COUCHDB
  • 2007 - Amazon Dynamo 的研究论文
  • 2008 - Facebook 开源 Cassandra 项目
  • 2009 无N 没有关系模型从不遵循固定的关系模型❝表
  • 使用独立的聚合或 BLOB
  • 无需对象关系映射和数据规范化
  • 没有复杂的功能,例如查询语言、查询规划器、
  • 引用完整性连接、ACID yna NoSQL 数据库是无模式或宽松模式数据库
  • 无需对数据形式进行任何形式的修改 定义
  • 在同一域中提供异构数据结构
民工哥 MongoDB 教程:知识体系与基础概念
简单的 API 提供用户友好的界面,用于存储和查询所提供的数据
  • API 允许数据操作和低级选择方法
  • 基于文本的协议,通常与带有 JSON 的 HTTP REST 一起使用
  • 大多数人不使用基于标准的查询 支持 Web 的数据库作为面向 Internet 的服务运行
  • 分布式
    • 可以分布式运行多个NoSQL数据库
    • 提供自动故障转移概念能力和增强的sa ID,以实现可扩展性和吞吐量
    • 分布式节点之间很少有同步复制,大多是异步多主复制、点对点 HDFS 复制
    • 仅提供最终一致性
    • 无共享架构。这减少了协调并改善了分配。
    民工哥 MongoDB 教程:知识体系与基础概念

    MongoDB基本概念

    什么是MongoDB

    MongoDB是一个面向文档的NoSQL数据库,用于大量数据存储。 MongoDB 是 2000 年代中期出现的数据库。属于NoSQL数据库类别。

    MongoDB 功能

    每个数据库都包含集合,而集合又包含文档。每个文档可以有不同数量的字段。每个文档的大小和内容可能有所不同。文档结构与开发人员使用各自的编程语言构建其类和对象的方式更加一致。开发人员经常会说他们的类不是行和列,而是清晰的键值对结构。从 NoSQL 数据库的介绍中可以看出,行(或在 MongoDB 中称为文档)不需要预先定义模式。相反,可以动态创建字段。 MongoDB 中可用的数据模型使我们能够更轻松地表示层次关系、存储数组和其他更复杂的结构。可扩展性——MongoDB 环境具有高度可扩展性。世界各地的公司都定义了自己的集群,其中一些运行着 100 多个节点,数据库包含大约数百万个文档。 |在文件中。这使得MongoDB非常灵活,能够适应实际的业务环境和需求。

  • 即席查询 - MongoDB 支持按字段、范围查询和正则表达式进行搜索。查询可以返回文档中的特定字段。
  • 索引 - 可以创建索引来提高 MongoDB 中的搜索性能。 MongoDB 文档中的任何字段都可以建立索引。
  • 复制 - MongoDB 可以提供副本集的高可用性。副本集由两个或多个 mongo 数据库实例组成。每个副本集成员可以随时充当主副本或辅助副本。主副本是与客户端交互并执行所有读/写操作的主服务器。辅助副本使用内置复制维护主数据的副本。当主副本出现故障时,副本集自动切换到辅助副本,辅助副本成为主服务器。
  • 负载平衡 - MongoDB 使用分片的概念通过在多个 MongoDB 实例之间共享数据来水平扩展。 MongoDB 可以运行在多台服务器上,以平衡负载或复制数据,以在发生硬件故障时保持系统运行。
  • MongoDB 常用术语

    以下是 MongoDB 中使用的一些常用术语

    • _id – 这是所有 MongoDB 文档中的必填字段。 _id 字段表示 MongoDB 文档中的唯一值。 _id 字段类似于文档的主键。如果创建的新文档没有 _id 字段,MongoDB 将自动创建它。
    • 集合 – 这是 MongoDB 文档的分组。集合相当于在任何其他 RDMS(例如 Oracle 或 MS SQL)中创建的表。集合存在于单个数据库中。正如您从简介中看到的,集合不强制任何结构。
    • 光标 – 这是指向搜索结果集的指针。客户可以越过标记来检索结果。
    • 数据库 – 这是一个类似于 RDMS 中的集合容器,有一个包含表的容器。每个数据库在文件系统上都有自己的文件集。 MongoDB服务器可以存储多个数据库。
    • 文档 – MongoDB 集合中的记录基本上称为文档。该文档包含字段名称和值。
    • 字段 - 文档中的名称/值对。文档有零个或多个字段。字段类似于关系数据库中的列。

    下图显示了带有键值对的字段示例。在以下示例中,CustomerID 和 11 是文档中定义的键值对之一。与 MongoDB 和 RDBMS 的区别

    下表将帮助您更轻松地理解 Mongo 中的一些概念: 民工哥 MongoDB 教程:知识体系与基础概念

    MongoDB 架构

    MongoDB 包组件结构

    主要是 MongoDB 数据库服务和一些工具。 民工哥 MongoDB 教程:知识体系与基础概念

    MongoDB 数据库工具

    • 二进制导入和导出
      • mongodump
      • mongorestore
      • bsondump
    • mon数据导入和导出 mongoex 端口
  • 诊断工具
    • mongostat
    • mongotop-

    包组件的详细使用方法可以参见MongoDB包组件官方网站。 民工哥 MongoDB 教程:知识体系与基础概念

    最重要的程序当然是mongod(数据库服务)。 Mongod 通过不同的配置,可以在不同的部署场景(单机部署、副本集部署、分片集群部署)中扮演多种不同的角色:

    • 在单机部署中充当数据库服务器(提供所有读写功能)
    • 在副本集部署中,通过配置,可以部署为主节点(主服务器,负责写入数据,也可以发出查询),以及辅助节点(从服务器,从主节点复制数据)并且还可以发出查询)、仲裁节点(仲裁节点,不存储数据,主要用于参与选举投票)
    • 在一个分片集群中,每个分片除了扮演上述角色之外,它还扮演配置服务器的角色(存储分片集群的所有元数据信息,mongos的数据路由和分发都依赖它)

    一台服务器上,多个mongod服务。但在实际生产部署中,通常建议在一台服务器上部署一个mongod实例。这不仅减少了资源争用,还可以防止服务器故障同时影响多个服务。

    MongoDB 数据逻辑结构

    MongoDB 数据逻辑结构分为数据库、集合和文档三层:

    • 一个 mongod 实例中可以创建多个数据库。
    • 一个数据库中允许创建多个集合(一个集合对应关系数据库中的一张表)。
    • 集合由若干个文档组成(一个文档对应关系数据库中的一行,是MongoDB中的基本数据单元)。 民工哥 MongoDB 教程:知识体系与基础概念
    数据库

    可以在一个数据库中创建多个集合。原则上,我们通常会将具有相似逻辑的集合放在一个数据库中。当然,由于性能或数据量的原因,它们也可以共享。

    MongoDB 内置了几个数据库:

    • admin admin 数据库主要存储数据库办公相关信息。
    • local 本地数据库永远不会复制到从节点。它可用于存储仅限于单个本地服务器的任何副本集集合的配置信息。 oplog存储在本地数据库中。
      • 不要将重要数据存储在本地数据库中,因为没有冗余副本。如果该节点出现故障,本地数据库中存储的数据将无法正常使用。
    • config 配置数据库用于分片集群环境,存储分片相关的元数据信息。
    • test是MongoDB默认创建的测试库。连接mongod服务时,如果不指定连接的具体数据库,则默认连接测试库。 民工哥 MongoDB 教程:知识体系与基础概念
    集合

    集合由多个文档记录组成。

    • 前面介绍MongoDB时提到过,集合是无模式的(schemaless或动态模式),这意味着在读写数据之前无需创建模式就可以使用集合,并且集合中的文档也可以被拥有。可以随时在文档中添加或删除不同的字段。
    • 在集合上可以对文档进行添加、删除、更改、查看、聚合等操作。
    • 您还可以在集合上的文档中的字段上创建索引。
    • 除了一般集合之外,您还可以创建一种称为截断集合的集合类型。此类集合与一般集合的主要区别在于它可以限制集合的容量。当数据满了,此时就可以从头开始覆盖原来的文档,循环写入。
    • 副本集使用该类型的set作为oplog记录主节点上的写操作并同步到从节点进行回放,实现主备节点的数据复制功能。
    文档

    文档是MongoDB中数据的基本存储单元,用一种称为BSON文档的结构来表示。 BSON,二进制JSON,多个键和关联值以有序的方式存储,类似于map、hash或字典。

    • 文档中的键/值对是有序的,不同的顺序是不同的文档。并且按键区分大小写,否则就是不同的文档。
    • 文档的key是字符串,value除了字符串之外,还可以是int、long、double、boolean、subdocument、array等类型。
    • 文档中不能有重复的键。
    • 每个文档都有一个标准的_id键,它对应于关系数据库中的主键。该键的值在同一集合中必须是唯一的。 **_id 键值默认为 ObjectId 类型** ,在插入文档时,如果用户没有指定文档的 _id 值,MongoDB 会自动生成一个唯一的 ObjectId 值用于填充。

    MongoDB 数据库文件

    注意

    MongoDB 数据库文件与 MongoDB 存储引擎直接相关。 MongoDB总共提供了三种存储引擎:WiredTiger、MMAPV1和In Memory; MongoDB3.2之前,使用MMAPV1;后续版本v3.2默认使用WiredTiger; MMAPV1 引擎在 v4.2 中被删除。

    在后续的文章中,也会详细讲解MongoDB存储引擎。

    MongoDB - MMAPv1引擎下的数据库文件

    由于v3.0后续版本已经停产,这里不再详细介绍。

    • 日志日志文件
    • 命名空间表名文件
    • 数据数据和索引文件
    db
    |------journal
               |----_j.0
               |----_j.1
               |----lsn
    |------local
               |----local.ns
               |----local.0
               |----local.1
    |------mydb
               |----mydb.ns
               |----mydb.0
               |----mydb.1
    

    要了解有关 MongoDB MMAP 引擎(源代码级别)的更多信息,请参阅此 MongoDB Mmap 引擎分析(https://cloud.mongodb.org/)。 tencent.com/developer/article/1004385)民工哥 MongoDB 教程:知识体系与基础概念

    MongoDB - WiredTiger

    MongoDB v3.2已将WiredTiger设置为默认存储引擎集合数据的存储index-*.wt

    存储索引data 基本配置信息

  • mettiger所有其他集合的有线数据
  • WiredTiger.lock 存储进程 ID,以防止多个进程连接到同一个 Wiredtiger 数据库
  • WiredTiger.turtle商店WiredTiger.wt 的元数据信息
  • 民工哥 MongoDB 教程:知识体系与基础概念
    后续文章将详细讲解WiredTiger存储引擎。

    版权声明

    本文仅代表作者观点,不代表Code前端网立场。
    本文系作者Code前端网发表,如需转载,请注明页面地址。

    发表评论:

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

    热门