个性化阅读
专注于IT技术分析

权威的NoSQL数据库指南

本文概述

毫无疑问, Web应用程序处理数据的方式在过去十年中发生了巨大变化。与以往相比, 正在收集更多的数据, 并且更多的用户正在同时访问此数据。这意味着对于基于架构的关系数据库而言, 可伸缩性和性能比以往任何时候都面临更大的挑战, 因此很难进行扩展。

NoSQL的演变

Web 2.0公司已经意识到SQL可伸缩性问题, 这些公司对数据和基础架构的需求不断增长, 例如Google, Amazon和Facebook。他们提出了自己的解决方案– BigTable, DynamoDB和Cassandra等技术。

这种日益增长的兴趣催生了许多NoSQL数据库管理系统(DBMS), 重点是性能, 可靠性和一致性。为了增强搜索和读取性能, 许多现有的索引结构被重用和改进。

首先, 由大公司开发的专有(封闭源)NoSQL数据库类型可以满足其特定需求, 例如被认为是第一个NoSQL系统的Google BigTable和亚马逊的DynamoDB。

这些专有系统的成功启动了许多类似的开源和专有数据库系统的开发, 其中最受欢迎的是Hypertable, Cassandra, MongoDB, DynamoDB, HBase和Redis。

是什么使NoSQL与众不同?

NoSQL数据库与传统关系数据库之间的一个主要区别是NoSQL是一种非结构化存储形式。

关系数据库与NoSQL数据库

这意味着NoSQL数据库不像关系数据库中那样具有固定的表结构。

NoSQL数据库的优缺点

优点

与传统的关系数据库相比, NoSQL数据库具有许多优势。

一个主要的根本区别是NoSQL数据库具有简单灵活的结构。它们是无模式的。

与关系数据库不同, NoSQL数据库基于键值对。

NoSQL数据库的某些存储类型包括列存储, 文档存储, 键值存储, 图形存储, 对象存储, XML存储和其他数据存储模式。

通常, 数据库中的每个值都有一个键。一些NoSQL数据库存储还允许开发人员将序列化的对象存储到数据库中, 而不仅仅是简单的字符串值。

开源NoSQL数据库不需要昂贵的许可费用, 并且可以在廉价的硬件上运行, 从而使其部署具有成本效益。

同样, 当使用NoSQL数据库时, 无论它们是开放源代码数据库还是私有数据库, 其扩展都比使用关系数据库时更容易, 更便宜。这是因为它是通过在所有节点上水平扩展和分配负载来完成的, 而不是关系数据库系统通常采用的垂直扩展类型, 后者是用功能更强大的主机代替了主主机。

缺点

当然, NoSQL数据库并不完美, 而且它们也不总是正确的选择。

一方面, 大多数NoSQL数据库不支持关系数据库系统本身支持的可靠性功能。这些可靠性特征可以概括为原子性, 一致性, 隔离性和耐用性。这也意味着不支持这些功能的NoSQL数据库会在性能和可伸缩性方面保持一致性。

为了支持可靠性和一致性功能, 开发人员必须实现自己的专有代码, 这会增加系统的复杂性。

这可能会限制可以依赖NoSQL数据库进行安全可靠交易的应用程序的数量, 例如银行系统。

大多数NoSQL数据库中发现的其他形式的复杂性包括与SQL查询的不兼容。这意味着需要手动或专有的查询语言, 从而增加了更多的时间和复杂性。

NoSQL与关系数据库

下表简要介绍了NoSQL和关系数据库之间的功能比较:

特征 NoSQL数据库 关系数据库
性能
可靠性 较差的
可用性
一致性 较差的
数据存储 针对海量数据进行了优化 中型到大型
可扩展性 High (but more expensive)

应该注意的是, 该表显示的是数据库级别的比较, 而不是实现这两种模型的各种数据库管理系统。这些系统提供了自己的专有技术, 可以克服两个系统中的某些问题和不足, 并且在某些情况下, 可以显着提高性能和可靠性。

NoSQL数据存储类型

关键价值商店

在键值存储类型中, 使用哈希表, 其中唯一的键指向一个项目。

密钥可以组织成逻辑的密钥组, 仅要求密钥在其自己的组中是唯一的。这允许在不同逻辑组中使用相同的密钥。下表显示了一个键值存储的示例, 其中键是城市的名称, 值是该城市的阿尔斯特大学的地址。

“贝尔法斯特” {“阿尔斯特大学, 贝尔法斯特校园, 约克街, 贝尔法斯特, BT15 1ED”}
“苦瓜碱” {“阿尔斯特大学, 科尔雷恩校区, 克罗莫尔路, 伦敦德里公司, BT52 1SA”}

密钥值存储的某些实现提供了缓存机制, 可以大大提高其性能。

处理存储在数据库中的项目所需的全部就是关键。数据以字符串, JSON或BLOB(二进制大对象)的形式存储。

这种数据库形式的最大缺陷之一是在数据库级别缺乏一致性。开发人员可以使用自己的代码添加它, 但是如前所述, 这会增加工作量, 复杂性和时间。

建立在键值存储上的最著名的NoSQL数据库是Amazon的DynamoDB。

文件存储

文档存储库与键值存储库类似, 因为它们无模式且基于键值模型。因此, 两者都有许多相同的优点和缺点。两者都缺乏数据库级别的一致性, 这使得应用程序可以提供更多的可靠性和一致性功能。

但是, 两者之间存在关键差异。

在”文档存储”中, 值(文档)为存储的数据提供编码。这些编码可以是XML, JSON或BSON(二进制编码的JSON)。

另外, 可以完成基于数据的查询。

依赖于文档存储的最流行的数据库应用程序是MongoDB。

列存储

在列存储数据库中, 数据存储在列中, 而不是像大多数关系数据库管理系统中那样存储在行中。

列存储由一个或多个列族组成, 这些列族对数据库中的某些列进行逻辑分组。密钥用于标识和指向数据库中的许多列, 其密钥空间属性定义了此密钥的范围。每列包含名称和值的元组, 有序和逗号分隔。

列存储对存储的数据具有快速的读/写访问权限。在列存储中, 与单个列对应的行被存储为单个磁盘条目。这样可以在读/写操作期间更快地访问。

使用列存储的最受欢迎的数据库包括Google的BigTable, HBase和Cassandra。

图库

在基于图的NoSQL数据库中, 有向图结构用于表示数据。该图由边和节点组成。

形式上, 图是一组对象的表示, 其中一些对象对通过链接连接。互连的对象由称为顶点的数学抽象表示, 而将某些顶点对连接起来的链接称为边。一组顶点和连接它们的边称为图形。

一切

这说明了使用边缘和节点表示和存储数据的图基数据库的结构。这些节点通过彼此之间的某种关系来组织, 这由节点之间的边缘表示。节点和关系都具有一些已定义的属性。

图形数据库最通常用于社交网络应用程序。图形数据库使开发人员可以将更多的精力放在对象之间的关系上, 而不是对象本身上。在这种情况下, 它们确实允许一个可扩展且易于使用的环境。

当前, InfoGrid和InfiniteGraph是最受欢迎的图形数据库。

NoSQL数据库管理系统

为了对数据库进行简要比较, 下表提供了不同NoSQL数据库管理系统之间的简要比较。

存储类型 查询方式 接口 程式语言 开源的 复写
卡桑德拉 列存储 节俭API 节约 Java 异步
MongoDB 文件存储 Mongo查询 TCP / IP C ++ 异步
超级表 列存储 高品质 节约 Java 异步
CouchDB 文件存储 MapReduce 休息 Erlang 异步
大表 列存储 MapReduce TCP / IP C ++ No 异步
HBase的 列存储 MapReduce 休息 Java 异步

MongoDB具有灵活的架构存储, 这意味着存储的对象不一定必须具有相同的结构或字段。 MongoDB还具有一些优化功能, 这些功能可以在各个数据分布之间分布, 从而提高了整体性能, 并使系统更加平衡。

其他NoSQL数据库系统(例如Apache CouchDB)也是文档存储类型数据库, 并且与MongoDB共享许多功能, 但可以使用RESTful API访问该数据库。

REST是一种架构样式, 由万维网上适用于组件, 连接器和数据元素的一组协调的架构约束组成。它依赖于无状态, 客户端-服务器, 可缓存的通信协议(例如HTTP协议)。

RESTful应用程序使用HTTP请求来发布, 读取数据和删除数据。

对于列基础数据库, Hypertable是使用C ++编写的NoSQL数据库, 它基于Google的BigTable。

与MongoDB和CouchDB一样, Hypertable支持跨节点分布数据存储以最大程度地提高可伸缩性。

最广泛使用的NoSQL数据库之一是Facebook开发的Cassandra。

Cassandra是一个列存储数据库, 其中包含许多针对可靠性和容错性的功能。

接下来的小节将探讨Cassandra和MongoDB, 这是两种使用最广泛的NoSQL数据库管理系统, 而不是深入介绍每个NoSQL DBMS。

卡桑德拉

Cassandra是Facebook开发的数据库管理系统。

Cassandra背后的目标是创建一个没有单点故障并提供最大可用性的DBMS。

Cassandra主要是一个列存储数据库。一些研究称Cassandra为混合系统, 其灵感来自于列存储数据库Google的BigTable和键值数据库Amazon DynamoDB。

这是通过提供键值系统来实现的, 但是Cassandra中的键指向一组列族, 并且依赖于Google的BigTable分布式文件系统和Dynamo的可用性功能(分布式哈希表)。

Cassandra旨在存储分布在不同节点上的大量数据。 Cassandra是一种DBMS, 旨在处理分散在许多服务器上的大量数据, 同时提供高可用性的服务而不会出现单点故障, 这对于像Facebook这样的大型服务是必不可少的。

Cassandra的主要功能包括:

  • 没有单点故障。为了实现这一点, Cassandra必须在节点集群上运行, 而不是在一台机器上运行。这并不意味着每个群集上的数据都是相同的, 但是管理软件是相同的。当其中一个节点发生故障时, 该节点上的数据将不可访问。但是, 其他节点(和数据)仍然可以访问。
  • 分布式哈希是一种以提供或删除一个插槽不会显着改变键到插槽的映射的方式提供哈希表功能的方案。这样就可以根据服务器或节点的容量将负载分配到服务器或节点, 从而最大程度地减少停机时间。
  • 相对容易使用的客户端界面。 Cassandra使用Apache Thrift作为其客户端接口。 Apache Thrift提供了跨语言的RPC客户端, 但是大多数开发人员更喜欢在Apple Thrift之上构建的开源替代方案, 例如Hector。
  • 其他可用性功能。 Cassandra的功能之一是数据复制。基本上, 它会将数据镜像到群集中的其他节点。复制可以是随机的, 也可以是特定的, 例如通过将复制放置在不同数据中心的节点中以最大化数据保护。 Cassandra中的另一个功能是分区策略。分区策略决定将密钥放置在哪个节点上。这也可以是随机的或有序的。当同时使用两种分区策略时, Cassandra可以在负载平衡和查询性能优化之间取得平衡。
  • 一致性。复制等功能使一致性具有挑战性。这是由于以下事实:所有节点必须在任何时间点都具有最新值, 或者在触发读取操作时必须是最新的。但是, 最终, Cassandra试图通过向开发人员提供这种可定制性来在复制操作和读/写操作之间保持平衡。
  • 读/写动作。客户端将请求发送到单个Cassandra节点。节点根据复制策略将数据存储到群集。每个节点首先在提交日志中执行数据更改, 然后使用更改来更新表结构, 二者都是同步完成的。读取操作也非常相似, 读取请求被发送到单个节点, 并且该单个节点是根据分区/放置策略确定哪个节点保存数据的节点。

MongoDB

MongoDB是用C ++编写的无模式, 面向文档的数据库。该数据库基于文档存储, 这意味着它以编码数据的形式存储值(称为文档)。

MongoDB中编码格式的选择是JSON。这很强大, 因为即使数据嵌套在JSON文档中, 它仍然是可查询和可索引的。

接下来的小节描述了MongoDB中可用的一些关键功能。

碎片

分片是跨多台计算机(节点)的数据分区和分布。分片是MongoDB节点的集合, 与Cassandra的节点对称分布相反。使用分片还意味着可以在多个节点上水平扩展。如果有一个应用程序使用单个数据库服务器, 则可以将其转换为分片群集, 而无需更改原始应用程序代码, 因为分片的方式由MongoDB完成。 oftware几乎完全与公开给客户端的公共API分离。

Mongo查询语言

如前所述, MongoDB使用RESTful API。要从db集合中检索某些文档, 将创建一个查询文档, 其中包含所需文档应匹配的字段。

动作

在MongoDB中, 有一组称为路由器的服务器。每个服务器都充当一个或多个客户端的服务器。同样, 集群包含一组称为配置服务器的服务器。每个数据库都有一份元数据的副本, 指示哪个分片包含哪些数据。读取或写入操作从客户端发送到群集中的一台路由器服务器, 并在配置服务器的帮助下由该服务器自动路由到包含数据的适当分片。

与Cassandra相似, MongoDB中的分片具有数据复制方案, 该方案将为每个分片创建一个副本集, 以保存完全相同的数据。 MongoDB中有两种复制方案:主从复制和副本集复制。副本集可提供更高的自动化程度和更好的故障处理能力, 而Master-Slave有时需要管理员干预。不管复制方案如何, 在副本集中的任何时间点, 只有一个分片充当主分片, 所有其他副本分片都是次要分片。所有写和读操作都进入主分片, 然后均匀地(如果需要)分配给集合中的其他次分片。

在下图中, 我们看到了上面解释的MongoDB架构, 以绿色显示了路由器服务器, 以黄色显示了配置服务器, 以及包含蓝色MongoDB节点的分片。

一切

应该注意的是, MongoDB中的分片(或在分片之间共享数据)是完全自动的, 这降低了故障率并使MongoDB成为高度可扩展的数据库管理系统。

NoSQL数据库的索引结构

索引编制是将密钥与DBMS中相应数据记录的位置相关联的过程。 NoSQL数据库中使用了许多索引数据结构。以下各节将简要讨论一些更常见的方法;即B树索引, T树索引和O2树索引。

B树索引

B树是DBMS中最常见的索引结构之一。

在B树中, 内部节点可以在某个预定义范围内具有可变数量的子节点。

与其他树结构(例如AVL)的主要区别在于B-Tree允许节点具有可变数量的子节点, 这意味着较少的树平衡, 但浪费了更多空间。

B +树是B树最流行的变体之一。 B +树是对B树的改进, 后者要求所有键都驻留在叶子中。

T树索引

通过结合AVL树和B树的功能来设计T树的数据结构。

AVL树是一种自平衡二进制搜索树, 而B树是不平衡的, 并且每个节点可以具有不同数量的子代。

在T树中, 其结构与AVL树和B树非常相似。

每个节点存储一个以上的{键值, 指针}元组。同样, 二进制搜索与多元组节点结合使用以产生更好的存储和性能。

T-Tree具有三种类型的节点:具有左右子节点的T节点, 不具有子节点的叶节点以及仅具有一个子节点的半叶节点。

可以相信, T树比AVL树具有更好的整体性能。

O2-树索引

O2-Tree基本上是对Red-Black树(Binary-Search树)的一种改进, 在Red-Black树中, 叶节点包含{键值, 指针}元组。

提出了O2-Tree来增强当前索引方法的性能。数量级为m(m≥2)的O2-树, 其中m是树的最小度, 它满足以下属性:

  • 每个节点都是红色或黑色。根是黑色的。
  • 每个叶节点都被涂成黑色, 并由一个块或页组成, 其中包含”键值, 记录指针”对。
  • 如果节点为红色, 则其两个子节点均为黑色。
  • 对于每个内部节点, 从该节点到子孙叶节点的所有简单路径都包含相同数量的黑色节点。每个内部节点都拥有一个键值。
  • 叶节点是在” m / 2″和m个”键值, 记录指针”对之间的块。
  • 如果树只有一个节点, 则它必须是叶, 它是树的根, 并且可以有1到m个关键数据项。
  • 叶节点在向前和向后方向上是双向链接的。

在这里, 我们看到了O2-Tree, T-Tree, B + -Tree, AVL-Tree和Red-Black Tree之间的直接性能比较:

一切

使用的T树, B +树和O2树的顺序为m = 512。

记录搜索, 插入和删除操作的时间, 对于50M条记录的索引, 更新率在0%-100%之间变化, 这些操作导致向索引中添加另外50M条记录。

显然, 更新率为0-10%时, B树和T树的性能要优于O2树。但是, 随着更新率的增加, O2-Tree索引的性能明显好于大多数其他数据结构, 其中B-Tree和Red-Black Tree结构的影响最大。

NoSQL的理由?

快速浏览NoSQL数据库, 突出显示传统关系数据库不足的关键领域, 这是第一个收获:

尽管关系数据库提供了一致性, 但它们并没有针对频繁存储和处理大量数据的应用程序的高性能进行优化。

NoSQL数据库由于其高性能, 高可伸缩性和易于访问而广受欢迎。但是, 它们仍然缺少提供一致性和可靠性的功能。

幸运的是, 许多NoSQL DBMS通过提供增强可伸缩性和可靠性的新功能来应对这些挑战。

并非所有NoSQL数据库系统的性能都比关系数据库好。

在写和删除操作中, MongoDB和Cassandra的性能比关系数据库好, 并且在大多数情况下要好于关系数据库。

存储类型与NoSQL DBMS的性能之间没有直接关联。 NoSQL实现会发生变化, 因此性能可能会有所不同。

因此, 应始终使用最新版本的数据库软件来更新不同研究中跨数据库类型的性能度量, 以确保这些数字的准确性。

尽管我无法对性能做出明确的判断, 但请记住以下几点:

  • 传统的B树和T树索引在传统数据库中很常用。
  • 一项研究通过结合多个索引结构的特征来提出O2-Tree, 从而提供了改进和增强。
  • 在大多数测试中, O2-Tree的性能优于其他结构, 尤其是在庞大的数据集和高更新率的情况下。
  • B-Tree结构提供了本文涵盖的所有索引结构中最差的性能。

可以而且应该做进一步的工作来增强NoSQL DBMS的一致性。 NoSQL和关系数据库这两个系统的集成是一个需要进一步研究的领域。

最后, 需要注意的是NoSQL是对现有数据库标准的很好补充, 但有一些重要的警告。 NoSQL交换可靠性和一致性功能来获得纯粹的性能和可伸缩性。由于可以依赖NoSQL数据库的应用程序数量仍然有限, 因此这使其成为一种专用解决方案。

有上行空间吗?专业化可能无法提供很多灵活性, 但是当你想要尽快高效地完成专业化工作时, 就不需要瑞士军刀了。你需要NoSQL。

相关:商业智能平台:使用MongoDB聚合管道的教程

赞(0)
未经允许不得转载:srcmini » 权威的NoSQL数据库指南

评论 抢沙发

评论前必须登录!