数据库水平和垂直缩放之间的差异

Difference between scaling horizontally and vertically for databases

我遇到了许多NoSQL数据库和SQL数据库。有不同的参数来衡量这些数据库的强弱,可伸缩性就是其中之一。水平和垂直缩放这些数据库有什么区别?


水平缩放意味着通过向资源池中添加更多的计算机来进行缩放,而垂直缩放意味着通过向现有计算机添加更多的电源(CPU、RAM)来进行缩放。

记住这一点的一个简单方法是考虑服务器机架上的机器,我们在水平方向上添加更多的机器,在垂直方向上向机器添加更多的资源。

&Horizontal Scaling/Vertical Scaling Visualisation

在数据库世界中,水平缩放通常基于数据的分区,即每个节点只包含部分数据;在垂直缩放中,数据驻留在单个节点上,并通过多核进行缩放,即在该计算机的CPU和RAM资源之间分配负载。

对于水平缩放,通过向现有池中添加更多的计算机来动态缩放通常更容易——垂直缩放通常仅限于一台计算机的容量,超出该容量的缩放通常涉及停机时间并带有上限。

水平缩放的好例子是cassandra、mongodb、google cloud spanner.。垂直扩展的一个好例子是mysql-amazon rds(mysql的云版本)。它提供了一种简单的垂直缩放方法,可以从小型机器切换到大型机器。这个过程通常涉及到停机时间。

内存中的数据网格,如gigaspaces-xap、coherence等。通常针对水平和垂直缩放进行优化,因为它们不绑定到磁盘。通过分区进行水平缩放,通过多核支持进行垂直缩放。

你可以在我之前的文章中阅读更多关于这个主题的内容:横向扩展与横向扩展以及NoSQL备选方案背后的共同原则


简单来说:

横向缩放==>成千上万的小矮人将一起为你工作。

垂直缩放==>一个大绿巨人将为您做所有的工作。


让我们从增加资源的扩展需求开始,这样您的系统现在可以处理比以前更多的请求。

当你意识到你的系统正在变慢,无法处理当前的请求数量时,你需要调整系统的规模。

这为您提供了两个选项。要么增加当前使用的服务器中的资源,即增加RAM、CPU、GPU和其他资源的数量。这就是所谓的垂直缩放。

垂直缩放通常成本高昂。它不能使系统容错,例如,如果您在扩展使用单服务器运行的应用程序,如果该服务器停机,系统将停机。此外,线程的数量在垂直缩放中保持不变。垂直缩放可能需要您的系统在进程发生时暂时下降。增加服务器上的资源需要重新启动并关闭系统。

此问题的另一个解决方案是增加系统中存在的服务器数量。此解决方案在技术行业中应用广泛。这最终会降低每台服务器中每秒请求的速率。如果需要扩展系统,只需添加另一个服务器,就可以完成。您无需重新启动系统。每个系统中的线程数减少,从而导致高吞吐量。要将请求平均地分离到每个应用服务器,您需要添加负载均衡器,它将充当Web服务器的反向代理。整个系统可以称为单个集群。您的系统可能包含大量的请求,这些请求需要更多这样的集群。

希望您能理解将伸缩性引入系统的整个概念。


还有一个没有提到的附加体系结构——基于SQL的数据库服务,可以在不复杂的手动切分的情况下实现水平扩展。这些服务在后台进行切分,因此它们使您能够运行传统的SQL数据库,并像使用MongoDB或CouchDB这样的NoSQL引擎那样进行扩展。我熟悉的两个服务是EnterpriseDB for PostgreSQL和Xeround for MySQL。我看到了Xeround的一篇深入的文章,解释了为什么在SQL数据库上进行扩展比较困难,以及它们如何以不同的方式进行扩展——用一点盐来对待这个问题,就像对待一个供应商一样。另外,看看维基百科的云数据库条目,这里有一个关于SQL与NoSQL和服务与自托管的很好的解释,一个供应商列表和每个组合的缩放选项。;)


是的,水平缩放意味着添加更多的机器,但也意味着集群中的机器是相等的。MySQL可以通过使用副本在读取数据方面进行横向扩展,但一旦达到服务器内存/磁盘的容量,就必须开始在服务器之间共享数据。这变得越来越复杂。通常,跨复制副本保持数据一致是一个问题,因为复制速度通常太慢,无法跟上数据更改速度。

CouchBase也是一个出色的NoSQL横向扩展数据库,用于许多商业化的高可用性应用程序和游戏中,可以说是该类别中性能最高的。它自动跨集群分区数据,添加节点很简单,您可以使用商品硬件、更便宜的虚拟机实例(例如,使用大型而不是高内存、AWS的高磁盘机)。它是基于membase(memcached)构建的,但增加了持久性。此外,在couchbase的情况下,每个节点都可以进行读写,并且在集群中是相等的,只进行故障转移复制(而不是跨所有服务器(如mysql)进行完整的数据集复制)。

性能方面,您可以看到一个出色的思科基准:http://blog.couchbase.com/understanding-performance-benchmark-published-cisco-and-solarflare-using-couchbase-server

下面是一篇关于CouchBase架构的伟大博客文章:http://horicky.blogspot.com/2012/07/couchbase-architecture.html


传统的关系数据库被设计成客户机/服务器数据库系统。它们可以水平缩放,但这样做的过程往往很复杂,而且容易出错。像nuodb这样的newsql数据库是以内存为中心的分布式数据库系统,旨在横向扩展,同时保持传统RDBMS的SQL/ACID属性。

有关Nuodb的更多信息,请阅读其技术白皮书。


像Oracle、DB2这样的SQL数据库也支持通过共享磁盘集群进行横向扩展。例如OracleRAC、IBMDB2pureScale或SybaseASE集群版。可以将新节点添加到OracleRAC系统或DB2pureScale系统中,以实现水平伸缩。

但是这种方法不同于NoSQL数据库(如MongoDB、CouchDB或IBMCloudant),因为数据分片不是水平扩展的一部分。在NoSQL数据库中,数据在水平缩放期间被压缩。


所有其他的答案似乎都已经很完整了,但我并没有把谷歌云扳手看作是一个水平伸缩关系数据库的例子,这就是为什么我要增加我的一点贡献。


添加大量的负载平衡器会产生额外的开销和延迟,这是在NoSQL数据库中横向扩展的缺点。这就像人们为什么说RPC不被推荐的问题,因为它不健壮。

我认为在一个真正的系统中,我们应该同时使用SQL和NoSQL数据库来利用当今系统的多核和云计算能力。

另一方面,如果使用诸如Oracle之类的SQL数据库,那么复杂的事务查询具有很高的性能。NoSQL可以通过分片实现大数据和水平扩展。