Lon*_*guy 638 database database-design scalability nosql
我遇到过许多NoSQL数据库和SQL数据库.有各种参数来衡量这些数据库的优缺点,可扩展性就是其中之一.水平和垂直缩放这些数据库有什么区别?
小智 1162
水平扩展意味着您可以通过向资源池中添加更多计算机来扩展,而垂直扩展意味着您可以通过向现有计算机添加更多电量(CPU,RAM)来扩展.
记住这一点的一个简单方法是考虑服务器机架上的机器,我们在水平方向上添加更多机器,并在垂直方向上为机器添加更多资源.
在数据库世界中,水平扩展通常基于数据的划分,即每个节点仅包含部分数据,在垂直扩展中,数据驻留在单个节点上,并且通过多核进行扩展,即在两者之间扩展负载.该机器的CPU和RAM资源.
通过水平扩展,通过在现有池中添加更多计算机来动态扩展通常更容易 - 垂直扩展通常仅限于单个计算机的容量,超出该容量的扩展通常涉及停机时间并且具有上限.
水平扩展的好例子是Cassandra,MongoDB,Google Cloud Spanner ..而垂直扩展的一个很好的例子是MySQL - Amazon RDS(MySQL的云版本).通过从小型机器切换到更大型机器,它提供了一种简单的垂直扩展方式.此过程通常涉及停机时间.
内存数据网格,如GigaSpaces XAP,Coherence等,通常只针对水平和垂直缩放进行了优化,因为它们没有绑定到磁盘上.通过多核支持进行分区和垂直缩放的水平扩展.
您可以在我之前的帖子中阅读有关此主题的更多信息: 横向扩展与扩展以及NOSQL替代方案背后的共同原则
yat*_*tha 17
让我们从增加资源的扩展需求开始,这样您的系统现在可以处理比以前更多的请求.
当您意识到系统变慢并且无法处理当前请求数时,您需要扩展系统.
这为您提供了两个选项.您可以增加当前使用的服务器中的资源,即增加RAM,CPU,GPU和其他资源的数量.这称为垂直缩放.
垂直缩放通常很昂贵.它不会使系统容错,即如果您正在使用单个服务器扩展应用程序,如果该服务器出现故障,您的系统将会关闭.此外,垂直缩放中的线程数量保持不变.垂直缩放可能需要系统在进程发生时停止工作.增加服务器上的资源需要重新启动并关闭系统.
此问题的另一个解决方案是增加系统中存在的服务器数量.该解决方案在科技行业中得到了广泛应用.这最终会降低每台服务器的每秒请求速率.如果您需要扩展系统,只需添加另一台服务器,即可完成.您不需要重新启动系统.每个系统中的线程数减少,从而导致高吞吐量.要将请求平均分配给每个应用程序服务器,您需要添加负载均衡器,它将充当Web服务器的反向代理.整个系统可以称为单个集群.您的系统可能包含大量请求,这些请求需要更多此类群集.
希望您获得将缩放引入系统的整个概念.
小智 9
还有一个未提及的额外体系结构 - 基于SQL的数据库服务,可实现水平扩展,而无需手动分片的复杂性.这些服务在后台进行分片,因此它们使您能够像使用MongoDB或CouchDB等NoSQL引擎一样运行传统的SQL数据库并进行扩展.我熟悉的两个服务是用于PostgreSQL的EnterpriseDB和用于MySQL的Xeround.我看到了Xeround的一篇深度帖子,它解释了为什么SQL数据库的横向扩展很难以及他们如何以不同的方式做到这一点 - 因为它是一个供应商帖子,所以要处理这个问题.另请查看维基百科的云数据库条目,有一个很好的解释SQL与NoSQL和服务与自托管,供应商列表和每个组合的扩展选项.;)
是水平缩放意味着添加更多机器,但这也意味着群集中的机器相同.MySQL可以通过使用副本在读取数据方面进行水平扩展,但是一旦达到服务器内存/磁盘的容量,就必须开始跨服务器分片数据.这变得越来越复杂.通常在副本之间保持数据一致是一个问题,因为复制速率通常太慢而无法跟上数据变化率.
Couchbase也是一个出色的NoSQL Horizontal Scaling数据库,用于许多商业高可用性应用程序和游戏,可以说是该类别中性能最高的.它跨群集自动分区数据,添加节点很简单,您可以使用商用硬件,更便宜的虚拟机实例(例如,使用大而不是高内存,高级硬盘机器).它是根据Membase(Memcached)构建的,但增加了持久性.此外,在Couchbase的情况下,每个节点都可以执行读取和写入,并且在集群中是相同的,只有故障转移复制(不是像mySQL中的所有服务器上的完整数据集复制).
在性能方面,您可以看到一个优秀的思科基准:http://blog.couchbase.com/understanding-performance-benchmark-published-cisco-and-solarflare-using-couchbase-server
这是一篇关于Couchbase Architecture的精彩博文:http://horicky.blogspot.com/2012/07/couchbase-architecture.html
小智 5
Oracle,db2等SQL数据库也支持通过共享磁盘集群进行水平扩展.例如Oracle RAC,IBM DB2 purescale或Sybase ASE Cluster edition.可以将新节点添加到Oracle RAC系统或DB2 purescale系统以实现水平扩展.
但该方法与noSQL数据库(如mongodb,CouchDB或IBM Cloudant)的不同之处在于数据分片不是水平扩展的一部分.在noSQL数据库中,数据在水平扩展期间被擦除.
公认的答案是水平与垂直缩放的基本定义。但与人们普遍认为数据库的水平扩展只能通过 Cassandra、MongoDB 等实现不同,我想补充一点,任何传统的 RDMS 也都可以实现水平扩展;这也无需使用任何第三方解决方案。
我知道很多公司都这样做,特别是基于 SaaS 的公司。这是使用简单的应用程序逻辑完成的。您基本上将一组用户划分到多个数据库服务器上。例如,您通常会有一个“元”数据库/表来存储客户端、数据库服务器/连接字符串等,以及一个存储客户端/服务器映射的表。
然后,只需将来自每个客户端的请求定向到它们映射到的数据库服务器即可。
现在有些人可能会说这类似于水平分区,而不是“真正的”水平缩放,他们在某些方面是正确的。但最终结果是您已将数据库扩展至多个数据库服务器。
两种水平扩展方法之间的唯一区别在于,一种方法(MongoDB 等)的扩展是由数据库软件本身完成的。从这个意义上说,你是在“购买”缩放。在另一种方法中(对于 RDBMS 水平扩展),扩展是由应用程序代码/逻辑构建的。