我遇到过许多非关系型数据库和SQL数据库。有不同的参数来衡量这些数据库的优缺点,可伸缩性就是其中之一。水平扩展和垂直扩展这些数据库有什么区别?
水平缩放意味着您通过添加更多机器来缩放进入你的资源池,而垂直扩展意味着您通过向现有机器添加更多功率(CPU、RAM)来扩展。
记住这一点的一个简单方法是考虑服务器机架上的机器,我们在水平方向添加更多机器,并在垂直方向向机器添加更多资源。
在数据库世界中,水平扩展通常基于数据的分区,即每个节点仅包含部分数据,在垂直扩展中,数据驻留在单个节点上,而扩展是通过多核完成的,即在该机器的CPU和RAM资源之间分配负载。
通过水平扩展,通常更容易通过向现有池中添加更多机器来动态扩展-垂直扩展通常仅限于单个机器的容量,超出该容量的扩展通常涉及停机时间并有上限。
水平扩容的好例子是Cassandra、MongoDB、Google Cloud Spanner…垂直扩容的好例子是MySQL-Amazon RDS(MySQL的云版本)。它提供了一种通过从小型机器切换到大型机器来垂直扩展的简单方法。这个过程通常涉及停机时间。
内存中的数据网格(如千兆空间XAP、一致性等)通常针对水平和垂直扩容进行了优化,因为它们没有绑定到磁盘。通过分区进行水平缩放,通过多核支持进行垂直缩放。
你可以在我以前的文章中阅读更多关于这个主题的内容:横向扩展vs横向扩展和NOSQL替代方案背后的共同原则
是的,水平扩展意味着添加更多的机器,但这也意味着机器在集群中是平等的。MySQL可以通过使用副本在读取数据方面水平扩展,但是一旦它达到服务器内存/磁盘的容量,你就必须开始跨服务器分片数据。这变得越来越复杂。通常在副本之间保持数据一致是一个问题,因为复制速率通常太慢,跟不上数据变化速率。
Couchbase也是一个很棒的非关系型数据库水平缩放数据库,用于许多商业高可用性应用程序和游戏,可以说是该类别中性能最高的数据库。它在集群中自动分区数据,添加节点很简单,你可以使用商品硬件、更便宜的虚拟机实例(例如,在AWS上使用大型而不是High Mem、High Disk机器)。它基于Membase(Memcach)构建,但增加了持久性。此外,在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
还有一个没有提到的附加架构——基于SQL的数据库服务,它可以实现水平扩容,而无需手动分片的复杂性。这些服务在后台进行分片,因此它们使您能够运行传统的SQL数据库和横向扩展,就像使用MongoDB或CouchDB等非关系型数据库引擎一样。我熟悉的两个服务是PostgreSQL的企业数据库和MySQL的Xeround。我看到了Xeround的深入帖子,它解释了为什么SQL数据库的横向扩展很困难以及它们如何以不同的方式进行-将其视为供应商职位。还可以查看维基百科的云数据库条目,有一个关于SQLvs.非关系型数据库和服务vs.自托管的很好的解释,每个组合的供应商列表和扩展选项。;)
传统的关系数据库被设计为客户端/服务器数据库系统。它们可以横向扩展,但这样做的过程往往很复杂且容易出错。像NuoDB这样的NewSQL数据库是以内存为中心的分布式数据库系统,旨在横向扩展,同时保持传统RDBMS的SQL /ACID属性。
有关NuoDB的更多信息,请阅读其技术白皮书。
SQL像Oracle这样的数据库,db2也支持通过共享磁盘集群进行水平扩容。例如Oracle RAC,IBMDB2 puresale或赛贝斯ASE Cluster版本。可以向Oracle RAC系统或DB2 puresale系统添加新节点以实现水平扩容。
但这种方法与noSQL数据库(如mongoDB、CouchDB或IBMCloudant)的不同之处在于数据分片不是水平扩容的一部分。在noSQL数据库中,数据在水平扩容期间被粉碎。
让我们从增加资源的扩展需求开始,以便您的系统现在可以处理比以前更多的请求。
当您意识到系统变得越来越慢并且无法处理当前数量的请求时,您需要扩展系统。
这为您提供了两种选择。要么增加当前使用的服务器中的资源,即增加RAM、CPU、GPU和其他资源的数量。这称为垂直扩容。
垂直缩放通常是昂贵的。它不会使系统容错,即如果您正在扩展使用单个服务器运行的应用程序,如果该服务器出现故障,您的系统将出现故障。在垂直扩容中,线程的数量也保持不变。垂直缩放可能需要您的系统在进程发生时停机片刻。增加服务器上的资源需要重新启动并关闭系统。
这个问题的另一个解决方案是增加系统中存在的服务器数量。这个解决方案在科技行业被高度使用。这最终会降低每个服务器中的每秒请求率。如果您需要扩展系统,只需添加另一个服务器,您就完成了。您不需要重新启动系统。每个系统中的线程数减少,导致高吞吐量。为了将请求平均隔离到每个应用程序服务器,您需要添加负载均衡器,它将充当Web服务器的反向代理。整个系统可以称为单个集群。您的系统可能包含大量请求,需要更多这样的集群。
希望您了解将缩放引入系统的整个概念。
添加大量负载均衡器会产生额外的开销和延迟,这是在nosql数据库中横向扩展的缺点。这就像为什么人们说RPC不推荐的问题,因为它不健壮。
我认为在一个真实的系统中,我们应该同时使用sql和nosql数据库来利用当今系统的多核和云计算能力。
另一方面,如果使用Oracle等sql数据库,复杂的事务查询具有高性能。NoSql可以通过分片用于大数据和水平可扩展性。
水平缩放===>成千上万的奴才会为你一起工作。
垂直缩放===>一个大绿巨人会为你做所有的工作。
公认的答案是水平扩容与垂直扩容的基本定义。但与通常认为数据库的水平扩容只能通过Cassandra、MongoDB等实现不同,我想补充一点,任何传统的RDMS也非常可能实现水平扩容;这也不需要使用任何第三方解决方案。
我知道很多公司,特别是基于SaaS的公司都这样做。这是使用简单的应用程序逻辑完成的。你基本上需要一组用户并将它们划分在多个数据库服务器上。因此,例如,您通常会有一个“元”数据库/表来存储客户端、数据库服务器/连接字符串等,以及一个存储客户端/服务器映射的表。
然后只需将来自每个客户端的请求定向到它们映射到的数据库服务器。
现在有些人可能会说这类似于水平分区而不是“真正的”水平扩容,他们在某些方面是正确的。但最终结果是您已经在多个数据库服务器上扩展了数据库。
两种水平扩容方法之间的唯一区别是,一种方法(MongoDB等)的缩放是由数据库软件本身完成的。从这个意义上说,你是在“购买”缩放。在另一种方法(对于RDBMS水平扩容)中,缩放是由应用程序代码/逻辑构建的。
你有一家公司,只有1名员工,但你有1个新项目,当时你雇佣了新的候选人-这是水平扩容.其中新候选人是新机器,项目是新的流量/调用到你的api。
与IIT/NIT人员一起处理对您的api/流量的所有请求的1个项目。如果任何时候对您的api的请求更多,那么解雇他并用高IQ NIT/IIT人员替换他-这是垂直扩容。