为什么RDBM的集群不能像NoSQL那样?


88

Nosql DBMS的一大优点是它们可以更轻松地集群。假设使用NoSQL,您可以创建数百个便宜的计算机,这些计算机存储不同的数据并立即查询所有数据。

我的问题是,为什么关系型DBMS不能像mysql或sql server那样?是仅仅是供应商还没有找到一种技术方法来解决现有产品的问题,还是关系模型存在一些问题导致这种情况不可行?NoSQL存储和访问数据(键/值,文档等)的方式有什么好处,可以简化群集操作(如果确实如此)?


8
与Oracle RAC之类的东西相比,Oracle RAC可以在多达63个节点上运行,每个节点都提供相同的数据库,并且都符合ACID标准,因此在技术上将不同的数据存储(分片)非常简单。没有ACID,它们使用自己的专有API,并且相对简单。
Philᵀᴹ

6
+ RAC仍然是共享磁盘体系结构。它仍然需要中央SAN交换机,因此任何DBMS节点都可以看到任何存储。不过,您可以有多个SAN控制器使其成为M:M架构。Teradata是一种无共享架构,但是针对数据仓库应用程序进行了优化,并且您仍然可以跨所有节点复制数据库的某些部分(例如维度表)。Netezza的帮助甚至更少。您必须分别加载分区表的各个段。
ConcernedOfTunbridgeWells

1
因此,我已阅读并理解了以下(大部分)有关答复。问题似乎与ACID有关,而与关系模型有关。是否有使用关系模型的解决方案,即使它们不完全符合酸要求,也与NoSQL一样。看起来NoSQL应该真的被命名为NoACID,因为它与sql或关系模型无关,并且与一致性,原子性,数据访问和存储位置等都
息息相关。– fregas 2013年

6
@fregas-NoSQL没有任何正式定义。这只是应用于各种数据库管理系统的流行语。仲裁复制(最终的一致性)被许多此类系统(尽管绝不是全部)用作性能优化。我不知道任何使用仲裁复制的RDBMS产品-当然,主流产品都没有。没有理论上的理由不能做到这一点,但是考虑到共享磁盘系统可以实现的可扩展性水平,它相当复杂并且具有可疑的价值。
ConcernedOfTunbridgeWells

@ConcernedOfTunbridgeWells仲裁复制与ACID不一致,但这就是为什么它不会完成的原因。
克里斯·特拉弗斯

Answers:


141

分布式数据库系统101

还是分布式数据库-FK的“ 网络规模 ”实际上是什么意思?

分布式数据库系统是复杂的生物,具有多种不同的风格。如果我在大学里深入学习有关此方面的内容,我会很想念,我将尝试解释构建分布式数据库系统的一些关键工程问题。

首先,一些术语

ACID(原子性,一致性,隔离性和耐用性)属性:这些是必须强制执行的关键不变式,以便可靠地执行事务而不会引起不良副作用。

原子性要求事务完成或完全回滚。部分完成的交易永远都不可见,并且必须以防止这种情况发生的方式来构建系统。

一致性要求事务绝不能违反数据库架构所保证的任何不变式(例如声明性参照完整性)。例如,如果存在外键,则应该不可能插入与父代不相关的子记录。

隔离要求事务不应相互干扰。如果并行或顺序执行事务,则系统应保证相同的结果。实际上,大多数RDBMS产品都允许在权衡隔离与性能之间进行权衡的模式。

持久性要求一旦提交,事务就必须以对硬件或软件故障稳定的方式保留在持久性存储中。

我将在下面解释这些要求在分布式系统上存在的一些技术障碍。

共享磁盘体系结构:一种体系结构,群集中的所有处理节点都可以访问所有存储。这可能会成为数据访问的中心瓶颈。共享磁盘系统的一个示例是 Oracle RAC Exadata

无共享架构:一种架构,其中集群中的处理节点具有本地存储,而其他集群节点看不到该本地存储。无共享系统的示例是 Teradata Netezza

共享内存体系结构:多个CPU(或节点)可以访问共享内存池的体系结构。大多数现代服务器都是共享内存类型。共享内存有助于某些操作,例如缓存或原子同步原语,而这些操作在分布式系统上很难完成。

同步:通用术语,描述了确保多个进程或线程对共享资源进行一致访问的各种方法。尽管某些网络体系结构(例如Teradata的BYNET)在网络协议中具有同步原语,但在分布式系统上比在共享内存系统上做起来要困难得多。同步还可能带来大量开销。

半联接:用于联接分布式系统的两个不同节点中保存的数据的原语。本质上,它包含有关要联接的行的足够信息,这些信息被捆绑并由一个节点传递给另一节点,以解决联接。在大型查询中,这可能涉及大量的网络流量。

最终一致性:用于描述事务语义的术语,该事务权衡权衡分布式系统所有节点上的即时更新(读取一致性)以提高写入性能(并因此提高事务吞吐量)。最终一致性是使用仲裁复制作为性能优化来加快分布式数据库中事务提交的副作用,分布式数据库中多个数据副本保存在单独的节点上。

Lamport算法:一种用于在没有共享内存的系统之间实现互斥(同步)的算法。通常,系统内的互斥需要原子型的read-compare-write或类似的指令,这种指令通常仅在共享内存系统上才适用。还存在其他分布式同步算法,但是兰莫特算法是最早的算法之一,也是最著名的算法。像大多数分布式同步机制一样,Lamport的算法在很大程度上依赖于群集节点之间的准确时序和时钟同步。

两阶段提交(2PC):这是一组协议,可确保涉及多个物理系统的数据库更新一致地提交或回滚。无论是在系统中使用2PC还是通过事务管理器在多个系统中使用2PC,它都会带来大量开销。

在两阶段提交协议中,事务管理器要求参与节点以确保可以提交的方式持久化事务,然后用信号通知该状态。当所有节点都返回“幸福”状态时,它会向节点发出信号以提交。直到所有节点都发送指示提交已完成的答复,该事务仍被视为已打开。如果节点在发出提交完成信号之前已关闭,则事务管理器将在备份节点重新启动时重新查询该节点,直到获得肯定的答复以表明事务已提交。

多版本并发控制(MVCC):通过将数据的新版本写入其他位置并允许其他事务查看数据的旧版本,直到提交新版本来管理争用。这样可以减少数据库争用,但要付出一些额外的写流量来写入新版本,然后将旧版本标记为过时。

选择算法:涉及多个节点的分布式系统本质上不如单个系统可靠,因为存在更多的故障模式。在许多情况下,集群系统需要某种机制来处理节点的故障。选举算法是一类算法,用于在“领导者”节点不是100%确定或可靠的情况下选择领导者来协调分布式计算。

水平分区:一个表可以通过其键划分到多个节点或存储卷中。这允许将大数据量拆分为较小的块,并分布在多个存储节点上。

分片:无共享架构中,数据集可以在多个物理节点之间进行水平分区。如果该分区不是透明的(即,客户端必须知道分区方案并确定要显式查询的节点),则称为分片。某些系统(例如Teradata)确实在节点之间拆分数据,但是位置对客户端是透明的。该术语通常不与此类系统结合使用。

一致性哈希:一种用于根据密钥将数据分配给分区的算法。它的特点是哈希键分布均匀,并且能够有效地弹性扩展或减少存储桶的数量。这些属性使它可用于在节点集群上进行数据分区或加载,其中大小可以随着节点的添加或删除而动态变化(可能是由于故障)。

多主复制:一种技术,允许跨集群中多个节点的写操作复制到其他节点。该技术通过允许某些表在服务器之间进行分区或分片,而另一些表在整个集群之间进行同步,则有助于扩展。必须将写入复制到所有节点(而不是仲裁),因此在多主机复制体系结构上,事务提交比在仲裁复制系统上的开销更大。

非阻塞交换机:一种网络交换机,它使用内部硬件并行性来实现吞吐量,该吞吐量与没有内部瓶颈的端口数量成比例。天真的实现可以使用交叉开关机制,但这对于N个端口具有O(N ^ 2)复杂度,将其限制为较小的交换机。较大的交换机可以使用更复杂的内部拓扑(称为无阻塞最小跨度交换机)来实现线性吞吐量缩放,而无需O(N ^ 2)硬件。

制作分布式DBMS-有多困难?

若干技术挑战使得在实践中很难做到这一点。除了增加构建分布式系统的复杂性之外,分布式DBMS的架构师还必须克服一些棘手的工程问题。

分布式系统上的原子性:如果事务更新的数据分布在多个节点上,则必须协调节点的提交/回滚。这会在无共享系统上增加大量开销。在共享磁盘系统上,这不是问题,因为所有存储都可以被所有节点看到,因此单个节点可以协调提交。

分布式系统上的一致性:以上面引用的外键示例为例,系统必须能够评估一致状态。例如,如果外键关系的父级和子级可以驻留在不同的节点上,则需要某种分布式锁定机制以确保不使用过时的信息来验证交易。如果不强制执行此操作,则您可能会遇到(例如)竞争条件,即在允许父项存在之前,先验证父项是否存在,然后删除该父项。

约束的延迟执行(即,直到提交以验证DRI为止)要求在事务期间保持该锁。这种分布式锁定会带来很大的开销。

如果保存了多个数据副本(在无共享系统上可能需要这样做,以避免来自半联接的不必要的网络流量),那么必须更新所有数据副本。

分布式系统上的隔离:如果受事务影响的数据驻留在多个系统节点上,则必须在节点之间同步锁和版本(如果正在使用MVCC)。要保证操作的可串行性,尤其是在可能存储数据冗余副本的无共享架构上,需要分布式同步机制(例如Lamport算法),这也会带来网络流量的巨大开销。

分布式系统上的持久性在共享磁盘系统上,持久性问题与共享内存系统基本相同,不同之处在于跨节点仍然需要分布式同步协议。DBMS必须将日志写入日志并一致地将数据写出。在无共享系统上,可能有多个数据副本或部分存储在不同节点上的数据。需要两阶段提交协议以确保跨节点正确进行提交。这也招致了巨大的开销。

在无共享系统上,节点丢失可能意味着系统无法使用数据。为了减轻这种影响,可以在一个以上的节点上复制数据。这种情况下的一致性意味着必须将数据复制到通常驻留的所有节点。这会产生大量的写开销。

NoSQL系统中进行的一项常见优化是使用仲裁复制和最终一致性,以允许延迟复制数据,同时通过在报告已提交事务之前写入仲裁来保证数据的一定水平的弹性。然后将数据延迟复制到数据副本所在的其他节点。

请注意,“最终一致性”是对一致性的主要折衷,如果必须在提交事务后立即一致地查看数据,则可能无法接受。例如,在财务应用程序上,应立即有更新的余额。

共享磁盘系统

共享磁盘系统是所有节点都可以访问所有存储的系统。因此,计算与位置无关。许多DBMS平台也可以在此模式下工作-Oracle RAC是这种体系结构的一个示例。

共享磁盘系统可以支持存储节点和处理节点之间的M:M关系,因此可以大幅扩展。一个SAN可以有多个控制器,多个服务器可以运行数据库。这些体系结构以交换机为中心瓶颈,但是交叉开关使该交换机具有很大的带宽。可以将某些处理卸载到存储节点上(例如在Oracle的Exadata中),这可以减少存储带宽上的流量。

尽管从理论上说,切换是一个瓶颈,但是可用带宽意味着共享磁盘体系结构将非常有效地扩展到大事务量。大多数主流DBMS体系结构都采用这种方法,因为它提供了“足够好”的可伸缩性和高可靠性。使用冗余存储体系结构(例如光纤通道),就不会有单点故障,因为在任何处理节点和任何存储节点之间至少有两条路径。

无共享系统

无共享系统是这样的系统,其中至少一些数据保存在本地节点上,而其他节点则不直接可见。这消除了中央交换机的瓶颈,从而允许数据库(至少在理论上)随节点数量扩展。水平分区允许在节点之间拆分数据;这可能对客户端透明或不透明(请参阅上面的分片)。

因为数据是固有分布的,所以查询可能需要来自多个节点的数据。如果联接需要来自不同节点的数据,则使用半联接操作来传输足够的数据以支持从一个节点到另一个节点的联接。这可能会导致大量的网络流量,因此优化数据的分布会对查询性能产生很大的影响。

通常,数据跨无共享系统的节点间复制,以减少半联接的必要性。这在数据仓库设备上效果很好,因为其维度通常比事实表小许多个数量级,并且可以轻松地在节点之间复制。它们通常还分批加载,因此复制开销比事务性应用程序要少。

无共享架构的固有并行性使其非常适合数据仓库特有的表扫描/聚合查询。这种操作几乎可以随处理节点的数量线性地扩展。由于半联接操作会产生大量网络流量,因此跨节点的大型联接往往会产生更多开销。

移动大数据量对于事务处理应用程序没有多大用处,在该应用程序中,多次更新的开销使这种类型的体系结构没有共享磁盘那么吸引人。因此,这种类型的体系结构往往不会在数据仓库应用程序中广泛使用。

分片,仲裁复制和最终一致性

仲裁复制是DBMS复制数据以实现高可用性的工具。这对于打算在没有内置高可用性功能(如SAN)的便宜商品硬件上运行的系统很有用。在这种类型的系统中,数据跨多个存储节点进行复制,以提高读取性能和冗余存储,从而使系统能够应对节点的硬件故障。

但是,对于M个节点和N次写入,对所有节点的写入复制为O(M x N)。如果必须在允许提交事务之前将写操作复制到所有节点,则写操作将变得昂贵。仲裁复制是一种折衷方案,它允许将写入立即复制到节点的一个子集,然后通过后台任务将其延迟写入其他节点。通过在将事务报告为已提交给客户端之前确保将其复制到最小的节点子集(仲裁),可以提供更快的提交速度,同时提供一定程度的冗余。

这意味着在仲裁之外读取节点可以看到数据的过时版本,直到后台进程完成将数据写入其余节点为止。语义被称为“最终一致性”,根据您的应用程序的要求,它可能会接受也可能会接受,但是这意味着在资源使用方面,事务提交比O(n)更接近O(1)。

分片要求客户端通常使用一种称为“一致性哈希”的算法来了解数据库中数据的分区。在分片数据库中,客户端通过散列键来确定将查询发布到集群中的哪个服务器。由于请求是在群集中的各个节点之间分布的,因此没有一个查询协调器节点的瓶颈。

这些技术允许通过将节点添加到群集来以近乎线性的速率扩展数据库。从理论上讲,仅当底层存储介质被认为不可靠时才需要法定复制。如果要使用商用服务器,这将很有用,但是如果基础存储机制具有自己的高可用性方案(例如,具有镜像控制器的SAN和与主机的多路径连接),则价值将较小。

例如,尽管Google BigTable确实位于GFS(确实使用仲裁复制的群集文件系统)上,但它本身并没有实现仲裁复制。BigTable(或任何无共享系统)可以使用具有多个控制器的可靠存储系统,并在控制器之间划分数据。然后将通过数据分区来实现并行访问。

返回RDBMS平台

没有内在的理由这些技术不能与RDBMS一起使用。但是,在这样的系统上,锁定和版本管理会非常复杂,并且此类系统的任何市场都可能非常专业。没有一个主流的RDBMS平台使用仲裁复制,而且我还没有特别了解可以使用仲裁复制的任何RDBMS产品(至少没有一个具有显着优势的产品)。

共享磁盘和无共享系统可以扩展到非常大的工作负载。例如,Oracle RAC可以支持63个处理节点(本身可以是大型SMP计算机)和SAN上任意数量的存储控制器。IBM Sysplex(zSeries大型机的集群)可以支持多个大型机(每个大型机具有自己的强大处理能力和I / O带宽)和多个SAN控制器。尽管它们确实假定了可靠的存储,但它们可以使用ACID语义支持非常大的事务量。Teradata,Netezza和其他供应商建立了基于无共享设计的高性能分析平台,这些设计可以扩展到非常大的数据量。

到目前为止,廉价但超高容量的全ACID RDBMS平台的市场由MySQL主导,它支持分片和多主复制。MySQL不使用仲裁复制来优化写入吞吐量,因此事务提交比NoSQL系统上的开销更大。分片允许很高的读取吞吐量(例如,Facebook广泛使用MySQL),因此,这种类型的体系结构可在读取繁重的工作负载上很好地扩展。

有趣的辩论

BigTable是无共享架构(本质上是分布式键值对),如下面的Michael Hausenblas所指出。我最初对它的评估包括MapReduce引擎,它不是BigTable的一部分,但通常会在其最常见的实现(例如Hadoop / HBase和Google的MapReduce框架)中与其结合使用。

将这种体系结构与Teradata(在存储和处理之间具有物理亲和力)(即,节点具有本地存储而不是共享的SAN)进行比较,您可能会争辩说BigTable / MapReduce是通过全局可见的并行存储系统共享的磁盘体系结构。

诸如Hadoop之类的MapReduce样式系统的处理吞吐量受到非阻塞网络交换机带宽的限制。1 但是,由于设计固有的并行性,无阻塞交换机可以处理大带宽集合,因此它们很少会对性能造成重大的实际限制。这意味着即使理论上网络交换机是一个中心瓶颈,共享磁盘体系结构(也许更好地称为共享存储系统)也可以扩展到较大的工作负载。

最初要指出的是,尽管共享磁盘系统中存在此中心瓶颈,但是具有多个存储节点(例如BigTable平板电脑服务器或SAN控制器)的分区存储子系统仍可以扩展到大型工作负载。无阻塞交换机体系结构(理论上)可以处理与端口一样多的当前连接。

1当然,可用的处理和I / O吞吐量也限制了性能,但是网络交换机是所有流量通过的中心点。


10
史诗。干得好老男孩。
马克·斯托里·史密斯

8
惊人的答案!
Philᵀᴹ

1
哇,我想您几乎覆盖了那里!
Mr.Brownstone

2
@Michael Hausenblas再想一想,如果孤立地使用BigTable DB,我会拒绝共享。在本文中,我将其与整个MapReduce / Hadoop堆栈(在处理和存储之间没有特定关联)进行了混合。您可以很合理地争论这种合并的不适当性。
ConcernedOfTunbridgeWells

3
几个技术思想。实际上,仲裁复制是在PostgreSQL的主/从设置流式复制中完成的。默认情况下,数据必须仅提交给主服务器,但是您还可以要求在返回提交之前,还必须将数据写入n个从服务器。
克里斯·特拉弗斯

21

关系数据库可以像NoSQL解决方案一样集群。维护ACID属性可能会使情况变得更加复杂,因此必须意识到为维护这些属性而进行的权衡。不幸的是,确切的权衡取决于工作量,当然也取决于设计数据库软件时所做出的决定。

例如,即使群集的吞吐量很好地扩展,主要是OLTP的工作负载也可能具有额外的单个查询延迟。额外的延迟可能不会引起注意,或者会成为真正的破坏者,所有这些都取决于应用程序。通常,群集将提高吞吐量并缩短延迟时间,但是如果应用程序的查询特别适合并行处理,那么即使是“规则”也令人怀疑。

我工作的公司Clustrix提供的是通过高速网络连接的一系列同类计算和存储节点。关系数据是散列在每个索引上的节点上的哈希散列,我们称之为“切片”。每个切片将有两个或多个副本散布在整个群集中,以在节点或磁盘发生故障时保持持久性。客户端可以连接到集群中的任何节点,以使用MySQL Wire协议发出查询。

单独考虑ACID数据库的组成部分是不自然的,因为它的很多部分是相互衔接的,但是这里有:

原子性 -Clustrix使用两个阶段提交来确保原子性。UPDATE和DELETE操作还将通过我们的分布式锁管理器锁定行,因为我们在内部将这些操作转换为SELECT,然后再执行精确的UPDATE / DELETE操作。

原子性显然会增加参与事务的节点之间的消息传递量,并增加那些节点上处理提交协议的负载。这是拥有分布式系统的开销的一部分,并且如果每个节点都参与每个事务,则会限制可伸缩性,但是如果节点具有要写入的副本之一,则它们仅参与事务。

一致性 -外键作为触发器实现,在提交时进行评估。大范围的UPDATE和DELETE操作会由于锁定而影响我们的性能,但幸运的是,我们很少经常看到这些内容。看到事务更新/删除几行然后提交,这种情况更为常见。

一致性的另一部分是通过PAXOS共识协议维护仲裁,该协议可确保只有具有大多数已知节点的群集才能进行写操作。当然,群集可能有仲裁但仍缺少数据(切片的所有副本都处于脱机状态),这将导致访问这些切片之一的事务失败。

隔离 -Clustrix在容器级别提供MVCC隔离。我们的原子性保证在我们报告已提交的事务之前,所有适用的副本都将收到特定的写入,这主要是将隔离问题减少到非群集情况下的情况。

耐久性 -关系数据的每个切片都存储到两个或多个节点,以在节点或磁盘发生故障时提供弹性。在这里可能还值得注意的是,出于性能原因,我们产品的设备版本具有NVRAM卡,在其中存储了WAL。许多单实例数据库将通过间隔检查点而不是每次提交检查点来提高其WAL的性能。这种方法在分布式系统中是有问题的,因为它使得“重放到哪里?” 一个复杂的问题。通过提供坚硬的耐用性保证,我们在设备中避免了这种情况。


2
谢谢@Matt-这只是我们所追求的答案。顺便说一句,我同意分离ACID的组件不是很自然,因为我在写文章时发现了类似的东西。再次感谢您的宝贵时间,我们很高兴看到您和您的团队做出进一步的贡献。
ConcernedOfTunbridgeWells 2013年

14

基本答案是一致性模型是不同的。我正在写这篇文章来扩展ConcernedOfTunbridge的答案,这确实应该是它的参考点。

ACID一致性模型的基本要点是,它对系统内部全局数据的状态做出了一系列基本保证。这些保证受CAP定理的限制,这基本上意味着要使它们起作用,您需要在告诉应用程序您已提交事务之前在同一页面上拥有所有权威来源。因此,如果不遇到这些限制,很难进行多原版复制。当然,一旦您开始在多主机环境中进行异步复制,这些保证就无从谈起了。ACID一致性模型是用于重要或重要信息的强一致性模型。

BASE一致性模型是旨在用于非关键信息的弱一致性模型。由于担保明显较弱,因此,由于担保很弱,因此在多主系统中提供此类担保的能力更容易获得。

RDBMS可以并且可以扩展以及NoSQL解决方案!

但是,在某些情况下,RDBMS可以并且确实可以扩展到NoSQL甚至无法匹配的程度。只是做的不同。我将以Postgres-XC为例,说明如何在不牺牲强大一致性保证的情况下进行横向扩展。

这些特定的RDBMS的工作方式是实现某种类似于具有代理的分片解决方案,并且类似于共享磁盘体系结构,但是要比这两种方法复杂得多。它们的扩展方式与NoSQL解决方案不同,因此权衡是不同的。

据我了解,Postgres-XC模型是受Teradata启发的。它由具有两种不同角色的节点组成,分别是存储节点或协调器。协调器是多主服务器(不涉及任何实际复制),它们连接到存储节点以处理实际的数据处理。存储节点以主从设置复制。每个存储节点本质上都包含数据库的碎片,但是协调器维护数据的一致图片。

这里涉及重大的责任分离。存储节点管理数据,检查约束,本地可执行的外键约束,并至少处理一些数据聚合。协调器处理无法在本地强制执行的那些外键,以及可能从多个数据节点提取的窗口和其他数据注意事项。从本质上讲,协调员使ACID在多主设置中的分布式事务中成为可能,而用户甚至不知道事务是分布式的。

在这方面,Postgres-XC提供了类似于NoSQL扩展选项的功能,但是由于额外的一致性保证,因此增加了一些复杂性。我知道有商业的RDBMS可以提供​​这种可伸缩性。Teradata会这样做。另外,共享磁盘系统可以以类似的方式扩展,并且DB2和Oracle都提供了这样的解决方案。因此,说RDBMS无法做到这一点是完全不公平的。他们能。但是,过去的需求如此之小,以至于规模经济不足以使大多数参与者都可以负担得起专有解决方案。

最后是有关VoltDB的说明。像NoSQL解决方案一样,我将VoltDB视为非常专业的工具。它的速度非常快,但要以多次往返事务和磁盘的持久性为代价。这意味着您有完全不同的关注点。当RDBMS先锋构建NoSQL解决方案时,您将获得VoltDB ;-)。VoltDB之所以快速,部分原因是它从等式中定义了并发性和持久性。持久性成为网络属性,而不是主机内部属性,并发性是通过一次运行一个查询来管理的,并以内部顺序并行地内部并行化。它不是传统的RDBMS(这是一件好事,因为它可以代替传统的RDBMS,但是反之亦然)。

编辑: 考虑联接的含义也很重要。在集群系统中,联接成为一个非常不同的性能问题。如果所有内容都在同一节点上,则它们可以提高性能,但是如果您必须往返于其他节点,这将带来很高的成本。因此,数据模型的确会产生差异,并且群集方法会影响性能。诸如Postgres-XC和Postgres-XL之类的方法假定您可以花大量时间思考问题,以便可以适当地分片数据并将合并的数据保持在一起。但是,这增加了设计开销。另一方面,它的伸缩性比许多NoSQL解决方案好得多,并且可以适当调整。例如,我们(在Adjust处)对PostgreSQL中的3.5PB数据使用类似于NoSQL的群集策略,这基本上是日志分析。而且我们的许多设计都受到NoSQL群集策略的深刻启发。因此,有时数据模型也确实会约束聚类模型。


6

我的答案不会像上一个那样写得很好,但是可以。

Ingres的Michael Stonebraker创建了一个MPP无共享列存储(Vertica)和MPP无共享New SQL数据库(VoltDB),该数据库在集群中不同节点之间分发数据并维护ACID。此后,Vertica被HP收购。

我相信其他新的SQL数据库也可以维护ACID,尽管我不确定它们中有多少在整个群集中分布行等。

这是Stonebraker关于NoSQL和“ Old SQL”的新SQL的演讲。http://www.youtube.com/watch?v=uhDM4fcI2aI


2
这是什么“新SQL”和“旧SQL”?您想澄清一下吗?
ypercubeᵀᴹ

1
“旧SQL”将是SQL Server,Oracle,MySQL,PostgreSQL等。这是Wikipedia对NewSQL的定义,它的定义非常好:“ NewSQL是一类现代的关系数据库管理系统,旨在提供与NoSQL相同的可扩展性能。用于OLTP工作负载的系统,同时仍保持传统单节点数据库系统的ACID保证。” 如果有兴趣了解更多信息,我强烈推荐我发布的视频。
geoffrobinson

作为此处的注释,正如我在回答中解释的那样,VoltDB通过定义持久性和并发性来处理可伸缩性。本质上,使用VoltDB,您无法获得系统内的持久性,也无法同时访问数据。新的SQL就像一辆Indie 500赛车,但旧的SQL仍然是半卡车或货车的引擎。
克里斯·特拉弗斯

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.