顾永生 高沈钢 戚林成
(江苏电力信息技术有限公司,江苏 南京 210004)
随着互联网应用技术的飞速发展,为满足用户日益增长的需求,互联网应用的形式也逐渐从单服务器架构转向多服务器的分布式架构。采用多台服务器组成负载均衡集群,每个群集节点运行自己的独立进程,但对于网络用户来说,是一个整体的应用系统。集群系统可通过在集群中增加服务节点的方式,增加服务的处理能力,并通过系统级的冗余保障系统的可靠性和可用性。
然而,由于HTTP协议是无状态的,这就需要应用能够保持用户与应用交互过程的信息,比如用户登录、访问历史等信息,这就要采用Session(会话)技术[1]。在集群的计算环境中,这种技术面临更复杂的情况。因为,Session是保持在单个服务器内部的,而当用户每次发起HTTP请求时,都有可能被分配到不同的服务器来处理,如果Session无法在各服务器内部保持统一,那么在集群环境下,应用的运行逻辑就会发生混乱。所以,需要研究负载均衡集群环境中Session共享的方法,并根据具体的使用场景采用不同的Session共享的方式,使应用在正常运行的同时,达到较优的性能[2]。
1 基于Cookie的Session共享
基于Cookie的Session共享,基本原理是服务器将用户的Session信息加密、序列化以后,以Cookie的方式存在用户的机器上。当用户再次请求时,服务器就能从Cookie中获取相应Session中的内容,从而实现Session的共享[3]。下面以一次用户请求为例,解释Session的检查和装载过程。
用户请求到服务端后,服务端首先检查当前的Session是否为空,如果不空,说明已经登录;如果为空,则从Cookie中读取Session值。然后验证该值是否为空,如果为空,则返回用户登录界面;如果不空,则进行解密,设置到当前的Session中,再继续下面的业务流程。
这种方案的优点是Session信息保存在用户端,无需额外的服务器资源。缺点是在Cookie中存储的Session信息有长度限制,仅能够存储较少的用户信息;同时,Cookie化的Session内容需要进行安全加解密(如采用RSA等进行明文加解密;再由MD5、SHA-1等算法进行防伪认证);它也会占用一定的带宽资源,这是因为每次请求时,都要把本地Cookie附加在http头中传递到服务器。
2 基于源IP地址的Session保持
基于源IP地址的Session保持是指来自同一源IP地址的請求,会被负载均衡器分配到同一台服务器上,而在这台服务器上保持Session的一种方式。
如图1所示,在负载均衡服务器中记录了客户端X,Y,Z的请求路径。每当客户端有请求过来,都会被转发至相同的服务器,这样就能保证应用逻辑的正常运行。
这种方案的优点是Session信息无需特殊处理,只需要在负载均衡器中配置即可。缺点是一旦某单个服务器出现故障,就会有一部分用户无法正常访问应用;如果大量的请求是从同一台代理服务器发送到负载均衡服务器的,就会造成某个应用服务器的负载过大,导致不均衡的情况出现。
3 集群统一管理Session复制
该方案的实现原理是在集群中,当任何一个节点服务器建立或更新了Session,这个Session都会被复制到集群中的所有其他节点服务器中,这样就保证每个节点服务器都拥有所有的Session。请求被分配到任何一台服务器上后,都拥有相同的Session状态,从而实现Session共享。这其中的复制过程由集群来完成,需要对集群中的服务器做一定的配置,不同的服务器的配置方式有所不同。下面以Jboss和Tomcat为例,分别介绍Session复制的配置方法。
3.1 Jboss集群Session复制配置方法
要配置Jboss集群并实现Session复制功能,需要利用Jboss的组件mod_cluster。modcluster负责Apache HTTPD与AS群集的连接工作。通过HTTPD作为前端,为用户提供一个统一的群集访问点,后面负责将负载分担至群集内各节点。
在这个例子中,我们配置2个Jboss节点,node1和node2,它们的IP地址见表1。分别在2台机器上安装Jboss7。安装完成后,进入node1服务器的/standalone/configuration目录下,修改standalone-ha.xml文件,其中斜体加粗部分为修改内容。
(1)设置节点名称。
(2)设置mod_cluster中统一进行管理信息同步的安全认证口令(在下面的 mod_cluster配置当中会进行显示配置)。
…
cluster并不要求部署在集群节点中的一台机器上,只要它们在一个子网即可通过IP Multicast自动发现),修改配置文件httpd/httpd/conf/httpd. conf,默认情况下基本上只需要修改下地址跟端口即可。
ServerName 192.168.1.66:80
Listen 192.168.1.66:7777
ManagerBalancerName mycluster
…
KeepAliveTimeout 300
MaxKeepAliveRequests 0
#ServerAdvertise on http://@IP@:6666
AdvertiseFrequency 5
AdvertiseSecurityKey 1234567890
#AdvertiseGroup @ADVIP@:23364
EnableMCPMReceive
…
3.2 Tomcat集群Session复制配置方法
Tomcat的配置方式相对简单,但是需要在容器和应用中都做一定的修改,具体方法如下。
(1)在Tomcat的安装目录找到文件/conf/server.xml,然后找到被注释
…
bind="127.0.0.1" address="228.0.0.4"<!--保留ip,用于广播--> port="45564" frequency="500" dropTime="3000"/> address="auto" port="4001" <!--如果是在同一台机器上的2个tomcat做负载,则此端口则不能重复--> autoBind="100" selectorTimeout="5000" maxThreads="6"/> … (2)在应用的web.xml中,添加标志 ble/>,如下所示。 …