我的CRC卡片盒

zhangwen's blog

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

本文目的

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

1.    灾难恢复

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

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


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

在这种实现方式里, session 只在相邻的或者指定的两个 server 之间进行复制,当某一个 server down 掉后,需要 servers 前端的 load balancer 知道哪一台 server 是这个 Server1 paired 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 全都陷入灾难中,灾难恢复也就失去了意义。

 

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

初步的思路可以有:

 

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

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

 

posted on 2006-06-14 12:55 不知道叫啥好 阅读(1839) 评论(12)  编辑  收藏

评论

# re: 提高企业应用可用性的分析(一) 2006-06-14 13:50 charon

灾难回复可能有更复杂的含义。
在灾难恢复里面,应用服务器级别的容错回复是最简单的(在集群服务的情形下,崩掉一两台不是什么大事情),稍微复杂一点的是数据库服务器级别的,再复杂一点,就是异地冗载了。
如果要作数据库级别的灾难回复,可能必须要用到统一的中央存储设备,如独立的磁盘阵列之类的,而且必须实现同一阵列区域在不同服务器系统之间的切换(这个简单一点)或者共享(没试过)。HA的配置比应用服务器的集群配置要复杂很多,而且对系统的影响是深远的。  回复  更多评论   

# re: 提高企业应用可用性的分析(一) 2006-06-14 13:54 不知道叫啥好

@charon
你说得对,不过这里只打算对应用和应用服务器的情况做讨论。这片东东只写了一晚上,遣词造句也没有深究就拿出来了,难免有些差错。  回复  更多评论   

# re: 提高企业应用可用性的分析(一) 2006-06-14 14:11 狂人

援引"Under the Hood of J2EE Clustering"的一句话:Failover can avoid errors completely. -- Negative.具体意思是:Remind that when I defined “failover”, I defined a condition for when the failover will happen: “between the method calls”. It means if you have two successive methods to a remote object, the failover will only happen after the first method call is finished successfully and before the second method request is sent out.
So, what will happen if the remote server fails when the methods are in the middle of processing in the server? The answer is: the process will stop and the client will see error messages in most cases, unless the methods are idempotent (defined in the “basic terminology” section).Only if the methods are idempotent, some load balancers are smart enough to retry these methods and failover them to other instances.
我很赞同他的观点.
另外,根据我的项目经历,往往集群Appserver并不是真正瓶颈所在,真正瓶颈是在DBServer.  回复  更多评论   

# re: 提高企业应用可用性的分析(一) 2006-06-14 14:27 不知道叫啥好

@狂人
呵呵,这片文章本来是针对我们的项目写的,大体改了改就拿出来了。我们项目的特点就是可用性要求高,但是数据库操作却很少。因此先假设数据库这里不存在性能问题。实际上引起数据库的原因很大程度是由蹩脚的sql,以及海量的数据,但就不在讨论范围之列了。

关于幂等性等问题,会在本文的后续中提到~

  回复  更多评论   

# re: 提高企业应用可用性的分析(一) 2006-06-14 14:54 langds

如果撇开DB性能以及"幂等性"问题,那你的集群其实要考虑的东西就要会少了一大半.
依我的经验来看,最实用的做法就是直接在Appserver前加web server,该webServer起loadbanance和Httpserver的作用.他能自动将不同的客户端分发请求到相应的Appserver上执行,并且服务器间无需同步session状态,webserver能自动定位到该客户端最近一次请求的响应AppServer,
再者,对于你提供的同步部署问题,我认为,只要不新增EJB之类的组件就无需重新部署应用,直接替换相应的CLASS或JAR包即可.
如果一定要重新部署,就拿WAS来说吧,它的所有集群成员都由ND Server管理,然么你只需要部署到ND后,由ND自动同步一把即可.
事实上,在真正需要集群的高并发应用生产环境中是不可能常常重新部署整个应用的.而且对热替换的需求也并不会很明显,因为在这样的环境里,要的就是稳定和速度.  回复  更多评论   

# re: 提高企业应用可用性的分析(一) 2006-06-14 15:06 不知道叫啥好

@langds
“依我的经验来看,最实用的做法就是直接在Appserver前加web server,该webServer起loadbanance和Httpserver的作用.他能自动将不同的客户端分发请求到相应的Appserver上执行,并且服务器间无需同步session状态,webserver能自动定位到该客户端最近一次请求的响应AppServer, ”

这也我提的方案之一亚。~不过不同步session,如何失败恢复?另外web server 能自动定位到该客户端最近一次请求的响应AppServer? langds能否具体说以下?我只试过使用apache的mod_proxy,用robbin随机分发。目前我们是使用硬件(四层交换机)做到的这一点。  回复  更多评论   

# re: 提高企业应用可用性的分析(一) 2006-06-14 15:08 不知道叫啥好

@langds

另外weblogic在生产模式下不支持class的热部署~
我们也很希望它能像websphere那样热部署亚~  回复  更多评论   

# re: 提高企业应用可用性的分析(一) 2006-06-14 15:52 langds

为什么一定要失败恢复?如果真的是业务处理发生故障能做到真正恢复的可能性太小太小.在我的第一篇回复中已经引用了"wangyu"所说的话来说明问题.

另外:为什么要class热部署?我们WAS在生产环境里都是将改功能禁止了的,还是那句话,要的是稳定,安全和速度.  回复  更多评论   

# re: 应用服务器集群、可用性与无session的企业应用(一) 2006-06-14 16:02 不知道叫啥好

@langds
至少我要做到,从这个server跳到那个server,本来登陆的状态不能变成注销吧

另外能否具体说下web server 如何自动定位到该客户端最近一次请求的响应AppServer? 多谢!  回复  更多评论   

# re: 应用服务器集群、可用性与无session的企业应用(一) 2006-06-14 16:24 langds

我对weblogic不是很熟悉,就说我用的was吧,WAS自学的IBMHttpServer 可以根据客户端的标识定位到最近一次请求响应的APPSERVER.,所以如果是在WAS环境里,你所考虑的SESSION问题有些多余.
另外,WEBLOGIC好像也有自己的集群代理SERVER,不知道你自己有没有亲自实验过,所有的HTTPSERVER集群控制器都拥有请求重定位功能.  回复  更多评论   

# re: 应用服务器集群、可用性与无session的企业应用(一) 2006-06-14 16:33 不知道叫啥好

@langds
weblogic的集群代理server就是一个servlet,也能实现这个功能,但是性能太差,达不到生产级的要求~所以bea给人作方案时,都是推荐用F5来分发~

想起来IBMHttpServer了……,跟was结合的很好,又是apache的底子,越发羡慕was了~  回复  更多评论   

# re: 应用服务器集群、可用性与无session的企业应用(一) 2006-06-14 17:49 寒晴天

开始行动  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

导航

<2006年6月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

统计

常用链接

留言簿(2)

随笔档案(3)

文章分类

Programmer

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜