最近,我读了很多有关noSQL DBMS的文章。我了解CAP定理,ACID规则,BASE规则和基本理论。但是没有找到任何资源说明为什么NoSQL比RDBMS更容易扩展(例如,在需要大量数据库服务器的系统中)?

我想保留约束和外键会浪费资源,并且当分发DBMS时,它要复杂得多。但是我希望还有更多的东西。

有人可以解释一下noSQL / SQL如何影响可伸缩性吗?

评论

“我猜想保留约束和外键会浪费资源,而当分发DBMS时,它要复杂得多。但是我希望还有很多。” -就是这样。更准确地说,这是使大多数NoSQL解决方案比其SQL表亲(对于某些数据模型)更具可伸缩性的一个共同特征。但是NoSQL是一个非常模糊的术语,不同的NoSQL数据库家族具有不同的特性,使其更具可伸缩性。

当然,SQL数据库可以很好地扩展到数万亿条记录,它们只需要一些专业知识即可设计和设置应用程序开发人员所没有的专业知识。通常,这是一套相当昂贵的硬件和许可证。

可能何时复制有人会在传统RDMS上使用MongoDB(或类似版本)?以及NoSQL数据库将取代关系数据库吗? SQL会消失吗?

在我看来,这个问题不是上述任何一个的重复。 mongodb问题是(除了较差的标题,使其看起来更具体),问了实际上更笼统的其他问题。投票重新开放。

#1 楼

noSQL数据库本质上放弃了SQL数据库为您提供的大量功能。

诸如自动执行参照完整性,事务等之类的东西。对于某些问题,这些都是非常方便的事情,并且需要一些有趣的技术才能在单个服务器之外进行扩展(考虑一下如果您需要为一个原子事务锁定两个表,并且它们位于不同的服务器上,将会发生什么情况。)

noSQL数据库没有所有这些。如果您需要这些东西,就需要自己做,但是如果您不需要它(并且有很多不需要的应用程序),那么您好吗。 DB不必执行所有这些复杂的操作并跨大部分数据集进行锁定,因此,很容易将其划分到许多服务器/磁盘/任何设备上,并使它真正快速地运行。

评论


不知道这么简单

–阿卜杜勒
17年4月6日在16:29

这个公认的答案完全没有提到SQL缺少的NoSQL分片功能。分片是NoSQL水平可伸缩的原因。

– hyankov
17年11月11日在12:10

@HristoYankov它之所以有效,是因为NoSQL系统无法完成分片中无法很好地发挥作用的所有事情。

–user253751
19年1月17日在22:33



@HristoYankov:SQL数据库可以水平分片,并非所有NoSQL数据库都可以轻松地水平分片。分片并不是您想要使用NoSQL的真正原因。

– Lie Ryan
19-09-17在8:30

@HristoYankov接受的答案比您“完全没有提到SQL缺少的NoSQL分片功能”的注释要深一层。正确的答案是谈论为什么使用SQL数据库进行水平分片更加困难。实际上,我花了20分钟的时间来寻找答案,几乎每个人都推出了“更好的NoSQL分片”,而没有提及任何原因。完全无用的回应。此处接受的答复可以完美地回答问题-尽管非常简短。列出更多原因也很好。

– Phoeniyx
19-09-26在20:28

#2 楼

这不是关于NoSQL vs SQL,而是关于BASE vs ACID。

可伸缩性必须分解成其组成部分:


读取伸缩性=处理更大数量的读取操作
写缩放=处理更大数量的写入操作

符合ACID的数据库(如传统RDBMS的数据库)可以扩展读取。它们本质上并不比NoSQL数据库低效率,因为(可能)性能瓶颈是由NoSQL(有时)缺乏(例如联接和位置限制)引起的,您可以选择不使用它们。群集SQL RDBMS可以通过在群集中引入其他节点来扩展读取。读取操作可以扩展到多远,但这些限制是由于在将更多节点引入群集中时难以扩大写入量而引起的。

写入扩展是繁琐的事情。 ACID原则施加了各种约束,您在最终一致(BASE)架构中看不到这些约束:


原子性意味着事务必须整体上完成或失败。
一致性约束意味着群集中的所有节点必须相同。如果您写入一个节点,则在将响应返回给客户端之前,必须将该写入复制到所有其他节点。这使传统的RDBMS群集难以扩展。
持久性约束意味着,为了永不丢失写入,您必须确保在将响应返回给客户端之前,已将写入刷新到磁盘。

要扩大写操作或群集中节点的数量到某个点之外,您必须能够放松一些ACID要求:


通过拖放原子性,您可以缩短表(数据集)锁定的时间。例如:MongoDB,CouchDB。
通过拖放一致性,您可以扩展群集节点之间的写入。例如:riak,cassandra。
降低耐用性使您无需写入磁盘即可响应写入命令。示例:memcache,redis。

NoSQL数据库通常遵循BASE模型而不是ACID模型。他们放弃了A,C和/或D要求,反过来又提高了可伸缩性。有些工具(例如Cassandra)可让您在需要时选择ACID的担保。但是,并非所有NoSQL数据库都始终具有更好的可伸缩性。

SQL API缺少一种机制来描述放松ACID要求的查询。这就是为什么BASE数据库都是NoSQL的原因。
个人笔记:我要说的最后一点是,在大多数情况下,当前都在使用NoSQL来提高性能,在通过使用带有正确索引的正确规范化架构来获得合适的RDBMS。正如这个站点(由MS SQL Server支持)所证明的,如果适当地使用RDBMS,它们可以扩展到高工作负载。不了解如何优化RDBMS的人应该远离NoSQL,因为他们不了解自己的数据将承受什么风险。

更新(2019-09-17):

评论


尽管我同意某些NoSQL存储将ACID替换为BASE,但对于属于NoSQL“类别”的所有存储来说,这仍然不是一个通用功能,这是一开始的定义不明确。一段时间后,该术语的解释从“无SQL”转换为“不仅是SQL”,但是由于许多此类数据库仍在进行JOIN或已开始实现SQLesque方言,因此Mark Madsen重新定义了该术语,以表示其他含义。他的数据库历史记录:“ No,SQL” ;-)

–卢卡斯·埃德(Lukas Eder)
2013年12月15日上午8:41

为了避免联接,我们将在NoSQL中对数据进行非规范化,从而导致重复和更多的存储。但是,如果我们可以进行非标准化,则可以在RDBMS中实现相同的功能。因此,“联接”或“不联接”取决于DBA,而不取决于数据库类型。对吗

– Kaushik Lele
2015年5月31日在7:12

@dynamic这些站点要么使用大量缓存,要么它们分片。这些设计使扩展数据的复杂性超出了db。在这种情况下,您也可以使用nosql,因为这正是nosql的折衷方案。

– Joeri Sebrechts
15年7月2日在18:35

“ SQL API缺乏描述放松ACID要求的查询的机制”。从技术上讲是正确的,但是SQL Server在这个方向上采取了怯的步骤。 SQL 2014引入了“延迟持久性”,放宽了ACID中的D,以换取降低写日志压力。

– EBarr
15年7月27日在0:56

这应该是imo可接受的答案。例子很清楚,但仍保持简洁。

–奥尔尚斯克
17年6月3日在23:36

#3 楼

的确,NoSQL数据库(MongoDB,Redis,Riak,Memcached等)不维护外键约束,必须更明确地指定原子操作。确实可以通过经验丰富的DBA扩展SQL数据库(SQL Server,Oracle,PostgreSQL等)来满足非常大的性能要求。

NoSQL数据库允许经验丰富的程序员,他们对种族非常了解。 -条件和原子操作,以放弃仅在当今Web应用程序代码的一小部分中所需的大量处理。 NoSQL数据库当然具有原子操作,并且SQL数据库中存在的大多数事务需求也可以从NoSQL数据库获得。区别在于抽象级别。 NoSQL数据库消除了更高级别的抽象,并将此功能移交给了应用程序程序员,从而使总体代码速度更快,而未经经验的程序员则会破坏数据。

结果,我们更有可能看到NoSQL数据库在Web应用程序空间中得到越来越多的使用,在Web应用程序空间中,开发时间和性能至关重要。金融和企业软件很可能会保留其SQL遗产,因为硬件性能相对较低,他们拥有经验丰富的DBA,而且由于经验不足的程序员而导致的风险增加也是不切实际的。

评论


从ACID的角度来看,我不确定我是否同意原子事务这一部分(尽管很难对“ NoSQL”进行评论,因为这有待于讨论到底是什么意思)。 “典型” NoSQL DB的大多数性能提升都是通过放松一致性保证来实现的(请参阅:最终一致性,ACID与BASE)。如果最终的一致性足以满足应用程序的需求(通常是这样),那么这将使水平缩放更加有效。

–丹尼尔B
13年4月9日在6:19

#4 楼

来自IBM developerWorks:通过NoSQL数据库提供云级数据可伸缩性

可伸缩性是一种系统,该系统应该能够以非常低的延迟以很高的请求率支持非常大的数据库。

NoSQL系统具有许多共同的设计功能:


能够在许多服务器上水平扩展吞吐量。
简单的调用级别接口或协议(相比之下)到SQL
绑定)。
支持比大多数传统RDBMS中的ACID事务弱的一致性模型。
有效地使用分布式索引和RAM进行数据存储。 >具有动态定义新属性或数据模式的能力。

为什么关系数据库可能不适用于扩展规模

通常,关系数据库管理系统被认为是“数十年的数据持久性和检索的一种万能解决方案。经过广泛的研发工作,它们已经成熟,并在不同业务领域成功地创造了一个庞大的市场和解决方案。

对可伸缩性的不断增长的需求和新的应用程序要求为传统RDBMS带来了新的挑战,包括在某些网络规模的应用中对这种“一刀切”的方法不满意。答案是新一代低成本,高性能的数据库软件,旨在挑战关系数据库管理系统的主导地位。 NoSQL运动的一个主要原因是Web,企业和云计算应用程序的不同实现对数据库的要求不同-例如,并非每个应用程序都需要严格的数据一致性。

另一个例子:对于eBay,Amazon,Twitter或Facebook等高流量网站,可伸缩性和高可用性是不可折衷的基本要求。对于这些应用程序,即使是最轻微的中断也可能造成重大的财务后果并影响客户信任。

DBA.SE上的内容:水平扩展意味着什么?

水平扩展本质上是什么?建立而不是建立。您不必去购买更大的更强大的服务器并将所有负载移到该服务器上,而是购买一台以上的其他服务器并在其中分配负载。

同时在服务器上运行多个实例的能力。通常,从1台服务器迁移到2台服务器要困难得多,而从2台服务器迁移到5台,10台,50台服务器等等要困难得多。

解决了运行并行实例的问题后,可以充分利用Amazon EC2,Rackspace的Cloud Service,GoGrid等环境,因为您可以根据需求启动和关闭实例,从而减少了为不仅仅用来满足这些峰值负载的服务器功能付费的需求。 br />
关系数据库是并行运行完全读取/写入的较困难的项目之一。