理解水平扩展和垂直扩展

转自:    http://yunjiechao-163-com.iteye.com/blog/2126981


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


【垂直扩展

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


在这个例子中,我们假设有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操作数成指数性增长。相反,如果对写频繁的系统采取水平扩展策略,那么你将达到一个拐点,在这个拐点之后如果在增加一个节点 都远比使用更多的硬盘来的实惠。


【其他注意事项

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

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


【综合说明】

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




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaWeb核心常用API一览

1.核心知识点 2.常用API

Java中的宏变量,宏替换详解。

转载自 Java中的宏变量,宏替换详解。群友在微信群讨论的一个话题,有点意思,特拿出来分享一下。输出true false来看下面这段程序,和群友分享的大致一样。 public static void main(String[] args) {String hw "hello world&q…

eclipse如何设置js源文件编码

window -> preferences -> 输入 content type -> 然后在右侧栏点击 javascript source file, 然后default encoding 输入 gbk(或者其他编码格式), 点击 update , 然后可以看见文件编码已经改变, 最…

SQL编程---存储过程和存储函数

1.基本概念 存储过程和函数是事先经过编译并存储在数据库中的一段 SQL 语句的集合。 2.存储过程和函数的好处 提高代码的复用性。减少数据在数据库和应用服务器之间的传输&#xff0c;提高效率。减少代码层面的业务处理。 3.创建和调用存储过程 <1>创建存储过程 创…

jvm 启动参数设置

-Xms256m -Xmx256m -XX:MaxPermSize64m 如果 jvm 启动失败&#xff0c; 说堆内存不够&#xff0c; 需要调小 初始堆和最大堆大小&#xff0c; 持久代大小&#xff1b; 第一行的参数是调节后的vm参数荔枝 &#xff1b;

类、变量、块、构造器、继承初始化顺序,终极解答

转载自 类、变量、块、构造器、继承初始化顺序&#xff0c;终极解答最近发现微信群里面有些群友在讨论类的初始化顺序&#xff0c;如类的静态变量、成员变量、静态代码块、非静态代码块、构造器&#xff0c;及继承父类时&#xff0c;它们的初始化顺序都是怎样的&#xff0c;下面…

数据表触发器

1.概念 触发器就是在表数据发生变化的时候&#xff0c;自动触发的一些 SQL 操作,查询不影响表中的数据&#xff0c;所以没有触发器。类似于web监听器机制,监听对应表的增删改。 2.触发器分类 触发器类型OLD 触发器之前的效果NEW 触发器之后的效果INSERT 类型的触发器无&…

Linux NAT网络连接权威指南

【1】准备工作&#xff0c;写在前面 1.1&#xff09;检查服务&#xff08;cmd>>services.msc,我用的是VM&#xff09; 1.2&#xff09;确保Vmnet8 连接处于启动状态 获取ipv4&#xff08;ipv6&#xff09;地址 &#xff08;在网络连接不正确时&#xff0c;作参考之用&a…

事务的概述

1.基本概念 将一条或者多条SQL看成一个整体&#xff0c;要么同时执行成功要么同时执行失败&#xff0c;这就是事务。 事务举例&#xff1a; 张三给李四转账500元钱&#xff0c;需要让三账户的余额-500&#xff0c;李四的账户余额500&#xff0c;转账是一个连续的过程&#xf…

Spring Boot Debug调试

转载自 Spring Boot Debug调试 在使用maven插件执行spring-boot:run进行启动的时候&#xff0c;如果设置的断点进不去&#xff0c;要进行以下的设置。 1、添加jvm参数配置 在spring-boot的maven插件加上jvmArguments配置。 <project>...<build>...<plugins>…

centos磁盘安装与磁盘分区方案详解

转自&#xff1a; https://yq.aliyun.com/ziliao/56538 前几天自己研究了下几个linux系统&#xff0c;还是觉着centos要好一些。相对稳定点&#xff0c;起码桌面系统还是比 ubuntu 强安装centos并不难&#xff0c;安装方法多得是&#xff0c;像硬盘安装&#xff0c;U盘安装&…

存储过程内基础语法

学生表 1.定义变量及变量赋值方式 DELIMITER ; 分号前面必须要有一个空格 <1>DECLARE 变量名 数据类型 [DEFAULT 默认值]; 需求-- 定义一个int类型变量&#xff0c;并赋默认值为10 DELIMITER $$ CREATE PROCEDURE pro_test1() -- 没有; BEGIN-- 定义变量DECLARE nu…

nginx-配置基于ip或域名的虚拟主机

【0】README&#xff1a; nginx 可以配置多种类型的虚拟主机&#xff1a; 类型1&#xff09; 基于ip的虚拟主机&#xff1b; 类型2&#xff09;基于域名的虚拟主机&#xff1b; 类型3&#xff09;基于端口的虚拟主机&#xff1b; 【1】配置基于 ip 的虚拟主机的准备工作 …

Tomcat集群session复制与Oracle的坑

转载自 Tomcat集群session复制与Oracle的坑 问题描述 公司某个系统使用了tomcat自带的集群session复制功能&#xff0c;然后后报了一个oracle驱动包里面的连接不能被序列化的异常。 01-Nov-2017 16:45:26.653 SEVERE [https-jsse-nio-8443-exec-2] org.apache.catalina.ha.ses…

存储过程内基础语法---补充while循环

1.基础语法 while循环初始化语句;WHILE 条件判断语句 DO循环体语句;条件控制语句;END WHILE;2.举例 计算1~100之间的偶数和 【注&#xff1a;num只能numnum1 不能num,num1; 】 <1>存储过程内部查询 DELIMITER $CREATE PROCEDURE pro_test6() BEGIN-- 定义求和变量DE…

nginx停止,平滑重启命令

TERM, INT 快速关闭&#xff1b; QUIT 从容关闭&#xff1b; HUP 平滑重启&#xff0c;重新加载配置文件&#xff1b; USR1 重新打开日志文件&#xff0c;在切割日志时用途较大&#xff1b; USR2 平滑升级可执行程序&#xff1b; WINCH 从容关闭工作进程&#xff1b; 【荔…

IntelliJ IDEA Community(社区版)下载及安装自用版

IntelliJ IDEA Community&#xff08;社区版&#xff09;下载及安装自用版 估计是个开发都逃脱不了用IDEA的命运吧&#xff0c;这么好的软件&#xff0c;白嫖了好多年。感恩。 现在很多公司已经不让用商业版的破解版了&#xff0c;所以这里讲的是社区版。 区别&#xff1a; 商…

视图的概述

1.概念和特点 <1>概念&#xff1a;视图&#xff08;view&#xff09;是一种虚拟存在的表&#xff0c;本身并不包含数据。它是作为一个select语法查询到的结果集&#xff0c;以此为基表创建的一张虚拟表。对视图的操作对基表有直接影响,[视图中的数据发送了改变&#xff…

Tengine-Ngnix高级版

转载自 Tengine&#xff0d;Ngnix高级版 Tengine介绍 Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上&#xff0c;针对大访问量网站的需求&#xff0c;添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网&#xff0c;天猫商城等得到了很好的…

nginx的日志文件配置

1&#xff09;与nginx日志相关的指令有两条&#xff1a;log_format 和 access_log&#xff1b;log_format 设置日志格式&#xff1b;access_log 指定日志文件存放路径&#xff1b;2&#xff09;log_foramt2.1&#xff09;指令参数&#xff1a;log_format combined $remote_addr…