我试图在可伸缩性的上下文中理解nosql和关系数据库中的体系结构差异。
我对可伸缩性(水平)的理解是随着我们的数据增长,我们添加越来越多的服务器来均匀地分割负载。
在键值NO-SQL数据库中,我们可以添加新机器并拆分键。但是,到目前为止我所看到的所有示例都是为了理解NO-SQL数据库中的最终一致性,它们都具有主从配置,其中数据在所有从属服务器上复制,而不是在各种机器上进行拆分以实现可伸缩性。
我的问题是,使用复制整个数据是否会破坏No-SQL数据库中的整体可扩展性?同样可以在RDBMS中完成,有一个主(用于写)和从(用于读),NO-SQL在这方面如何更具可伸缩性?
答案 0 :(得分:5)
可伸缩性的目标是增加给定应用程序的总容量,并且可以是垂直(更大的机器)或水平(添加更多的机器)。当涉及到水平扩展时,您可以添加更多计算机,但随着计算机数量的增加,集群中节点发生故障的可能性也会增加,这是值得注意的。
当您添加更多节点时,您可以执行的操作是拆分数据(称为分片),还可以复制数据,这称为复制 。
通过复制,通常的体系结构是主从,您只能写入主服务器,主服务器将数据复制到从服务器,这意味着您不能使用复制将写入分割到集群,但它是可以拆分读取,在一致性级别(不是所有NoSQL技术提供相同级别)和集群配置上进行拆分。
分片更适合提供缩放,因为如果可能,将数据集拆分为具有相似大小的多个部分。这显然允许将读取和写入分割到不同节点的好处。为了使其有效,需要建立一些机制:
但通常这些机制是由数据库供应商提供的,因此无需担心提供它,但仍需要了解管理集群。
这里的问题是,正如我刚才提到的,集群拥有的节点越多,在给定节点上出现故障的可能性就越大,这意味着如果具有部分数据集的节点脱机,部分数据不可用,这不是理想的情况。但幸运的是,分片和复制并不是唯一的,是否可以构建分片群集,其中每个分片都是一个群集,并且已经复制到位。
但是为了回答你的问题
没有使用复制你的整个数据打败了整个点 No-SQL数据库中的可伸缩性?
在主从架构中,您无法拆分写入,但您可以拆分读取,这有点可以扩展,但主要目的是高可用性。
无论如何,有新的紧急数据库开始提供多主机架构,其中所有节点都充当主节点,这意味着所有节点都可以接收,写入和读取。
同样可以在RDBMS中完成,一个主(用于写)和 奴隶(读取),NO-SQL在这方面如何更具可扩展性?
在单节点环境中,当涉及JOINS
时,NoSQL已经比RDBMS更快,因为这是一项昂贵的操作,或者涉及大量的完整性检查。
因此,当您尝试在RDBMS中对数据集进行分片时,除非经过精心设计,否则最可能出现的情况是位于不同分片中的所需数据。这意味着需要在不同节点之间执行JOIN和完整性检查,这使得它们的操作比现有的更加昂贵。
这意味着RDBMS数据库使用的机制在你想要横向扩展时起到约束作用,而NoSQL并没有这样做。是的,您仍然可以水平扩展RDBMS,但总体而言比使用NoSQL数据库更昂贵。
更新:图表数据库特别提及
图形数据库中的分片非常困难,因为从数学上讲,在不同服务器之间分配大图的问题是NP完全的。而且,当不得不在不同分片之间查询数据时,图形的一个主要特征就会丢失,快速横向移动。
我已经看到图表数据库遵循水平扩展的两种主要方法:
1)让应用程序/开发人员决定如何对图表进行分区,您可以想象它是多么复杂。
2)复制所有节点中的所有图形并使用缓存分片,这意味着所有节点都拥有整个数据集,但每个节点在内存中维护最为该节点查询的图形部分特别是。
我想,未来图形数据库公司将开发更多解决方案来解决这个问题。
与您的问题相关,在当前状态下,由于缺乏RDBMS约束,图形数据库在水平扩展方面仍然可以超越RDBMS,但很难在不同的NoSQL数据库类型之间进行比较。
答案 1 :(得分:3)
NoSQL数据库中的主从配置用于高可用性目的和数据一致性,而不是与可伸缩性的目的混淆,即负载平衡工作负载
答案 2 :(得分:3)
在NoSQL中,就分割密钥而言,只有Master副本才有意义。从属用于HA和一般可用性。事实上,这种复制负责最终的一致性 - 您将立即获得数据,可能不是最新的数据,但最终您将拥有更新的数据。
另一方面,RDBMS的数据访问/修改速度较慢,因为它必须遵循ACID属性,而且主要是具有强一致性。
复制不是区分因素,因此,在NoSQL和RDBMS之间,遵守/不遵守ACID属性。可扩展性也不意味着没有额外的副本。希望得到答案。
答案 3 :(得分:2)
要回答您的问题,复制数据并不会破坏可扩展性。
可伸缩性大致指的是扩展数据库的能力,并不一定与拥有更多数据库副本有关。
正如其他答案所述,拥有数据库信息的更多服务器允许更多随时可用访问更多用户。
我认为这可能是可扩展性与可用性之间的误解?
答案 4 :(得分:0)
如果我们只考虑键值数据库和SQL数据库,那么前者比后者更适合可扩展性。
这是因为键值存储没有事务。因此,您唯一的保证是您可以自动更改一个键的一个值。这样可以轻松扩展。
例如,您只需对一个键进行散列并将键值对存储在与该键的哈希对应的机器上。
在不丢失ACID(原子性,一致性,隔离,事务持久性)属性的情况下,您无法对SQL数据库执行相同的操作。此外,如果在不同的计算机上存储不同的表或表的不同部分,则甚至无法轻松执行连接SELECT。
因此,一般而言,NoSQL数据库为多台机器上的分片做好了准备,而不是SQL。