我遇到过许多NoSQL数据库和SQL数据库。有各种参数可以衡量这些数据库的优缺点,而可伸缩性就是其中之一。水平和垂直缩放这些数据库有什么区别?
我遇到过许多NoSQL数据库和SQL数据库。有各种参数可以衡量这些数据库的优缺点,而可伸缩性就是其中之一。水平和垂直缩放这些数据库有什么区别?
Answers:
水平扩展意味着通过向资源池中添加更多计算机来进行扩展,而垂直扩展意味着通过向现有计算机中添加更多的电源(CPU,RAM)来进行扩展。
记住这一点的一种简单方法是考虑服务器机架上的计算机,我们在水平方向上添加了更多计算机,在垂直方向上添加了更多资源。
在数据库世界中,水平扩展通常基于数据的分区,即每个节点仅包含部分数据,在垂直扩展中,数据驻留在单个节点上,并且扩展是通过多核完成的,即在该计算机的CPU和RAM资源。
使用水平扩展时,通常可以通过在现有池中添加更多计算机来动态扩展,这很容易-垂直扩展通常限于单台计算机的容量,超出该容量的扩展通常会涉及停机时间,并且存在上限。
水平扩展的好示例是Cassandra,MongoDB,Google Cloud Spanner ..,垂直扩展的好示例是MySQL-Amazon RDS(MySQL的云版本)。通过从小型机器切换到大型机器,它提供了一种垂直扩展的简便方法。此过程通常涉及停机时间。
内存数据网格(例如GigaSpaces XAP,Coherence等)通常仅由于未绑定到磁盘而针对水平和垂直缩放进行了优化。通过分区进行水平扩展,并通过多核支持进行垂直扩展。
您可以在我的早期文章中阅读有关此主题的更多信息: 横向扩展与纵向扩展以及NOSQL替代方案背后的通用原则
让我们从扩展资源的需求开始,这样您的系统现在可以处理比以前更多的请求。
当您发现系统变慢并且无法处理当前请求数时,您需要扩展系统。
这为您提供了两种选择。您可以增加当前正在使用的服务器中的资源,即增加RAM,CPU,GPU和其他资源的数量。这称为垂直缩放。
垂直缩放通常很昂贵。它不会使系统具有容错能力,即,如果要扩展使用单个服务器运行的应用程序,则如果该服务器发生故障,则系统将发生故障。同样,线程数量在垂直缩放中保持不变。垂直扩展可能会要求您的系统在发生过程时暂时中断。服务器上资源的增加需要重新启动,并使系统停机。
解决此问题的另一种方法是增加系统中存在的服务器数量。该解决方案在技术行业中得到了广泛使用。这最终将降低每个服务器中每秒请求的速率。如果需要扩展系统,只需添加另一台服务器即可。您不需要重新启动系统。每个系统中的线程数减少,从而导致高吞吐量。为了将请求均等地隔离到每个应用程序服务器,您需要添加负载均衡器,该负载均衡器将充当Web服务器的反向代理。整个系统可以称为单个集群。您的系统可能包含大量请求,这将需要更多这样的集群。
希望您了解将缩放引入系统的整个概念。
没有提到的其他架构是基于SQL的数据库服务,它可以实现水平扩展,而无需手动分片。这些服务在后台进行分片,因此它们使您能够运行传统的SQL数据库并像使用MongoDB或CouchDB这样的NoSQL引擎进行扩展。我熟悉的两个服务是PostgreSQL的EnterpriseDB和MySQL的Xeround。我看过Xeround的一篇深入的文章,其中解释了为何难以扩展SQL数据库以及它们如何以不同的方式进行处理-因为这是供应商的文章,所以要一针见血。另请查阅Wikipedia的Cloud Database条目,其中有SQL,NoSQL和服务与自托管的很好的解释,每种组合的供应商列表和扩展选项。;)
是的,水平扩展意味着增加更多的计算机,但这也意味着集群中的计算机是相等的。MySQL可以通过使用副本在读取数据方面进行横向扩展,但是一旦达到服务器内存/磁盘的容量,就必须开始在服务器之间分片数据。这变得越来越复杂。由于复制速度通常太慢而无法跟上数据更改速度,因此经常使副本之间的数据保持一致是一个问题。
Couchbase还是一个出色的NoSQL Horizontal Scaling数据库,用于许多商业高可用性应用程序和游戏中,并且可以说是同类产品中性能最高的。它可以跨集群自动对数据进行分区,添加节点非常简单,并且您可以使用商品硬件,更便宜的vm实例(例如,在AWS上使用Large而不是High Mem,High Disk计算机)。它基于Membase(Memcached)构建,但是增加了持久性。同样,对于Couchbase,每个节点都可以执行读写操作,并且在群集中是平等的,仅使用故障转移复制即可(不像mySQL那样跨所有服务器进行完整的数据集复制)。
在性能方面,您可以看到出色的Cisco基准测试: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的更多信息,请阅读其技术白皮书。
添加大量负载平衡器会产生额外的开销和延迟,这是在nosql数据库中横向扩展的缺点。这就像一个问题,为什么人们不建议使用RPC,因为它不可靠。
我认为在实际系统中,我们应该同时使用sql和nosql数据库来利用当今系统的多核和云计算功能。
另一方面,如果使用oracle等sql数据库,则复杂的事务查询具有较高的性能。通过分片,NoSql可用于大数据和水平可伸缩性。
公认的答案是关于水平缩放与垂直缩放的基本定义。但是,与通常的看法不同,即只能通过Cassandra,MongoDB等来实现数据库的水平扩展,我想补充一下,对于任何传统的RDMS,也可以进行水平扩展。也无需使用任何第三方解决方案。
我知道许多公司,特别是基于SaaS的公司都在这样做。使用简单的应用程序逻辑即可完成。基本上,您需要一组用户,并将他们划分到多个数据库服务器上。因此,例如,您通常会有一个“元”数据库/表,用于存储客户端,DB服务器/连接字符串等,以及一个表,用于存储客户端/服务器映射。
然后,将每个客户端的请求直接定向到它们所映射到的DB服务器。
现在有人可能说这类似于水平分区,而不是“真正的”水平缩放,并且它们在某些方面是正确的。但是最终结果是您已经在多个Db服务器上扩展了数据库。
两种水平扩展方法之间的唯一区别是,一种方法(MongoDB等)的扩展是由DB软件本身完成的。从这个意义上讲,您正在“购买”缩放比例。在另一种方法中(对于RDBMS水平缩放),缩放由应用程序代码/逻辑构建。