![]() |
| ![]() |
关闭本窗口 | ||
王友
编译 无论准备经营、赞助、投资或开发一个网络应用,在着手实施之前,您必须考虑规模的可扩展性。在狂热的网络世界中,靠随后发放补丁程序来解决问题几乎是行不通的。本文将讨论一些经过现场测试过的复制和分割技术,这两种技术将使系统在增加大量客户的情况下,可以继续工作。 阻塞是首要问题 为什么一个计划周密、表现很好的应用程序在负载情况下会突然运作不正常呢?这与您上下班的经历特别相似。在开发阶段,系统性能就像在周日的下午驾车回家一样;而在重载情况下,系统性能就如同在高峰时驾车回家。系统将按以下的公式运行: 实际响应时间=无负载响应时间/(1-利用率) 在利用率为50%时,顾客的等待时间是无负载响应时间的2倍。在利用率为75%时,顾客的等待时间为无负载响应时间的4倍。从此之后,系统性能呈指数关系恶化:仅增加少量顾客就会很容易地使每个人的等待时间翻番。很自然,当利用率接近100%时,响应时间不会无穷大。因为当应用的流量十分拥挤时,部分顾客失去信心而另寻他处。 当然,谁也不想失去自己的客户,因此,必须提高可扩展性。因为系统对应用的响应在负载情况下呈指数关系恶化,所以必须在开发阶段的早期就考虑可扩展性。不能指望这个问题会自行消失。相反,它会逐渐扩大,产生越来越大的压力,并且随着时间的推移,将电子商务推向越来越危险的境地。 最好通过市场调查进行需求预测后启动项目。预测将有助于对服务器性能的估算。不管预测是否可靠,都必须考虑如果客户翻番该怎么办?可扩展性设计的目标就是设计一个仅通过添加硬件就能使服务不断扩大的系统。如果从开始就拥有一个可扩展的硬件平台,那么实现系统能力的翻番便非常容易,只需替换一个更强大的服务器即可。 然而,网络呈指数级增长,所以必须要求加倍、加倍、再加倍。不管硬件提供商的能力和声誉如何,在某种程度上最终要达到单个服务器的能力极限。那么,惟一的解决方案便是在几个服务器上复制或分割应用。 所谓复制应用,就是并行地添加相同的硬件并将客户要求分配到复制的服务器上。所谓分割应用,就是将应用分解,这样可以将一部分应用转移到其他服务器上,系统的容量将随之增长。这两种方法是相辅相成的。随着客户数量的增加,可以先分割应用。在客户数量进一步增长后,可以复制超出新服务器能力的部分。 复制应用 通过添加硬件的方法来扩展应用就像在拥挤的高速公路边上添加辅路。设计的主要问题首先是确定出现瓶颈的地方,因为在那里新硬件会最能发挥作用;其次是确定如何在扩展后的系统中分配客户要求以平衡负载。图1显示了在网络应用中不同层次的5种可能的复制策略。如果磁盘操作是瓶颈,添加额外的磁盘驱动器相对简单(见图1中A)。便宜的磁盘冗余阵列(RAID)技术很容易添加驱动器,并且在一个磁盘发生故障时提供冗余。对于事务处理数据库,可使用RAID技术。 在数据挖掘的任务中,需要复杂的连接或长时间的问询,这时数据库引擎本身或许就是一个瓶颈。当客户需要详细的报告时,系统便停顿下来,这种情况表明数据库引擎是一个瓶颈,如图1中B所示,采用并行数据库或复制数据库将会增加系统的能力。图1中C、D、E中的结构是假设采用并行的数据库引擎。 当商业规则特别复杂时,应用服务器可能成为瓶颈。根据经验,稍微改变用户接口布局和应用导航便可自动地满足大量复杂的商业规则。 当应用服务器不得不操作或重新安排数据时,它也可能成为瓶颈。如果所编写的应用服务器程序包含嵌套或数组,应该考虑更高级的SQL语言或其他方法。 当采用不够先进的技术时,应用服务器也可能成为瓶颈。解释语言比编译语言慢,所以有大量解释语言的长代码段会引起问题。 编译代码段的确会提高应用服务器的性能,但当负载变大时如何复制它?即使可以使用额外的网络应用服务器(见图1中C)进行负载平衡,通信开销将抵消获得的性能。一个局域网远程过程调用(RPC)所需时间是本地RPC所需时间的2倍,因为它需要执行成千上万条的机器指令将信息调到局域网上。通过复制网络服务器来进行负载平衡是一个好主意。 Web服务器本身或许从来都不是一个瓶颈,但由于图1中D所示的结构是平衡系统负载的一个简单方法,所以特别引人注目。最简单的方法是根据IP包的源地址用路由器将请求分配到各个网络服务器上。每个网络服务器处理特定范围的客户IP地址。这个方法可以圆满地解决会话状态的问题。HTTP不会在一个会话中保持客户和服务器的不间断连接,它的每个请求是完全独立的。然而,许多应用都必须维持各个请求间的状态信息。如果状态信息保存在应用服务器上,那么在一次会话中来自同一客户的所有请求都必须路由到同一个服务器上。基于源IP地址的路由技术可以做到到一点。 这里,一个缺点是源IP地址没有均匀地分配给每一台服务器。来自像美国在线(AOL)等主干网的请求仅经过几个网关,您可以为来自AOL的客户分配一台专门的网络服务器。当这台服务器超负载时,这种方法就不管用了。另一个缺点是这里负载的平衡是静态的,而根据服务器当前的负载情况来动态分配负载的方法更有效,如果分配给AOL客户的服务器过载或发生故障,可以将部分或全部请求转移到一台空闲的服务器上。为了进行动态负载分配,必须用如下方案取代当前的路由方案: 1. 采用智能的重定向器来监测网络服务器当前的负载,不仅理解源IP地址,而且理解以cookies、login以及URL等形式的会话信息。 2. 采用群集管理器将请求分配到群集内的每一台服务器上。群集计算机采用独立的局域网协议,透明地交换会话状态信息。 3. 采用一个专门的服务器管理主页,在会话的其余部分将客户请求转到同等的服务器上。这个重定向功能是基于同等的服务器目前的工作负载状态。 对一个Internet应用来说,瓶颈很可能是网络通信。这时,如图1中E所示的结构是最有吸引力的,它包含几个与不同的主干网邻近的镜像服务器,并且地理上分布较广。域名服务系统为多个具有单一名字的IP地址建立联系,并以轮转方式返回IP地址。 一些公司已经开发出智能的DNS服务器来提高轮转法DNS方案的性能。智能DNS服务器作为几个网络服务器的前端支持相同的URL。增强的DNS服务器跟踪网络服务器的负载和有效性。响应一个DNS域名查找服务,它返回最空闲但仍有效的网络服务器的IP地址。在一个会话周期内,客户利用那个IP地址工作。 另一种方法就是在客户发出HTTP请求时,将客户重定向。DNS返回的那个与IP地址相对应的主服务器跟踪几个辅助服务器的负载和有效性。当主服务器收到一个HTTP请求时,它将这个请求转到利用率最低的辅助服务器上。辅助服务器在地理上分布范围较广,因此,为使总的客户响应时间减到最小,智能主服务器也考虑辅助服务器与客户的接近程度。 可以在网络应用的每一层使用复制法,以便打破瓶颈。对一个企业内部网应用来说,从可扩展性和有效性的观点来看,图1中D的结构是最有吸引力的。对一个客户分布范围较广的Internet应用来说,图1中E的结构的性能、可扩展性和有效性最高。 分割应用 应用程序分割是另一种分配工作负载的方法。这里,将应用按层水平分割或按功能垂直分割,不同的服务作业被分配到不同的硬件系统上。 在讨论复制策略时,并没有指出网络服务器、应用服务器、数据库服务器是否应该运行在同一个硬件系统上。如图2中A所示,如果把它们放在同一个系统上,会使它们之间的通讯开销降至最低,但增加了单个硬件系统的利用率。没有明确的规则将这3种服务在不同的硬件平台上分割开。如果网络服务器没有足够的内存来缓存静态内容,它便是受网络I/O能力的限制,通过网卡将文件传给用户需要一定的等待时间。应用服务器执行商业规则,并且与数据库服务器打交道产生HTML。按商业规则进行计算和产生HTML要受到CPU能力的限制,而数据库服务器上的数据库运作是受到磁盘I/O能力的限制。在系统刚开始付诸应用时,将网络服务器和应用服务器放在同一个硬件系统上(如图2中B),并监视CPU和网络的负载。当CPU成为一个瓶颈时,您可能会想将网络服务器放到另一个系统上(如图2中C)。然而,由于受网络通讯开销的限制,这种方法只是简单地将受CPU能力限制的应用服务器转为受I/O能力限制的应用服务器。这时,将整个网络服务器和应用服务器同时复制到一个新的硬件系统上,效果会更好(见图1中D和E)。 由于磁盘操作的速度比CPU速度慢很多,所以对数据库的操作通常受到了I/O能力的限制。在有足够的内存来存储所有进程和文件的情况下,将一个受网络I/O速度限制的网络服务器、一个受CPU速度限制的应用服务器和受磁盘操作限制的数据库服务器结合在一起可以得到一个平衡的系统。更一般地,将数据库服务器放在一个独立的系统上。通常,一个数据库服务器可以使用好多年并可以为其他应用提供服务,它应该是一个无须修改的独立系统。 此外,也可以按功能垂直分割应用。可将不同的任务分在不同的硬件上。例如, Mindscape公司合作开发一个网络应用。他们要求采用合理的网络分布来让客户下载部分的软件内容,又要求在网上销售其他内容,并通过网络来支持应用程序更新版本的发行。这两种要求对应了两种截然不同的硬件系统。下载静态内容需要一个专门为其设计的简单的网络服务器,即一个有大量存储空间、多块网卡、但对CPU速度和I/O端口要求不高的子系统。确认客户权限并支持购买附加内容需要一个可以访问数据库的电子商务网络应用。这需要系统的磁盘I/O操作速度快。在考虑到两种类型操作相对频率的基础上,我们设计了一个数据库系统,它又支持多路内容下载。这种结构很容易进行规模扩展。 将变化快的数据从变化慢的数据中分割出来可以提高系统的性能和可扩展性。金融业务应该复制过去的数据和报价,而将业务和客户的账户放在中央服务器上。人力资源管理应该复制收益计划和公司的政策,而将雇员要求和私人收益记录放在中央服务器上。在线图书销售应该复制出版的书目,而将订单和客户需求放在中央服务器上。 除了考虑将静态数据和动态数据分离开,还可以设计一个分布式的数据库。在这种结构中,可以按照地理分布、客户、生产线以及其他别的标准来将数据分段,并将它们放在各自的数据库中。如果分段合理,大多数的数据库操作只需访问分段后的某一个数据库。例如,将不动产数据库按地理位置分段效果非常好。 很遗憾,大多数数据不能被明确地分割开。在分布式数据库中,当处理需要跨越一个以上的数据库时,就会有降低系统的可扩展性及性能的危险:几个并列的分布式处理相互推诿,这会造成性能的巨大浪费,更糟糕的是可能造成数据库之间的死锁。这就需要仔细处理分布式数据库。如果不得不将数据库分割,将相对静态的数据和动态数据分开效果会更好。注意,要将对所有动态数据的处理和写操作放在一个数据库中。 将动态数据和静态数据分割后,将数据在独立的系统上做进一步地分割是有意义的。只要能将所有内容或大部分的数据存在内存中,复制整个系统要比分割法好。复制法可以平衡系统负载,与专用的服务器相比,它可以提供更灵活的性能。 在呈指数关系增长的网络上实现一个新的电子商务应用或许会使人受到挫折,但是以上描述的分割应用和复制应用技术将克服这些障碍。总的来说,分割法使硬件系统易于扩展,而复制法可以消除瓶颈,应付故障。综合使用这两种技术,则会得到一个对付规模迅速增长的网络经济的解决方案。
推荐本文给好友 我要投稿>> 进入信息化BBS论坛
| ||
![]() | 世纪科创电脑系统有限公司版权所有 | ![]() |