我遇到过很多 NoSQL 数据库和 SQL 数据库。有不同的参数来衡量这些数据库的优势和劣势,可扩展性就是其中之一。水平和垂直扩展这些数据库有什么区别?
10 回答
水平扩展意味着您通过在资源池中添加更多机器来扩展,而垂直扩展意味着您通过向现有机器添加更多功率(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 引擎一样进行横向扩展。我熟悉的两个服务是EnterpriseDB for PostgreSQL 和Xeround for MySQL。我看到了Xeround 的一篇深入文章,它解释了为什么在 SQL 数据库上横向扩展很困难,以及它们如何以不同的方式进行扩展——因为它是供应商的文章,所以对此持保留态度。还可以查看维基百科的云数据库条目,有一个很好的解释 SQL 与 NoSQL 和服务与自托管,每个组合的供应商列表和扩展选项。;)
是的,水平扩展意味着添加更多机器,但这也意味着机器在集群中是相等的。MySQL 可以通过使用副本在读取数据方面水平扩展,但是一旦达到服务器内存/磁盘的容量,您就必须开始跨服务器分片数据。这变得越来越复杂。通常在副本之间保持数据一致是一个问题,因为复制率通常太慢而无法跟上数据更改率。
Couchbase 也是一个出色的 NoSQL 水平扩展数据库,用于许多商业高可用性应用程序和游戏,并且可以说是该类别中性能最高的。它在集群中自动对数据进行分区,添加节点很简单,并且您可以使用商品硬件、更便宜的虚拟机实例(例如使用大型而不是高内存、AWS 的高磁盘机器)。它基于 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 的更多信息,请阅读他们的技术白皮书。
Oracle、db2 等 SQL 数据库也支持通过共享磁盘集群进行水平扩展。例如 Oracle RAC、IBM DB2 purescale 或 Sybase ASE Cluster 版本。可以将新节点添加到 Oracle RAC 系统或 DB2 purescale 系统中,以实现水平扩展。
但该方法与 noSQL 数据库(如 mongodb、CouchDB 或 IBM Cloudant)的不同之处在于数据分片不是水平扩展的一部分。在 noSQL 数据库中,数据在水平缩放期间被分片。
公认的答案是水平与垂直缩放的基本定义。但与通常认为只有 Cassandra、MongoDB 等才能实现数据库水平扩展的普遍看法不同,我想补充一点,任何传统 RDMS 也可以实现水平扩展。这也是不使用任何第三方解决方案。
我知道很多公司,特别是基于 SaaS 的公司。这是使用简单的应用程序逻辑完成的。您基本上采用一组用户并将他们划分到多个数据库服务器上。例如,您通常会有一个“元”数据库/表来存储客户端、数据库服务器/连接字符串等,以及一个存储客户端/服务器映射的表。
然后只需将来自每个客户端的请求定向到它们映射到的数据库服务器。
现在有些人可能会说这类似于水平分区,而不是“真正的”水平缩放,它们在某些方面是正确的。但最终结果是您已经在多个数据库服务器上扩展了您的数据库。
两种水平扩展方法之间的唯一区别是一种方法(MongoDB 等)的扩展是由数据库软件本身完成的。从这个意义上说,您正在“购买”缩放。在另一种方法中(对于 RDBMS 水平缩放),缩放是由应用程序代码/逻辑构建的。
添加大量负载均衡器会产生额外的开销和延迟,这是在 nosql 数据库中横向扩展的缺点。这就像人们说不推荐使用 RPC 的问题,因为它不健壮。
我认为在实际系统中,我们应该同时使用 sql 和 nosql 数据库来利用当今系统的多核和云计算能力。
另一方面,如果使用 sql 数据库(如 oracle),则复杂的事务查询具有较高的性能。NoSql 可以通过分片用于大数据和水平可扩展性。
你有一家公司,只有 1 名工人,但当时你有 1 个新项目,你雇佣了新的候选人——这就是横向扩展。其中新候选人是新机器,项目是对您的 api 的新流量/调用。
作为 1 个项目,由 IIT/NIT 人员处理对您的 api/traffic 的所有请求。如果对您的 api 有更多请求,请解雇他并用高智商 NIT/IIT 人员代替他——这是垂直扩展。