介绍
近年来,数据已成为技术的驱动力,因为现代应用程序和网站需要管理越来越多的数据,传统上,数据库管理系统根据关系模型(https://andsky.com/tech/tutorials/what-is-the-relational-model)组织数据。
这些新型数据库通常不依赖于关系数据库提供的传统表格结构,因此可以允许比关系数据库所强加的僵硬结构更大的灵活性。 此外,它们通常不使用 Structured Query Language(SQL),这是大多数关系数据库系统使用的,允许用户定义和与数据交互。
首次发布于2009年,MongoDB(https://www.mongodb.com/) - 也被称为 Mongo - 是一个以文档为导向的 NoSQL 数据库,用于许多现代Web应用程序。
关于 MongoDB 的简要概述
正如介绍中提到的,MongoDB 被认为是 NoSQL 数据库,因为它不依赖于关系模型. 每个数据库管理系统都是围绕特定类型的数据模型设计的,定义了数据库中的数据将如何组织。
另一方面,MongoDB 将其数据记录存储在称为 documents 的结构中,Mongo 允许您将多个文档组合成一个称为 collection 的结构,可以进一步组合成单独的 _databases。
一个文档是用BSON写的,是JSON的二进制表示(https://andsky.com/tech/tutorials/an-introduction-to-json)。像JSON中的对象一样,MongoDB文档开始和结束用弯曲的({
和 })),并包含一些字段和值对,通常以
字段:值`的形式。
安全
MongoDB 配备了许多功能,可以帮助防止数据丢失以及未经授权的用户访问。其中一些功能可以在其他数据库管理系统中找到。例如,Mongo 和许多现代 DBMS 一样,允许您通过网络加密数据,有时称之为过境中的 _data。
与其他 DBMS 一样,Mongo 管理 authorization - 对某个用户或用户组设置规则的做法,以定义他们可以执行哪些操作和他们可以访问哪些资源 - 通过一个名为 role-based access control 或 RBAC 的计算机安全概念。
角色定义了用户的特权,包括他们可以在某个数据库、集合、集合或集群中执行哪些操作。例如,您可以在任何数据库中分配给用户readWrite
角色,这意味着您可以阅读和修改系统上的任何数据库中的数据,只要您已经授予用户readWrite
角色。
自版本 4.2 发布以来,MongoDB 支持 client-side field level encryption. 这涉及在数据被写入数据库之前在文档中加密某些字段。
例如,假设您的数据库包含包含以下字段和值的文档:
1{
2 "name" : "Sammy",
3 "phone" : "555-555-1234",
4 "creditcard" : "1234567890123456"
5}
将此类敏感信息(即某人的电话号码和信用卡号码)存储在现实世界的应用程序中可能很危险,即使您已经对谁可以访问数据库设定了限制,任何拥有访问数据库权限的人都可以看到并利用用户的敏感信息。
1{
2 "name" : "Sammy",
3 "phone" : BinData6,"quas+eG4chuolau6ahq=i8ahqui0otaek7phe+Miexoo"),
4 "creditcard" : BinData6,"rau0Teez=iju4As9Eeyiu+h4coht=ukae8ahFah4aRo="),
5}
对于 MongoDB 的安全功能,以及保持 Mongo 数据库安全的一些一般策略,我们鼓励您查看我们的系列 MongoDB 安全:保持数据安全的最佳实践。
灵活性
MongoDB的另一个有助于推动其采用的特征是它与更传统的数据库管理系统相比提供的灵活性,这种灵活性植根于MongoDB的基于文档的设计,因为Mongo中的集合不强制执行每个文档必须遵循的特定结构。
每当您在关系数据库中创建表时,必须明确定义该表将包含的列和其数据类型的集合,因此,您添加的每个数据行都必须符合该特定结构,另一方面,相同集合中的 MongoDB 文档可能具有不同的字段,即使它们共享一个特定字段,也可能包含不同文件中的不同数据类型。
事实上,它使关系数据库非常有用来存储符合预定义结构的数据,但在需要存储 unstructured data 的情况下,它可能会成为限制性的 - 不结构化数据 - 无法轻松融入预定义数据模型或无法通过常规工具轻松搜索的数据。
非结构化数据的例子包括媒体内容,如视频或照片,通信数据或文本文件. 有时,非结构化数据被概括为定性数据. 换句话说,数据可能是人类可读的,但计算机很难充分分析。
Mongo的灵活性另一个例子是它如何提供与数据交互的多种途径,例如,您可以运行mongo
壳,这是一个基于JavaScript的界面,与MongoDB服务器一起安装,允许您从命令行与数据交互。
Mongo还支持一系列官方驱动程序(https://docs.mongodb.com/drivers/),可以帮助您将数据库连接到您的应用程序。Mongo为各种流行的编程语言提供这些库,包括PHP,Java,JavaScript和Python。
高可用性
任何基于计算机的数据库系统都依赖其底层硬件来运作并满足应用程序或客户端的需求. 如果它运行的机器因任何原因失败,则在机器备份和运行之前不会访问数据库中的数据。
许多数据库保持高度可用的一种方法是通过一个被称为 replication 的做法。 复制涉及在单独机器上运行的多个不同数据库之间同步数据,从而产生相同数据的多个副本,并在数据库服务器之一失败时提供冗余性。
在 MongoDB 中,一组通过复制维护相同数据的服务器被称为 replica set。
MongoDB 的复制集在其他数据库系统中的其他复制实现中具有的一个优点是 Mongo 的自动故障转移机制. 如果主要成员变得不可用,则在次要节点之间发生自动选举过程以选择新的主要节点。
扩展性
作为现代应用程序的核心组成部分,数据库能够响应所需工作量的变化是很重要的,毕竟,应用程序可能会看到其用户数量的突然上升,或者可能经历了特别繁重的工作负载的时期。
可扩展性是指计算机系统能够处理日益增加的工作量的能力,而增加这个能力的做法被称为扩展性。
- Vertical scaling - 也被称为 scaling up - 涉及将更多的计算资源添加到给定系统中,通常通过增加其存储容量或内存
- Horizontal scaling - 也被称为 scaling out - 涉及在多个计算节点上分割工作负载,这些节点一起构成一个单一的逻辑系统
要垂直扩展一个MongoDB数据库,可以将其数据备份并迁移(https://andsky.com/tech/tutorials/how-to-back-up-restore-and-migrate-a-mongodb-database-on-ubuntu-20-04)到另一个拥有更多计算资源的机器,这通常是垂直扩展任何数据库管理系统,包括关系数据库的相同程序,但这种扩展可能会有缺点。随着时间的推移,使用更大和更大的机器的成本可能会变得非常昂贵,无论它有多大,一个单一机器可以存储多少数据总有上限。
Sharding 是某些管理员用来扩展数据库的策略. 如果您想对 sharding 进行详细的解释,我们建议您阅读我们关于 [理解数据库共享] 的概念文章(https://andsky.com/tech/tutorials/understanding-database-sharding)。
数据库管理系统并不总是包含sharding功能作为内置功能,所以通常在应用级别实现sharding。MongoDB,然而,确实包含一个内置sharding功能,允许您在集合级别下shard数据。
要在 Mongo 中分割数据,您必须在给定集合的文档中选择一个或多个字段以作为 shard key 运作。
接下来,MongoDB会读取每个文档的shard密钥值,确定文档属于哪个部分,然后将文档分发到相应的shard。
Sharding的主要缺点是,它为数据库系统增加了一定程度的操作复杂性,但是,一旦你有一个工作 MongoDB shard 集群,将更多的 shards 添加到系统的水平扩展过程相当简单,并且可以添加一个正确配置的复制集作为一个 shard 用一个命令。
MongoDB 适合我的应用程序吗?
关系式数据库管理系统(https://db-engines.com/en/ranking)比使用NoSQL模型的数据库更广泛使用(https://db-engines.com/en/ranking_trend/system/MongoDB)。 然而,MongoDB(https://db-engines.com/en/ranking_trend/system/MongoDB)由于本指南中所描述的功能,在许多使用案例中已成为一个常见的数据库选择。
例如,其扩展能力和高可用性使其成为电子商务和游戏应用程序的流行的数据库,服务用户数量可以迅速和显著增加。同样,其灵活的方案和处理大量非结构化数据的能力使其成为需要管理从文本到视频、图像和音频文件的资产库不断发展的内容管理应用程序的绝佳选择。
当你决定在下一个应用程序中是否使用MongoDB时,你应该首先问自己应用程序的具体数据需求是什么。
然后,估计您的应用程序需要存储和使用多少数据。 MongoDB 的文档导向设计使其成为需要存储大量非结构化数据的应用程序的绝佳选择。
结论
通过阅读本文,您将更好地了解将MongoDB与其他数据库管理系统区分开来的功能,尽管MongoDB是一个强大、灵活和安全的数据库管理系统,在某些用例中可能是正确的数据库选择,但它可能并不总是最好的选择,尽管其基于文档和无计划的设计可能不会很快取代关系数据库模型,但Mongo的快速增长凸显了其作为一个值得理解的工具的价值。
有关 MongoDB 的更多信息,我们鼓励您查看 DigitalOcean 的完整 MongoDB 内容库。