最近,我读了很多有关noSQL DBMS的文章。我了解CAP定理,ACID规则,BASE规则和基本理论。但是没有找到关于为什么NoSQL比RDBMS更容易扩展的资源(例如,在需要大量数据库服务器的系统中)吗?
我猜想,保留约束和外键会浪费资源,而在分发DBMS时,它要复杂得多。但是我希望还有更多。
有人可以解释一下noSQL / SQL如何影响可伸缩性吗?
最近,我读了很多有关noSQL DBMS的文章。我了解CAP定理,ACID规则,BASE规则和基本理论。但是没有找到关于为什么NoSQL比RDBMS更容易扩展的资源(例如,在需要大量数据库服务器的系统中)吗?
我猜想,保留约束和外键会浪费资源,而在分发DBMS时,它要复杂得多。但是我希望还有更多。
有人可以解释一下noSQL / SQL如何影响可伸缩性吗?
Answers:
noSQL数据库本质上放弃了SQL数据库为您提供的大量功能。
诸如自动执行参照完整性,事务等之类的事情。对于某些问题,这些都是非常方便的事情,并且需要一些有趣的技术才能在单个服务器之外进行扩展(考虑一下,如果您需要锁定两个服务器,会发生什么情况)原子交易的数据表,它们位于不同的服务器上!)。
noSQL数据库没有所有这些。如果您需要这些东西,就需要自己做,但是如果您不需要它(并且有很多不需要的应用程序),那么您好吗?DB不必执行所有这些复杂的操作并跨大部分数据集进行锁定,因此,很容易将其划分到许多服务器/磁盘/任何对象上,并使它运行得非常快。
这与NoSQL与SQL无关,而与BASE与ACID有关。
可伸缩性必须分解成其组成部分:
符合ACID的数据库(如传统RDBMS的数据库)可以扩展读取。它们本质上不比NoSQL数据库低效率,因为(可能)性能瓶颈是由NoSQL(有时)缺乏(例如联接和位置限制)引起的,您可以选择不使用它们。群集SQL RDBMS可以通过在群集中引入其他节点来扩展读取。读操作可以扩展到多远,这是有限制的,但是当您在集群中引入更多节点时,很难扩展写操作。
写扩展是事情变得繁琐的地方。ACID原则施加了各种约束,您在最终一致(BASE)架构中看不到这些约束:
为了扩大写操作或集群中节点的数量超过某个点,您必须能够放宽一些ACID要求:
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数据库(MongoDB,Redis,Riak,Memcached等)不维护外键约束,必须更明确地指定原子操作。同样,可以通过经验丰富的DBA扩展SQL数据库(SQL Server,Oracle,PostgreSQL等),以处理非常大的性能要求。
NoSQL数据库使经验丰富的程序员(他们非常了解竞争条件和原子操作)可以放弃仅占当今Web应用程序代码一小部分所需的大量处理。NoSQL数据库当然具有原子操作,并且SQL数据库中存在的大多数事务需求也可以从NoSQL数据库获得。区别在于抽象级别。NoSQL数据库消除了更高级别的抽象,并将此功能移交给了应用程序程序员,从而使总体代码速度更快,而未经经验的程序员则会破坏数据。
结果,我们更有可能看到NoSQL数据库在Web应用程序空间中越来越多地被使用,在Web应用程序空间中,开发时间和性能非常重要。金融和企业软件很可能会保留其SQL遗产,因为硬件性能相对较便宜,他们手头有经验丰富的DBA,而且由于经验不足的程序员而导致的风险增加也令人无法接受。
来自IBM developerWorks:通过NoSQL数据库提供云级数据可伸缩性
可伸缩性是一种系统,它应该能够以非常低的延迟支持具有非常高的请求率的非常大的数据库。
NoSQL系统具有许多共同的设计功能:
为什么关系数据库可能不适用于扩展
通常,关系数据库管理系统几十年来一直被视为“一种适用于所有数据持久性和检索性的万能解决方案”。经过广泛的研究和开发,他们已经成熟,并且非常成功地在不同的业务领域中创建了庞大的市场和解决方案。
对可伸缩性的不断增长的需求和新的应用程序需求为传统的RDBMS带来了新的挑战,其中包括对某些Web规模应用程序中这种“千篇一律”方法的不满。答案是新一代的低成本,高性能数据库软件,旨在挑战关系数据库管理系统的主导地位。NoSQL运动的一个主要原因是Web,企业和云计算应用程序的不同实现对数据库的要求不同-例如,并非每个应用程序都需要严格的数据一致性。
另一个例子:对于eBay,Amazon,Twitter或Facebook等高流量网站,可伸缩性和高可用性是不可折衷的基本要求。对于这些应用程序,即使是最轻微的中断也可能造成重大的财务后果并影响客户信任度。
在DBA.SE之上:水平缩放是什么意思?
水平缩放本质上是在扩展而不是向上扩展。您无需购买更大的功能更强的服务器并将所有负载移至该服务器上,而是购买额外的1台以上服务器并在其中分配负载。
当您能够同时在服务器上运行多个实例时,将使用水平缩放。通常,从1台服务器迁移到2台服务器要困难得多,而从2台迁移到5、10、50等则要困难得多。
解决了运行并行实例的问题后,您可以充分利用Amazon EC2,Rackspace的Cloud Service,GoGrid等环境,因为您可以根据需求启动和关闭实例,从而减少了为服务器电源付费的需求您不仅仅用来覆盖那些峰值负载。
关系数据库是并行运行完全读取/写入的更困难的项目之一。