应用服务器集群、可用性与无session的企业应用(一)

本文目的

本文的主要目的是讨论企业应用实现高可用性的方案。即如何在保证性能的同时,使得应用保持 24 小时的可用性。 为实现此目的,灾难恢复和性能问题的解决是必不可少的。本文仅就程序和应用服务器两方面进行讨论,不讨论数据库等相关的问题。

1.    灾难恢复

所谓灾难恢复(仅对 Web 应用而言),是指在某个应用失去响应能力后(比如重启),客户端能立即透明的切换到冗余应用。这一切换对客户端来讲应该是感觉不到的。从技术上来讲,就是客户端在与服务器端进行交互的过程中,客户端在服务器端保存的状态能立即切换到新的服务器上。在 web 应用中,这些状态一般保存在 http session 里。所以所谓状态复制,一般来讲就是 http session 复制。

目前能提供灾难的方案之一是集群。对于 Weblogic ,集群的实现方式为 Paired servers replication

<v:shapetype id="_x0000_t75" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" filled="f" stroked="f" coordsize="21600,21600" o:spt="75"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" o:extrusionok="f" gradientshapeok="t"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype>


cluster.JPG
(图片引自 http://www.theserverside.com/articles/article.tss?l=J2EEClustering

在这种实现方式里, session 只在相邻的或者指定的两个 server 之间进行复制,当某一个 server down 掉后,需要 servers 前端的 load balancer 知道哪一台 server 是这个 Server1paired backup server ,并将原来指向 Server1 的请求转发给这台 paired backup server 。应该说这种复制策略是相当高效的,但是对集群前端的路由要求比较高。

2.    性能

企业应用一般会跑在多台服务器上。就性能而言,我们的期望自然是:总体性能 = 单台服务器性能 X 服务器台数。不过从上边的说明就能看出,集群中的每一台 server 都会有一部分性能耗费在 session 复制上。耗费的性能取决于 session 的大小。如果应用中 session 保留了大量的数据,或者用户数量很多,损耗的性能也将相当可观。

(有一种提升性能的方案是使用分布式的对象,例如 EJB ,根据对象耗费性能的不同对其所在服务器进行调整。不过这种方案早已充满了极大的争论。流行的观点认为,对于业务逻辑不是很复杂的应用,使用分布式对象只会让性能下降。因此下边将不再讨论。)

3.    维护

从维护的角度上看,如果我们能不重启应用就能给应用添加新的功能,或者修改已有的 bug ,那显然相当 8 错。

分析

根据上边的说明,我们可以初步得出几个结论:

1、  要使用Weblogic集群所带来的灾难恢复的好处,就必须忍受同时带来的性能损失。

2、  在使用weblogic集群的同时,我们必须拥有高性能的 Server 路由设备。

3、  使用weblogic集群,在重新部署应用时,由于不能重新部署 (redeploy) 集群下单台 server 的应用,导致几台 server 需要同时停掉应用。当所有的 server 全都陷入灾难中,灾难恢复也就失去了意义。

<o:p> </o:p>

那么,如何在实现灾难恢复和高性能的同时,又能避免或者减少上边列举的损失呢?

初步的思路可以有:

<o:p> </o:p>

1、  如果我们能忍受某一台 server down 机后客户状态丢失的后果,那么最简单的方案就是停用集群,前端 load balancer 把相同 IP 的请求转到相同的服务器。在重新部署应用时,分批重起不同 server 上的应用。

2、  全部采用无 session 策略。将客户状态保留在客户端。这样没有Weblogic集群也就无所谓了。我们只需要一个普通的(分发器+失败检测)将请求均匀的分发到可用的服务器上。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值