为什么NoSQL数据库比SQL更可伸缩?


98

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

我猜想,保留约束和外键会浪费资源,而在分发DBMS时,它要复杂得多。但是我希望还有更多。

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


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

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


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

Answers:


77

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

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

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


2
不知道就是这么简单
Abdul

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

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

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

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

175

这与NoSQL与SQL无关,而与BASE与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):

自发布此答案以来,数据库的格局已经发生了变化。尽管在RDBMS ACID世界和NoSQL BASE世界之间仍然存在二分法,但这条界限变得越来越模糊。NoSQL数据库一直在添加RDBMS世界中的功能,例如SQL API和事务支持。现在甚至还有承诺使用SQL,ACID 写入扩展的数据库,例如Google Cloud Spanner,YugabyteDB或CockroachDB。通常情况下,细节是魔鬼,但对于大多数目的而言,这些都是“足够的ACID”。为了更深入地了解数据库技术及其发展方式,您可以看一下该幻灯片组(幻灯片说明中有附带的说明)。


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

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

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

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

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

4

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

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

结果,我们更有可能看到NoSQL数据库在Web应用程序空间中越来越多地被使用,在Web应用程序空间中,开发时间和性能非常重要。金融和企业软件很可能会保留其SQL遗产,因为硬件性能相对较便宜,他们手头有经验丰富的DBA,而且由于经验不足的程序员而导致的风险增加也令人无法接受。


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

4

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

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

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

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

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

通常,关系数据库管理系统几十年来一直被视为“一种适用于所有数据持久性和检索性的万能解决方案”。经过广泛的研究和开发,他们已经成熟,并且非常成功地在不同的业务领域中创建了庞大的市场和解决方案。

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

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

在DBA.SE之上:水平缩放是什么意思?

水平缩放本质上是在扩展而不是向上扩展。您无需购买更大的功能更强的服务器并将所有负载移至该服务器上,而是购买额外的1台以上服务器并在其中分配负载。

当您能够同时在服务器上运行多个实例时,将使用水平缩放。通常,从1台服务器迁移到2台服务器要困难得多,而从2台迁移到5、10、50等则要困难得多。

解决了运行并行实例的问题后,您可以充分利用Amazon EC2,Rackspace的Cloud Service,GoGrid等环境,因为您可以根据需求启动和关闭实例,从而减少了为服务器电源付费的需求您不仅仅用来覆盖那些峰值负载。

关系数据库是并行运行完全读取/写入的更困难的项目之一。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.