`
冰糖葫芦
  • 浏览: 297867 次
社区版块
存档分类
最新评论

理解水平扩展和垂直扩展

阅读更多

当一个开发人员提升计算机系统负荷时,通常会考虑两种方式垂直扩展和水平扩展。选用哪种策略主要依赖于要解决的问题以及系统资源的限制。在这篇文章中我们将讲述这两种策略并讨论每种策越的优缺点。如果你已经有一个软件系统需要不断成长,那么你将有意或者无意中选择这两种策略中的一种。

垂直扩展

在垂直扩展模型中,想要增加系统负荷就意味着要在系统现有的部件上下工夫,即通过提高系统部件的能力来实现。例如,假设你现在负责一批木材采伐的操作。

在这个例子中,我们假设有3辆卡车,每辆车一次可以运25根木材,计算花费1小时的情况下可以运送到指定地点等待处理的木材数量。通过这些数字我们可以算出我们系统最大的负荷量:

3辆卡车 * 25根木材 * 1小时=75根木材/小时

如果我们选择垂直扩展模型,那么我们将怎么做来使我们每小时可以处理150根木材?我们需要至少做以下两件事中的一件:

使每辆卡车的运输量增加一倍(50棵树每小时),或者使每辆卡车的运输时间减半(每辆卡车30分钟)。

3辆卡车 * 50棵树 * 1小时 = 150棵树/每小时

或者

3辆卡车 * 25棵树 * 30分钟 = 150棵树/每小时

我们没有增加系统的成员数,但是我们通过增加系统成员的生产效率来获得期望的负荷量。

水平扩展

在水平扩展模型中,我们不是通过增加单个系统成员的负荷而是简单的通过增加更多的系统成员来实现。也就是说,在以上运送木材的例子中,通过增加卡车的数量来运送木材。因此,当我们需要将负荷从75棵树每小时增加到150棵树每小时,那么只需要增加3辆卡车。

6辆卡车 * 25棵树 * 1小时 = 150棵树/每小时

假如我们已经选择了垂直扩展方式,那么我们想要每小时处理150棵被砍伐的树时需要怎么做呢?我们需要做到以下两方面之一:要么使每辆卡车的运输量翻倍(50棵木材一次),要么使每辆开车的运输时间减半(30分钟)。

3辆卡车 * 50棵树 * 1小时 = 150棵树/每小时

或者

3辆卡车 * 50棵树 * 30分钟 = 150棵树/每小时

在这个例子中,系统每个成员的生产力依然没变,我们通过增加更多的卡车来提高系统的能力。

扩展你的web数据库

通过对水平扩展和垂直扩展的基本了解,下面让我们来关注web系统的扩展。一个网站通常有很多组件都需要去考虑它们的扩展性,但是我通常喜欢关注处在最边缘的一个:数据库。为什么数据库是最边缘的?因为数据库通常是共享资源,是几乎所有请求最终的连接点。

你的系统是什么类型的?

在扩展你的数据库时,你必须要问的一个重要问题是:“我所面对的系统是什么类型的?”你所面对的是一个读操作多还是写操作多的系统?读操作多的网站一般包括:在线商城,在商城里用户大部时间是在浏览(读操作),只有少数时间在付款(写操作)、或者博客,在博客上人们大部分时间是在浏览博文(读操作),只有少数时间是在评论或者发表博文(写操作)。相反的,关于写操作非常多的很好的例子包括:信用卡交易处理器,这个系统的主要负载时在处理记录交易(写操作),偶尔会查找交易(读操作)、或者Google分析,主要工作实在记录业务数据(写操作),偶尔会展示分析图(读操作)。

了解你所创建的网站是什么类型的,可以在网站成长过程中帮助你选择正确的技术。

读操作扩展

如果你的系统读操作非常多,那么通过关系型数据库如mysql或者PostgreSql来垂直扩展数据存储是一个不错的选择。结合你的关系型数据库通过使用memcached或者CDN来构建一个健壮的缓存系统,那么你的系统将非常容易扩展。在这种模式中,如果数据库超负荷运行,那么将更多的数据放入缓存中来缓解系统的读压力。当没有更多的数据往缓存中放时,可以更换更快的数据存储硬件或者买更多核的处理器来获取更多的运行通道。摩尔定律使通过这种方法来垂直扩展变得和购买更好的硬件一样简单。

写操作扩展

如果你的系统写操作非常多,那么你可能更希望考虑使用可水平扩展的数据存储方式,比如Riak,Cassandra或者HBase。和大多数关系型数据管理系统不同,这种数据存储随着增长增加更多的节点。由于你的系统大部分时间是在写入,所以缓存曾并不能像在读操作比较频繁的系统中起到那么大作用。很多写频繁的系统一开始使用垂直扩展的方式,但是很快发现并不能根本解决问题。为什么?因为硬盘数和处理器数在某一点达到平衡,在这个边界上再增加一个处理器或者一个硬盘都会是每秒钟的I/O操作数成指数性增长。相反,如果对写频繁的系统采取水平扩展策略,那么你将达到一个拐点,在这个拐点之后如果在增加一个节点都远比使用更多的硬盘来的实惠。

其他注意事项

另一件事需要记住的是每种扩展策略下预想不到的开销。采用垂直扩展的系统将开销凡在单独的组件上。当我们去提升系统负荷时,这些单独的组件需要在管理上花费更多。拿我们运送木材的例子来说,如果需要使每辆卡车的货运量翻倍,那么我们需要更宽、更长、或者更高的车厢。也许有的路因为桥的高度对车辆高度有要求,或者基于巷子宽度车宽不能太大,又或者由于机动车安全驾驶要求车厢不能太长。这里的限制就是对单个卡车做垂直扩展做的什么程度。同样的概念延伸到服务器垂直扩展:更多的处理器要求更多的空间,进而要求更多的服务器存储架。

相反的,采用水平扩展的系统将额外的开销放在系统中连接起来的共享组件上。当我们去提升系统负荷时,共享的开销和新增加的成员之间的协调性有关。在我们运送木材的例子中,当我们在路上增加更多卡车时,那么路就是共享资源也就成了约束条件。这条路上适合同时跑多少量卡车?我们是否有足够的安全缓冲区使得所有的车可以同时装运木材?如果再来看我们水平扩展的数据库系统,那么经常被忽略的开销就是服务器同时连接时的网络开销(译者注:网络为各个系统的共享资源)。当你为系统增加更多的节点时,共享资源的负荷也就越来越重,通常呈非线性改变。

综合说明

和计算机的大多数东西一样,好的解决办法通常并不像我这里列出来的这么简单。而我在这里尝试简化这种思想用来来说明这中概念而不是讲具体的解决办法。扩展是个困难的问题,这是个需要在实际处理的每个步骤中都要思考的问题。扩展策略没有魔法,也没有魔法般的软件帮你建立一个完整可靠的可扩展系统。就像扩展中的其他问题一样,一个大的解决方案通常是由很多个一起协调工作的小的解决办法组成的。这需对每一个中解决方案进行精心正确的设计和开发。 

 

 

1. 本文由程序员学架构译,mathew校审

2. 本文译自http://blakesmith.me/2012/12/08/understanding-horizontal-and-vertical-scaling.html

3. 转载请务必注明本文出自程序员学架构(微信号:archleaner )

4. 更多文章请扫码:

1
0
分享到:
评论

相关推荐

    listctrl_kivylistctry水平扩展_thoughnnn_kivy_listctrl_zip_

    总的来说,实现Kivy ListCtrl的水平扩展需要深入理解Kivy的布局系统、渲染机制和事件处理。这是一个涉及多方面知识的任务,但它可以提供更灵活的用户界面,特别是在处理宽表数据时。通过以上步骤,我们可以创建一个...

    MATLAB实现图像的几何变换(包含水平镜像、垂直错切、旋转和加倍)

    附带的图像文件,如`旋转.png`、`加倍.png`、`水平镜像.png`和`垂直错切.png`,是经过这些变换处理后的示例结果,可以帮助理解每种变换的实际效果。通过查看这些图片,我们可以直观地看到MATLAB代码如何改变了原始...

    基于mybatis框架,数据库垂直、水平拆分及读写分离实现

    总结来说,基于MyBatis的数据库拆分和读写分离实现,涉及到对MyBatis框架的深入理解和扩展,包括对SqlSessionTemplate的改造、数据库拆分策略的设计(如垂直拆分和水平拆分的一致性哈希)、以及读写分离的路由机制。...

    腐蚀与膨胀 水平腐蚀 垂直腐蚀 全方位腐蚀 水平膨胀处理 垂直膨胀处理 全方向膨胀 开启与闭合运算.rar

    水平膨胀处理、垂直膨胀处理和全方向膨胀分别在指定方向上增加物体的边界,全方向膨胀能有效地扩展物体的所有边缘。 3. **开启运算**:开启运算是一种组合操作,先进行腐蚀再进行膨胀,常用来去除小的噪点,使物体...

    在水平下拉菜单和垂直下拉菜单之间随意切换的网页换肤程序

    首先,我们要理解水平下拉菜单和垂直下拉菜单的特点。水平下拉菜单通常位于页面顶部,与导航栏结合,节省空间,适合简洁明了的网站布局;而垂直下拉菜单则占用更多的宽度,但能提供更清晰的层级结构,适用于内容丰富...

    CAD插件_垂直和水平射线_

    首先,我们来理解一下垂直和水平射线的概念。在几何学和工程制图中,射线是从一个点(称为端点)出发向一个方向无限延伸的线段。垂直射线是指与水平线成90度角的射线,而水平射线则平行于地面或水平基准线。在CAD...

    水平垂直下拉导航.zip

    水平垂直下拉导航是网页设计中一种常见的交互元素,它为用户提供了一种高效且直观的方式来探索...总之,水平垂直下拉导航插件是提高网站导航体验的重要工具,其灵活性和可扩展性使得它在各种网页设计中都有广泛的应用。

    水平和垂直方向布局效果

    "水平和垂直方向布局效果"这个主题主要涉及如何在应用中组织和排列UI元素,以便在不同屏幕尺寸和设备方向下提供一致且美观的用户体验。源码DHLayout是一个工具,旨在简化这一过程,特别适合那些尚未采用Auto Layout...

    C# Winform垂直进度条控件实例含源码

    3. **属性扩展**:为了适应垂直布局,源码可能会增加一些特定的属性,如`Direction`(决定进度条的上升或下降方向)、`Orientation`(区分水平或垂直模式)等。 4. **事件处理**:可能包含对进度更新的响应,如`...

    Winform TextBox支持垂直居中自定义控件

    在给定的标题和描述中,我们看到开发者已经实现了一个这样的自定义控件,它不仅支持文字垂直居中,而且在开启自动折行(WordWrap=True)时也能保持垂直居中的效果。 首先,让我们深入了解如何在C#中创建自定义控件...

    自定义ViewGroup垂直水平滑动解决ViewPager冲突

    总结来说,自定义ViewGroup实现垂直和水平滑动并解决与ViewPager冲突,涉及的关键技术点包括:事件分发机制的理解、触摸事件的处理、滑动动画的实现以及手势检测。掌握这些技能对于提升Android应用的用户体验至关...

    数据库扩展性:构建未来可扩展的架构

    数据库扩展性主要涉及两种扩展方式:垂直扩展(Scale-up)和水平扩展(Scale-out)。 - **垂直扩展**(Scale-up):通过增加单个服务器的资源(如 CPU、内存、存储)来提升性能。这种方式适用于小型到中型的数据库...

    2010架构师大会-可扩展数据库架构

    首先,可扩展性通常涉及到水平扩展和垂直扩展两种策略。垂直扩展是指通过增加单个服务器的硬件资源(如CPU、内存或硬盘)来提升数据库性能。然而,这种做法在硬件达到物理极限后会遇到瓶颈,因此,现代数据库架构更...

    可垂直滑动的viewpager

    总的来说,实现垂直滑动的`ViewPager`是一种对原生组件的扩展和创新,它能够提供更灵活的界面交互方式,使得Android应用可以更好地适应各种复杂的布局需求。对于开发者来说,理解这种自定义过程不仅可以提升编程技巧...

    ArcMap 垂直文字设置

    在地图制图过程中,文字标注是一项基本但至关重要的功能,它帮助用户更好地理解和解读地图上的信息。然而,传统的水平或沿路径方向的文字标注有时并不能满足所有需求,尤其是在需要标注朝向固定方向(如正北方向)的...

    iOS端可垂直方向拖动的滑杆

    总之,创建一个垂直方向拖动的滑杆需要对iOS的UI组件有深入理解,同时也涉及到触摸事件的处理和自定义视图的布局。通过自定义UISlider,我们可以实现符合设计需求的垂直滑杆,提高iOS应用的交互性和用户体验。

    垂直方向滑动的ViewPager

    总之,实现垂直方向滑动的ViewPager涉及到对原生ViewPager的扩展和适配器的自定义,同时还要处理好滑动事件和布局设置。这种自定义不仅可以提供独特的用户体验,也可以为你的应用增添更多创新元素。在实际开发中,应...

    可以拖动的垂直的SeekBar

    总结来说,实现一个可拖动且带有渐变效果的垂直SeekBar需要对Android图形绘制、触摸事件处理和自定义View有深入的理解。这个项目对于初学者来说是一个很好的实践,可以提升Android开发技能,同时也是一个挑战,需要...

    构建高性能可扩展ASP.NET网站 + 源代码----英文版

    这可能涉及到负载均衡、分布式缓存、微服务架构以及水平扩展和垂直扩展的策略。 3. **ASP.NET框架深入理解**:深入探讨ASP.NET的工作原理,包括页面生命周期、控件事件处理、视图状态管理和异步处理。理解这些核心...

Global site tag (gtag.js) - Google Analytics