NoSQL与RDBMS的扩展性比较?

4
我正在尝试理解NoSQL和关系型数据库在可扩展性方面的架构差异。
我的理解是,随着数据增长,我们可以添加更多的服务器来平均分配负载,这就是水平扩展。
在键值NoSQL数据库中,我们可以添加新的机器并分割键。然而,到目前为止我所看到的所有例子,为了理解NoSQL数据库的最终一致性,它们都采用主从配置,其中数据被复制到所有从节点,而不是在各个机器之间分割以实现可扩展性。
我的问题是:在NoSQL数据库中复制整个数据不会破坏可扩展性的整个意义吗?同样的方式也可以在关系型数据库中完成,使用一个主服务器(用于写入)和从服务器(用于读取)。那么在这方面,NoSQL如何比关系型数据库更具可扩展性呢?

可能是重复的问题:https://dev59.com/cGoy5IYBdhLWcg3wKq-s 虽然他们只是浅尝辄止地讨论了一下(主要是支持nosql)。 - Simon Mourier
5个回答

8
可扩展性的目标是增加特定应用程序的总体容量,可以是垂直扩展(更大的机器)或水平扩展(添加更多机器)。当涉及到水平扩展时,您可以添加更多机器,但随着机器数量的增加,集群中的节点失败的概率也会增加,这是需要记住的事情。
当您添加更多节点时,您可以执行数据拆分(称为“分片”),也可以复制数据(称为“复制”)。
复制
使用复制时,通常的架构是主从结构,在此结构中,只能向主服务器写入数据,主服务器将数据复制到从服务器,这意味着您不能使用复制将写操作拆分到集群中,但是根据一致性级别(并非所有NoSQL技术都提供相同级别)和集群配置,可以拆分读操作。
分片
分片更适合提供扩展功能,因为您可以将数据集拆分为多个具有类似大小(如果可能)的部分。这显然允许将读取和写入拆分到不同的节点。为了使其正常工作,需要放置一些机制:
路由:查找存储数据的片段或决定要在哪个片段中编写
平衡:随时间维护数据集的不同片段具有相似的大小。
但通常这些机制由数据库供应商提供,因此无需担心提供它,但仍然需要了解以管理集群。
问题在于,正如我一开始提到的那样,集群中的节点越多,特定节点发生故障的几率就越高,这意味着如果具有数据集的某个部分的节点离线,则部分数据将不可用,这不是理想的情况。但幸运的是,分片和复制并不是互斥的,可以构建一个分片集群,其中每个分片都是带有复制的集群。
但是为了回答您的问题:
“在No-SQL数据库中使用复制整个数据是否不符合可扩展性的原则?”
在主从结构中,您无法拆分写操作,但可以拆分读操作,这在某种程度上是一种扩展方式,尽管其主要目的是高可用性。
无论如何,现在出现了新兴的数据库,开始提供多主体系结构,其中所有节点均作为主服务器运行,这意味着所有节点都可以接收读写操作。
“在RDBMS中也可以做到相同的事情,使用一个主服务器(用于写入)和从服务器(用于读取),那么No-SQL在这方面更具可扩展性。”
在单节点环境中,当涉及到“JOIN”或涉及大量完整性检查时,NoSQL已经比RDBMS更快。
因此,在尝试在关系型数据库中进行数据分片时,除非设计得非常小心,否则最有可能的情况是所需数据位于不同的分片中。这意味着JOIN和完整性检查需要在不同节点之间执行,使它们比它们本来就是的操作更加昂贵。
这意味着关系型数据库使用的机制在你打算横向扩展时会作为限制因素,而NoSQL则不会。是的,你仍然可以横向扩展关系型数据库,但总体来说比使用NoSQL数据库更加昂贵。
更新:特别提到图形数据库
在图形数据库中进行分片非常困难,因为从数学上讲,在不同服务器之间分配大型图形的问题是NP完全问题。而且,当必须在不同分片之间查询数据时,图形的主要特征之一——快速遍历——就会丢失。
我看到了图形数据库遵循的两种主要横向扩展方法:
1)让应用程序/开发人员决定如何分区图形,你可以想象这有多么复杂。
2)在所有节点中复制整个图形并使用缓存分片,这意味着所有节点都拥有整个数据集,但每个节点在内存中维护其特定于该节点的最常查询的图形部分。
我想,在未来,图形数据库公司将开发更多解决此问题的解决方案。
与你的问题相关,在它们当前的状态下,当涉及到横向扩展时,图形数据库仍然可以优于关系型数据库,由于缺乏关系型数据库的限制,但很难比较不同类型的NoSQL数据库。

3
NoSQL数据库中的主从配置是用于实现高可用性和数据一致性,而不是与可扩展性的目的混淆。可扩展性的目的是为了平衡工作负载。请注意,保留了HTML标签。

1
所以,如果跨多个服务器进行复制有助于实现高可用性,那么如何实现可扩展性/负载平衡呢? - Max

3
在NoSQL中,就拆分键而言,只有主节点副本是重要的。从节点用于HA和通用可用性。实际上,这种复制负责最终一致性--您将立即获取数据,但可能不是最新的数据,但最终您将获得更新后的数据。
另一方面,RDBMS将具有较慢的数据访问/修改,因为它必须遵循ACID属性,而且大多数情况下都具有强一致性。
复制并非是NoSQL和RDBMS之间的区别因素,而是依据是否遵循ACID属性来区分。扩展性也不表示不存在额外的副本。希望这可以回答你的问题。

2
回答你的问题,复制你的数据并不会削弱可扩展性的重点。
“可扩展性”粗略地指数据库增长的能力,并不一定与拥有更多数据库副本相关。
将数据库信息存在更多服务器上可以让更多用户更方便地访问它,就像其他答案所述。
我认为这可能是“可扩展性”和“可用性”之间的误解?

1
好的,我明白更多的副本意味着更高的可用性,这样如果一个出现问题,我们仍然有其他的,那么如何在关系型数据库和非关系型数据库中实现高可扩展性呢? - Max
我目前是一名学生,没有太多实现这些系统的经验,我只学过理论。我找到了另一个堆栈交换帖子,可能比我更有帮助。这个线程中的答案比我能够凑出来的要详细和结构化得多:http://programmers.stackexchange.com/questions/194340/why-are-nosql-databases-more-scalable-than-sql - dak1220

0
如果我们只考虑键值数据库与SQL数据库,那么前者比后者更适合可扩展性。
这是因为键值存储没有事务。所以你唯一的保证就是你可以原子性地改变一个键的一个值。这导致了易于扩展性。
例如,你只需要对一个键进行哈希处理,并将键值对存储在与该键哈希值相对应的机器上。
对于SQL数据库,你无法做到同样的事情而不失去ACID(事务的原子性、一致性、隔离性和持久性)属性。此外,如果你在不同的机器上存储不同的表或表的不同部分,甚至无法轻松执行连接查询SELECT。
因此,总体而言,NoSQL数据库比SQL数据库更适用于在多台机器之间进行分片。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接