介绍
近年来,数据已成为技术的驱动力,因为现代应用程序和网站需要管理不断增加的数据量。传统上,数据库管理系统基于关系模型组织数据。然而,随着组织的数据需求发生变化,已经开发了许多新类型的数据库。
这些新型数据库通常不依赖于关系数据库提供的传统表结构,因此比关系数据库强加的刚性结构具有更大的灵活性。此外,它们通常不使用结构化查询语言(SQL),大多数关系数据库系统都采用这种语言来允许用户定义数据并与数据交互。这导致许多这些新的非关系型数据库通常被称为NoSQL数据库。
MongoDB(也称为Mongo)于 2009 年首次发布,是一种面向文档的 NoSQL 数据库,用于许多现代 Web 应用程序。这篇概念性文章对将 MongoDB 与其他数据库管理系统区分开来并使其成为跨许多不同用例的宝贵工具的功能进行了高级概述。
MongoDB 简要概述
正如介绍中提到的,MongoDB 被认为是一个 NoSQL 数据库,因为它不依赖于关系模型。每个数据库管理系统都是围绕某种类型的数据模型设计的,该模型定义了数据库中数据的组织方式。关系模型涉及将数据存储在由行和列组成的表中——更正式地称为关系。
另一方面,MongoDB 将其数据记录存储在称为文档的结构中。Mongo 允许您将多个文档分组到一个称为集合的结构中,该结构可以进一步分组到单独的数据库中。
文档是用 BSON 编写的,BSON 是JSON的二进制表示。与 JSON 中的对象一样,MongoDB 文档以大括号 ({
和}
)开头和结尾,并包含许多通常采用. 字段的值可以是BSON 中使用的任何一种数据类型,甚至其他结构,如文档和数组。field: value
安全
MongoDB 安装了许多功能,可以帮助防止数据丢失以及未经授权的用户访问。其中一些功能可以在其他数据库管理系统上找到。例如,与许多现代 DBMS 一样,Mongo 允许您在数据通过网络时对其进行加密 — 有时称为传输中的数据。它通过要求使用传输层安全性(TLS)建立与数据库的连接来实现这一点,TLS 是一种加密协议,作为安全套接字层(SSL)的继承者。
与其他 DBMS 一样,Mongo也通过称为基于角色的访问控制的计算机安全概念来管理授权——为给定的用户或用户组设置规则以定义他们可以执行的操作以及他们可以访问的资源的做法,或者RBAC。每当您创建 MongoDB 用户时,您都可以选择为他们提供一个或多个角色。
角色定义了用户拥有哪些特权,包括他们可以对给定的数据库、集合、集合集或集群执行哪些操作。例如,您可以为用户分配readWrite
任何数据库上的角色,这意味着您可以读取和修改系统上任何数据库中保存的数据,只要您授予用户对其的readWrite
角色即可。MongoDB 的 RBAC 与其他数据库的 RBAC 的区别在于,除了其内置角色之外,Mongo 还允许您定义自定义角色,让您可以更好地控制用户可以访问系统上的资源。
自4.2版本发布以来,MongoDB 支持客户端字段级加密。这涉及在数据写入数据库之前加密文档中的某些字段。稍后尝试读取它的任何客户端或应用程序必须首先提供正确的加密密钥才能解密这些字段中的数据。
举例说明,假设您的数据库包含一个包含以下字段和值的文档:
{
"name" : "Sammy",
"phone" : "555-555-1234",
"creditcard" : "1234567890123456"
}
将这样的敏感信息(即一个人的电话号码和信用卡号码)存储在实际应用程序中可能很危险。即使您限制了谁可以访问数据库,任何有权访问数据库的人都可以查看并利用您用户的敏感信息。但是,如果配置正确,这些字段看起来就像是用客户端字段级加密编写的:
{
"name" : "Sammy",
"phone" : BinData6,"quas+eG4chuolau6ahq=i8ahqui0otaek7phe+Miexoo"),
"creditcard" : BinData6,"rau0Teez=iju4As9Eeyiu+h4coht=ukae8ahFah4aRo="),
}
为了更全面地了解 MongoDB 的安全特性,以及一些保持 Mongo 数据库安全的一般策略,我们鼓励您查看我们关于MongoDB 安全性:保持数据安全的最佳实践的系列。
灵活性
与更传统的数据库管理系统相比,MongoDB 的另一个推动其采用的特性是它提供的灵活性。这种灵活性源于 MongoDB 基于文档的设计,因为 Mongo 中的集合不强制执行其中的每个文档都必须遵循的特定结构。这与关系数据库中表所强加的刚性结构形成对比。
无论何时在关系数据库中创建表,都必须明确定义该表将包含的列集及其数据类型。之后,您添加的每一行数据都必须符合该特定结构。另一方面,同一个集合中的 MongoDB 文档可以有不同的字段,即使它们共享给定的字段,它也可以在不同的文档中保存不同的数据类型。
关系模型强加的这种僵化不一定是坏事。事实上,它使关系数据库对于存储完全符合预定义结构的数据非常有用。但在您需要存储非结构化数据的情况下,它可能会变得有限——这些数据不容易适应预定义的数据模型或不容易被传统工具搜索到。
非结构化数据的示例包括媒体内容(如视频或照片)、通信数据或文本文件。有时,非结构化数据被概括为定性数据。换句话说,可能是人类可读但计算机难以充分解析的数据。然而,MongoDB 面向文档的多功能设计使其成为存储和分析非结构化数据以及结构化和半结构化数据的绝佳选择。
Mongo 灵活性的另一个例子是它如何提供与数据交互的多种途径。例如,您可以运行mongo
shell,这是一个随 MongoDB 服务器一起安装的基于 JavaScript 的界面,它允许您从命令行与您的数据进行交互。
Mongo 还支持许多官方驱动程序,可以帮助您将数据库连接到您的应用程序。Mongo 为各种流行的编程语言提供了这些库,包括 PHP、Java、JavaScript 和 Python。这些驱动程序还支持在各自宿主语言中找到的数据类型,扩展了默认可用的 BSON 数据类型。
高可用性
任何基于计算机的数据库系统都依赖其底层硬件来运行和满足应用程序或客户端的需求。如果运行它的机器由于任何原因出现故障,则在机器恢复运行之前,将无法访问数据库中保存的数据。如果一个数据库管理系统能够在比正常时间更长的时间内保持运行,就可以说它是高度可用的。
许多数据库保持高可用性的一种方法是通过称为复制的实践。复制涉及在不同机器上运行的多个不同数据库之间同步数据。这会导致相同数据的多个副本,并在其中一个数据库服务器出现故障时提供冗余。这可确保同步数据始终可供依赖它的应用程序或客户端使用。
在 MongoDB 中,一组通过复制维护相同数据集的服务器称为副本集。属于给定副本集的每个正在运行的 MongoDB 实例都被称为它的成员之一。每个副本集必须有一个主要成员和至少一个次要成员。
MongoDB 的副本集相对于其他数据库系统中的其他复制实现的优势之一是 Mongo 的自动故障转移机制。如果主要成员变得不可用,则辅助节点之间会发生自动选举过程以选择新的主要成员。
可扩展性
作为现代应用程序的核心组件,数据库能够响应它必须执行的工作量的变化非常重要。毕竟,应用程序的用户数量可能会突然激增,或者可能会经历特别繁重的工作负载时期。
可扩展性是指计算机系统处理不断增长的工作量的能力,增加这种容量的做法称为扩展。有两种方法可以扩展计算机系统:
- 垂直扩展– 也称为扩展– 涉及向给定系统添加更多计算资源,通常通过增加其存储容量或内存
- 水平扩展– 也称为向外扩展– 涉及将工作负载拆分到多个计算节点,这些节点一起构成一个逻辑系统
要垂直扩展 MongoDB 数据库,可以备份其数据并将其迁移到另一台具有更多计算资源的机器。这通常与垂直扩展任何数据库管理系统(包括关系数据库)的过程相同。然而,像这样扩大规模可能有缺点。随着时间的推移,使用越来越大的机器的成本可能会变得非常昂贵,无论它有多大,单台机器可以存储的数据量总是有上限的。
分片是一些管理员用来扩展数据库的策略。如果您想详细了解分片,我们鼓励您阅读我们关于了解数据库分片的概念性文章。但是,就本文而言,请理解分片是根据一组给定的规则拆分数据集并将生成的数据片段分布到多个单独的数据库节点的过程。包含分片集群数据集一部分的单个节点称为shard。
数据库管理系统并不总是将分片功能作为内置功能包含在内,因此分片通常是在应用程序级别实现的。但是,MongoDB 确实包含一个内置的分片功能,允许您在集合级别对数据进行分片。从 version 3.6 开始,每个 MongoDB 分片都必须部署为副本集,以确保分片的数据保持高度可用。
要在 Mongo 中分片数据,您必须在给定集合的文档中选择一个或多个字段作为分片键。然后 MongoDB 获取分片键值的范围并将它们划分为不重叠的范围,称为chunks,并且每个块都分配给给定的分片。
之后,Mongo 读取每个文档的分片键值,确定文档属于哪个块,然后将文档分发到适当的分片。MongoDB 会主动监控每个分片中的块数量,并会尝试将块从一个分片迁移到另一个分片以确保每个分片的数量相等。
分片的主要缺点是它给数据库系统增加了一定程度的操作复杂性。但是,一旦您拥有一个工作的 MongoDB 分片集群,添加更多分片以水平扩展系统的过程就相当简单,并且可以使用单个命令将正确配置的副本集添加为分片。这使得 MongoDB 成为需要快速扩展的应用程序的有吸引力的选择。
MongoDB 适合我的应用程序吗?
关系数据库管理系统的用途仍然比采用 NoSQL 模型的数据库更广泛。尽管如此,由于本指南中描述的功能,MongoDB继续取得进展。特别是,它已成为许多用例的常见数据库选择。
例如,其扩展能力和高可用性使其成为电子商务和游戏应用程序的流行数据库,在这些应用程序中,所服务的用户数量可以快速而显着地增加。同样,其灵活的架构和处理大量非结构化数据的能力使其成为需要管理不断发展的资产目录(从文本到视频、图像和音频文件)的内容管理应用程序的理想选择。由于其强大的扩展能力和数据分析能力,它也被移动应用程序开发人员广泛采用。
在决定是否应该在下一个应用程序中使用 MongoDB 时,您应该首先问自己应用程序的特定数据需求是什么。如果您的应用程序将存储严格遵守预定义结构的数据,您可能无法从 Mongo 的无模式设计中获得太多额外价值,而使用关系数据库可能会更好。
然后,权衡您希望应用程序需要存储和使用的数据量。MongoDB 面向文档的设计使其成为需要存储大量非结构化数据的应用程序的绝佳选择。同样,MongoDB 的可扩展性和高可用性使其非常适合为大量且不断增长的客户提供服务的应用程序。但是,在数据不密集的情况下,这些功能可能会过多。
结论
通过阅读本文,您将更好地了解将 MongoDB 与其他数据库管理系统区分开来的特性。尽管 MongoDB 是一个强大、灵活且安全的数据库管理系统,在某些用例中可以成为数据库的正确选择,但它可能并不总是最佳选择。虽然其基于文档和无模式的设计可能不会很快取代关系数据库模型,但 Mongo 的快速增长凸显了其作为值得理解的工具的价值。
有关 MongoDB 的更多信息,我们鼓励您查看DigitalOcean 的整个 MongoDB 内容库。此外,官方 MongoDB 文档是有关使用 Mongo 的宝贵信息资源。