讲讲集群情况下的session机制
filed in Java on Oct.28, 2007, by javafuns
1.集群的历史
集群,英文叫cluster,是一个老话题了,使用yahoo.cn, baidu.com和g.cn都没有搜索到究竟集群这个概念是从什么开始的,后来发现了一篇英文文章http: //www.domaingurus.com/faqs/what-is-a-server-cluster.html。2.为什么要做服务器做集群?
通常情况下,我们的应用都不需要做集群,但随着访问量的加大,一台服务器无法支撑,无法做出快速的响应,而且在这种访问压力下,有可能会压垮服务器。这种 情况下,我们需要增加服务器、分发请求给各个服务器,但必须保证在客户看来是在访问一个服务器而不是多个。下面引用了袁红岗的一段采访记录,应该说比较有说服力:
“在以下两种情况下集群是有用的:1. 高并发超负荷运行的主机,例如google这样的网站,它的访问量是相当大的,因此google会采取集群策略来分散客户的请求,以提高整体响应能力。我 们接触的很多J2EE应用负荷量都不大,其实每秒访问量在500以下的应用都没有必要采取集群策略。2. 失效转移,其实我认为这才是集群真正有用的地方,使用一台低成本计算设备作为主设备的备份,在主设备发生故障时及时接替,以保证7×24小时不间断服务。 综上所述,在准备采用集群之前,一定要仔细分析具体的应用环境,以避免不必要的浪费。”
3.服务器集群的难点
作为每个web应用,实现会话是最基本的要求。我们都知道用户在访问服务器的时候,服务器会为每个用户生成一个唯一的session,当如果下次这个用户 的请求被分发到集群中的另一台的时候,那台服务器也必须要重新创建一个新的session,导致用户前面的session信息丢失。因此,集群的一个重要 难点在于如何保证这些集群服务器使用的session都是该用户的同一个session。
- 多台集群服务器之间互相复制session信息
- 一台服务器存放session信息,由集群服务器读取
- 将session信息保存于客服端cookie,节省session复制的开销
可以想到,1和2其实都有很大的开销,而3则是一个不错的选择,当然有一个极大的缺陷:无法保持多个请求之间的状态信息,而只能保存一些最基本的、经常使用的信息。在《J2EE核心模式》一书中是这样评价的:这个策略真正解决了在实现跨越物理机器的负载平衡的情况下跨越多个服务器的状态复制问题;但在保存大量状态时,会引起执行性能的下降,因为所有的会话状态都伴随着跨越网络的每个请求和应答,同样,在客户端保存会话状态的时候,也有大小和类型的约束。
服务器集群的定义



