JavaRush /Java 博客 /Random-ZH /NoSQL 开发人员指南

NoSQL 开发人员指南

已在 Random-ZH 群组中发布
如果您一直在关注后端开发和大数据的趋势,您可能已经注意到近年来NoSQL数据库的热门话题。有些人受到这种数据库方法的启发,而另一些人则认为其中隐藏着某种技巧:其中的数据模型与通常的关系数据库不一样,应用程序编程接口不寻常,而且应用程序常常难以理解。 NoSQL 开发人员指南 - 1在这篇文章中,我将告诉您为什么首先创建它们,这些 NoSQL 数据库,它们解决了什么问题,以及为什么突然需要这么多不同的数据库。如果您是 NoSQL 新手,您可能会对本文的最后部分特别感兴趣,其中列出了我认为值得首先探索的 NoSQL 数据库类型,以全面了解该领域。

为什么我们突然需要一个新的数据库?

你可能会疑惑地问:关系数据库出了什么问题?关键是他们多年来工作得很好,但现在出现了一个他们无法处理的问题。据预测,到 2018 年,人类每秒将产生 50,000 GB 的数据。这是一个巨大的数据量!它的储存和处理提出了严峻的工程挑战。更糟糕的是,这个数量还在不断增长。事实证明,关系数据库不太适合处理大量数据。它们被设计为在单台机器上运行,如果您想处理更多请求,那么唯一的选择就是购买具有更多 RAM 和更强大处理器的计算机。不幸的是,一台机器可以处理的查询数量是有限的,对于跨多台机器的分布式工作,我们需要不同的数据库技术。当然,有些读者看到这里会笑,说在关系数据库的情况下,有两种广泛使用的多机使用方法:复制和分片。确实如此,但这些方法不足以应对我们的任务。 读复制是一种将每个数据库更新传播到只能处理读请求的其他计算机的技术。在这种情况下,所有更改都由一台称为主节点的服务器执行,而其他服务器(称为只读副本)仅维护数据的副本。用户可以从任何机器上读取数据,但只能通过主节点更改数据。这是一种方便且非常流行的方法,但它只能让您处理更多的读取请求,并不能以任何方式解决处理所需数据量的问题。
NoSQL 开发人员指南 - 2
图中:
Leader (read and write):领导节点(读写)
Read-replicas (read-only):读副本(只读)
分片是另一种流行的方法,它使用关系数据库的多个实例。它们中的每一个都处理一部分数据的写入和读取操作。如果数据库存储客户的信息,例如采用分片的方式,一台机器可以处理以A开头的客户的所有请求,另一台机器可以存储以B开头的客户的所有数据,以此类推。
NoSQL 开发人员指南 - 3
图中:
多master(读写部分数据):多个master节点(读写部分数据)
尽管分片允许您记录更多数据,但管理这样的数据库确实是一场噩梦:您必须跨机器对齐数据并根据需要在两个方向上扩展集群。虽然理论上看起来很简单,但要做好却相当具有挑战性。

关系数据库可以改进吗?

我认为您已经开始相信关系数据库并不是最适合现代世界生成的数据量。尽管如此,您可能仍然想知道为什么还没有人创建一个可以跨多台机器高效运行的“更好”的关系数据库。看起来这个技术根本还没有开发出来,分布式关系数据库很快就会出现。 唉,这不会发生。这在数学上是不可能的,而且对此无能为力。 要理解为什么会这样,您需要看看所谓的 CAP 定理(又名布鲁尔定理)。它于 1999 年被证明,它指出运行在多台机器上的分布式数据库可以具有以下三个属性: 一致性-任何读操作都返回最后一个相应写操作的结果。如果系统是一致的,写入新数据后,就不可能读取旧的、已经被覆盖的数据。 可用性Availability)——分布式系统可以随时为传入的请求提供服务并返回无错误的响应。 分区容错性——即使某些服务器暂时无法相互通信,数据库也会继续响应读写请求这种临时故障称为网络连接故障,可能由多种因素引起,从服务器速度慢导致的物理网络问题到网络设备的物理损坏。所有这些属性当然都很方便,我们真的希望有一个数据库将它们结合起来。任何理智的开发人员都不会愿意在没有得到任何回报的情况下放弃可访问性等功能。不幸的是,CAP 定理还指出,所有三个属性不可能同时成立。 认识到这一点可能并不容易,但这是可能的。首先,如果我们需要一个分布式数据库,它必须是“容断连接”的。这甚至没有讨论。断开连接时常发生,尽管如此,我们的数据库仍必须正常工作。现在我们来理解为什么我们不能同时实现一致性和可用性。想象一下,我们有一个简单的数据库运行在两台机器上:A 和 B。任何用户都可以向其中一台机器写入数据,然后将数据复制到另一台机器上。
NoSQL 开发人员指南 - 4
现在想象一下,这些机器暂时无法相互通信,并且机器 B 无法向机器 A 发送数据或从机器 A 接收数据。如果在这段时间内机器B收到客户端的读请求,它有两种选择:
  1. 取回本地数据,即使它不是最新的。在这种情况下,优先考虑可用性(至少返回一些数据,甚至是过时的数据)。
  2. 返回错误。在这种情况下,一致性是首选:客户端不会收到过时的数据,但也不会收到任何数据。
NoSQL 开发人员指南 - 5
图中:
网络分区:网络连接丢失
关系数据库力求同时体现“一致性”和“可用性”的属性,因此无法在分布式环境中运行。试图在分布式系统中实现关系数据库的所有功能要么不现实,要么根本不可行。另一方面,NoSQL 数据库主要强调可扩展性和性能。它们通常缺乏连接和事务等“基本”功能,并且数据模型完全不同,甚至可能在某种程度上受到限制。所有这些使得存储比以往更多的数据和处理更多的查询成为可能。

NoSQL数据库如何平衡一致性和可用性?

在您看来,如果您选择 NoSQL 数据库,您总是会收到一些过时的数据,或者在发生任何故障时收到错误。在实践中,可用性和一致性绝不是唯一可用的选择。有多种选项可供您选择。关系数据库没有这些选项,但 NoSQL 允许您以类似的方式控制查询执行。无论如何,它们允许您在 NoSQL 数据库中执行写入或读取操作时设置两个参数: W -执行写入操作时集群中必须有多少台机器确认保存数据。写入数据的机器数量越多,下次读取操作时读取最新数据就越容易,但所需时间也就越长。 R – 您想从多少台机器读取数据。在分布式系统中,将数据分发到集群中的所有机器可能需要一些时间,因此某些服务器将拥有最新的数据,而其他服务器将滞后。读取数据的机器越多,读取到当前数据的机会就越大。让我们看一个实际的例子。如果您的集群中有五台计算机,并且您决定仅向其中一台计算机写入数据,然后从一台随机选择的计算机中读取数据,则您有 80% 的机会会读取过时的数据。另一方面,这将使用最少的资源。因此,如果遗留数据适合您,那么这并不是一个糟糕的选择。在这种情况下,参数W和R等于1。
NoSQL 开发人员指南 - 6
另一方面,如果将数据写入 NoSQL 数据库中的所有五台机器,则可以从任何机器读取数据,并保证每次都能获取最新数据。在大量计算机上执行相同的操作将花费更长的时间,但如果最新数据对您很重要,那么您可以选择此选项。在这种情况下,W = R = 5。数据库一致性所需的最小读写次数是多少?这是一个简单的公式:R + W ≥ N + 1,其中 N 是集群中机器的数量。这意味着,对于五台服务器,您可以选择 R = 2 和 W = 4,或者 R = 3 和 W = 3,或者 R = 4 和 W = 2。在这种情况下,数据传输到哪台机器并不重要写入后,读取将始终从至少一台具有最新数据的机器上完成。
NoSQL 开发人员指南 - 7
其他数据库(例如 DynamoDB)具有不同的限制,并且仅允许一致写入。每条数据都存储在三台服务器上,当有任何数据写入时,都会写入三台机器中的两台。但在读取数据时,您可以选择以下两个选项之一:
  1. 严格一致的读取,其中数据从三台机器中的两台读取,并且始终返回最近写入的数据。
  2. 最终一致读取,其中随机选择一台机器来读取数据。但是,这可能会暂时返回过时的数据。

为什么有这么多 NoSQL 数据库?

如果您关注软件开发领域的最新新闻,您可能听说过许多不同的 NoSQL 数据库,例如 MongoDB、DynamoDB、Cassandra、Redis 等。您可能想知道:为什么我们需要这么多不同的 NoSQL 数据库?原因很简单:不同的 NoSQL 数据库旨在解决不同的问题。这就是竞争数据库数量如此之多的原因。NoSQL 数据库分为四大类:

面向文档的数据库

这些数据库提供了存储复杂嵌套文档的能力,而大多数关系数据库仅支持一维行。此功能在许多情况下都很有用,例如,当需要在系统中存储具有多个地址的用户信息时。当使用面向文档的数据库时,在这种情况下,您可以简单地存储包含地址数组的复杂对象,而在关系数据库中,您必须创建两个表:一个用于用户信息,另一个用于地址。面向文档的数据库弥补了对象模型和数据模型之间的差距。一些关系数据库,例如PostgreSQL,现在也支持面向文档的存储,但大多数关系数据库仍然缺乏这种能力。

键/值数据库

键/值数据库通常实现最简单的 NoSQL 模型。本质上,它们为您提供了一个分布式哈希表,允许您将数据写入给定的键并使用它读回。键/值数据库具有高度可扩展性,并且延迟显着低于其他数据库。

图数据库

许多主题领域,例如社交网络或有关电影和演员的信息,都可以用图表表示。尽管可以使用关系数据库来表示图,但这很困难且不方便。如果需要图数据,最好使用专门的图数据库,它可以将图的信息存储在分布式集群中,从而可以在图上高效地实现算法。

列式数据库

列式数据库和其他类型的数据库之间的主要区别在于数据在磁盘上存储的方式。关系数据库为每个表创建一个文件,并按顺序存储所有行的值。列式数据库为表中的每一列创建一个文件。这种结构允许您聚合数据并更有效地运行某些查询,但您必须确保数据符合此类数据库的限制。

您应该选择哪个数据库?

选择数据库通常是一个令人沮丧的问题,并且有这么多可用的选项,这似乎是一项艰巨的任务。好消息是没有必要只选择一个。您可以使用另一种称为微服务的现代模式:将应用程序分解为一组独立的服务,而不是创建实现所有功能并可以访问所有系统数据的单个整体应用程序。每个服务解决自己的狭隘问题,并且只使用自己的数据库,最适合解决这个问题。

你应该如何学习这一切?

拥有如此多的数据库,学习所有数据库似乎是一项不可能完成的任务。好消息:您不必这样做。NoSQL 数据库只有几种基本类型,如果您了解它们的工作原理,其他数据库就会更容易理解。此外,某些 NoSQL 数据库的使用频率比其他数据库高得多,因此最好将精力集中在最流行的解决方案上。以下是我认为您应该查看的最常用 NoSQL 数据库的列表:
  1. MongoDB。可能是市场上最流行的 NoSQL 数据库。如果一家公司不使用关系数据库作为其主要数据存储,它可能会使用 MongoDB。这是一个灵活的文档存储,具有一套很好的工具。在其职业生涯早期,MongoDB因在某些情况下丢失数据而名声不佳,但从那时起它的稳定性和可靠性有了很大的提高。如果您想了解更多信息,请查看此MongoDB 课程。

  2. 动态数据库。如果您使用 Amazon Web Services (AWS),您最好了解有关 DynamoDB 的更多信息。它是一个极其可靠、可扩展、低延迟的数据库,具有丰富的功能集并与许多其他 AWS 服务集成。最好的部分是您不必自己部署它。只需点击几下鼠标即可设置可处理数千个查询的可扩展 DynamoDB 集群。如果您对此感兴趣,可以看看这个课程

  3. Neo4j。最常见的图数据库。这是一个可扩展且稳定的解决方案,适合那些想要使用图形数据模型的人。如果您想了解更多信息,请从本课程开始。

  4. 雷迪斯。虽然这里描述的其他数据库用于存储核心应用程序数据,但 Redis 主要用于实现缓存和存储辅助数据。在许多情况下,上述数据库之一与 Redis 一起使用。要了解更多信息,请查看本课程。

2018 年 NoSQL

NoSQL 数据库是一个广阔且快速发展的领域。它们允许您存储和处理以前难以想象的数据量,但这是有代价的。这些数据库没有您熟悉的关系数据库中的许多功能,并且可能很难让您自己设置使用它们。但是,一旦掌握了它们,您就可以创建可扩展的分布式数据库,该数据库可以处理数量惊人的读写请求,随着生成的数据量越来越大,这一点变得极其重要。 原文: https: //simpleprogrammer.com/guide-nosql-software-developers/
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION