APP下载

Web服务器负载均衡会话保持的研究

2011-01-25赵艳芳蒋云起

关键词:会话粘性集群

赵艳芳,蒋云起

(1.云南民族大学数学与计算机科学学院,云南昆明650031;2.云南省国家税务局,云南 昆明650041)

随着Internet技术的不断发展,为满足日益复杂的应用需求,网站的形式也从静态页面展示发展成交互性的动态页面形式,随之而来的就是动态网站对服务器运行环境要求的不断提升.为解决高并发用户访问(>1000用户/s)动态网站而产生的性能问题,采用多台服务器组成负载均衡集群,每个群集节点运行自己的独立进程,这些进程可以彼此通信,在网络上对用户来说就像是形成了一个单一的网站系统,协同起来向用户提供服务.集群系统还可通过在集群中继续增加服务器的方式,从内部增加服务器的处理能力,并通过系统级的冗余提供系统的可靠性和可用性.

然而,由于Web技术所依赖的HTTP协议是无状态的Request/Response连接协议,动态网站需要记住特定用户与网站应用交互过程的信息(用户记录、购物车、状态等等)就只有采用Session(会话)技术.当网站运行于负载均衡的集群环境中时,如果不做会话保持处理,每次HTTP请求都可能被分配到不同的服务器,而新的服务器若没有相应的会话记录,就会造成整个网站的运行逻辑混乱.因此,需要研究负载均衡集群环境中会话保持的问题,并根据网站具体使用的负载均衡算法的不同采用不同的会话保持方式,使动态网站在正常运行的同时,达到较优的性能[1].

1 相关工作

1.1 负载均衡技术概述

负载均衡就是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助.通过某种负载分担技术,由前端分配器将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求[2-3].

负载均衡集群在多节点之间按照一定的策略(算法)分发请求负载,可以采用软件和硬件来实现.广义上的负载均衡既可以设置专门的网关、负载均衡器,也可以通过一些专用软件与协议来实现.在OSI 7层协议模型中的第2层(数据链路层)、第3层(网络层)、第4层(传输层)、第7层(应用层)都有相应的负载均衡策略(算法).在数据链路层上实现负载均衡的原理是根据数据包的目的MAC地址选择不同的路径;在网络层上可利用基于IP地址的分配方式将数据流疏通到多个节点;而传输层和应用层的交换(Switch),本身便是一种基于访问流量的控制方式,能够实现负载均衡.

目前,主要的负载均衡算法有以下3种[4]:

1)DNS轮询.最早的负载均衡技术是通过DNS来实现的,在DNS中为多个地址配置同一个名字,因而查询这个名字的客户机将得到其中一个地址,从而使得不同的客户访问不同的服务器,达到负载均衡的目的.DNS负载均衡是一种简单而有效的方法,但是它不能区分服务器的差异,也不能反映服务器的当前运行状态.

2)反向代理服务器.使用代理服务器,可以将请求转发给内部的服务器,使用这种加速模式可以提升静态网页的访问速度.这种代理方式与普通的代理方式有所不同,普通代理方式是客户使用代理访问多个外部服务器,而这种代理方式是代理多个客户访问内部服务器,因此也被称为反向代理模式.使用反向代理的好处是,可以将负载均衡和代理服务器的高速缓存技术结合在一起,提供有益的性能.然而它本身也存在一些问题,首先就是必须为每一种应用服务器(Weblogic,Tomcat等)都专门开发一个反向代理服务器.其次,代理服务器本身虽然可以达到很高效率,但是针对每一次代理,代理服务器就必须维护2个连接,1个对外的连接,1个对内的连接,因此对于特别高的连接请求,代理服务器的负载也就非常之大.反向代理方式下能应用优化负载均衡策略,每次访问最空闲的内部服务器来提供服务.但是随着并发连接数量的增加,代理服务器本身的负载也变得非常大,最后反向代理服务器本身会成为服务的瓶颈.

3)地址转换网关.支持负载均衡的地址转换网关,可以将一个外部IP地址映射为多个内部IP地址,对每次TCP连接请求动态使用其中一个内部地址,达到负载均衡的目的.很多硬件厂商将这种技术集成在他们的交换机中,作为他们第4层交换的一种功能来实现,一般采用随机选择、根据服务器的连接数量或者响应时间进行选择的负载均衡策略来分配负载.由于地址转换相对来讲比较接近网络的低层,因此就有可能将它集成在硬件设备中.

1.2 会话保持

作为每个动态网站的Web应用,实现会话是最基本的要求.用户在访问服务器的时候,服务器会为每个用户生成一个唯一的Session,如果下次这个用户的请求被分发到集群中的另一台服务器的时候,则那台服务器也必须要重新创建一个新的Session,导致用户之前的Session信息丢失,登录状态的混乱情况.因此,集群需要采取会话保持的方法,保证该用户每次请求都可以使用同一个Session[5].

常用的会话保持方法主要有如下4种:

1)粘性Session(Sticky Sessions).它是将会话保持在一台服务器上,就像粘在上面一样.即当用户的请求第1次分发到服务器A,系统就在服务器A上建立Session,此后该用户所有的后继请求都会一直分发到服务器A上处理,以此来保持Session[6].

这种方法实现简单、一旦粘上服务器后响应速度快,节点间不用通信,不会对系统造成额外的负担,是种常用的会话保持方法,缺点是某个服务器节点一旦故障,它负责的所有用户都会丢失Session,而且这种方法也要求集群负载均衡算法做相应的配合.

2)Session复制(Replicated Sessions).它的原理是,任何一台节点服务器建立了新Session,都会把此Session数据复制到集群中所有其他节点服务器中,同时无论何时,只要Session发生改变,Session数据都要重新复制,实现同一时刻,集群中所有节点服务器都拥有同样的Session数据.这样无论用户请求被分配到任何节点服务器,都可以正常的使用Session信息,实现会话保持.

这种方法安全可靠,而且使集群的负载均衡算法的选择完全不受会话保持方式的制约,但是复制Session实现复杂,频繁的在各节点间复制大量Session数据也会占用相当大的网络带宽、增加系统的额外负担.

3)Cookie辅助Session.Session是存放在服务器端的,Cookie是存在客户端的,可以借助Cookie实现Session保持,就是把用户访问页面产生的Session数据放到Cookie里面,以Cookie作为复制中转站.用户访问服务器A,产生的Session复制到Cookie里面了,下次请求被分配到服务器B,这个时候,服务器B先判断自己有没有这个用户请求对应的Session,如果没有,就去看看客户端的Cookie里面有没有对应的Session数据,如果也没有,说明Session真的不存在,如果Cookie里面有,就把Cookie里面的Session数据复制到服务器B使用,这样就可以实现Session 的保持了[7].

这种方法实现起来简单、方便,系统额外负担小,但是如果客户端浏览器把Cookie禁用掉了的话,那么这种方法就行不通了.同时Cookie的安全性不高,虽然它已经加了密,但是还是可以伪造的.

4)会话服务器.它的原理是,在集群中设置一台专门的服务器统一存放集群中所有的Session,用户请求到达节点服务器时,节点服务器去这台专门的服务器获取所需的Session信息,以达到Session保持的目的.在实际应用中,一般使用共享文件服务器、数据库服务器、内存池服务器等作为会话服务器.

这种方法是以上几种方法中最复杂的一种,通常需要在应用服务器或者程序代码中进行配置,开发部署都较困难,一般只在复杂的大型系统中使用,但是如果配置得当的话,性能和可靠性都很高,关键就是解决会话服务器的性能瓶颈.

2 粘性会话服务器技术

基于以上各种会话保持方法的特点,结合实际的项目研究,本文提出一种新的改进方法——粘性会话服务器.通过比较,可以发现在几种会话保持方法中,性能最优的是最常用、也是最简单的“粘性会话”方法,集群中各节点间不用通信,不会对系统造成额外的负担,但是一旦某个服务器节点故障,它负责的所有用户都会丢失Session.为了弥补这个缺点,粘性会话服务器技术的解决思路是:系统正常运行时,仍采用粘性Session方式保持会话,只是增加一份工作,集群中的每台节点服务器实时将其上的Session信息复制一份到一台专门的会话服务器上,一旦节点服务器出现故障,故障服务器上的用户将被分配到其他服务器,并从会话服务器上取回相应的Session信息保存到新的节点服务器,从而实现会话保持.粘性会话服务器技术模型如图1所示.

具体实现步骤如下:

1)用户X第1次访问集群系统,负载均衡服务器将他的请求分配到某个节点服务器,记为A,并记住这个分配关系X(A),此后用户X的所有请求都将分配到服务器A,即用户X的会话粘上服务器A.

2)服务器A首先检查本机上是否有Session-X(A)存在,如果有就跳到第3)步.否则服务器A会向会话服务器查询是否存在Session-X(n)',若有就将n修改为A,取回本机,保存为Session-X(A)然后跳到第3)步.若Session-X(n)'也不存在,即可判断用户X为首次访问,就在服务器A上为用户X建立新的Session-X(A),保存用户X的有关信息,同时服务器A将Session-X(A)的副本发送到集群中的会话服务器,注册保存为Session-X(A)'.

3)用户X继续访问集群系统,其提交的请求都被分配到服务器A上处理.系统需要获取用户X的会话信息,直接从服务器A上读取Session-X(A).若需要更新会话数据,可以直接操作服务器A上的Session-X(A)数据,同时服务器A将变更后的Session-X(A)副本发送到集群中的会话服务器,更新Session-X(A)',使会话服务器上的Session-X(A)'与服务器A上的Session-X(A)始终保持一致.

4)当服务器A发生故障时,用户X访问集群系统,其提交的请求将被重新分配到新的服务器B上处理.服务器B首先检查本机上是否有Session-X(B)存在,没有就向会话服务器查询Session-X(n)'是否存在,会话服务器查到有Session-X(A)',就将其修改成为Session-X(B)',让服务器B取回本机,保存为Session-X(B),就此用户X的会话就从出现故障的服务器A平滑转移到了服务器B上.

图2为负载均衡服务器算法流程,图3为集群节点服务器的流程.

采用这种方法,正常情况下,用户的会话操作只与其被分配到的一台服务器和集群中专门的会话服务器发生数据交换,集群中的其他服务器不需要关心、也不用复制保存用户X的会话信息,操作会话的负担和复杂度只比单纯的粘性Session方式多出节点服务器与会话服务器同步Session的部分,而且相对于单纯的会话服务器方式,又节省了多台服务器同会话服务器交互的负载.也就是,单纯粘性Session方法是用户-服务器:1-1的连接;会话服务器方法是用户-集群中所有节点服务器-会话服务器:1-n-1的连接;而粘性会话服务器方法是用户-服务器-会话服务器:1-1-1的连接.

运行性能比较是:用户-服务器>用户-服务器-会话服务器>用户-集群中所有节点服务器-会话服务器,而系统可靠性比较为:用户-服务器-会话服务器=用户-集群中所有节点服务器-会话服务器>用户-服务器.

3 几种会话保持方法的性能比较

本文采用“云南省国家税务局网络申报系统”对几种会话保持技术的性能进行测试.

系统是基于 J2EE构架开发的动态网站[8-10],部署在10台PC服务器组成的Weblogic+Oracle集群环境中.在使用相同的负载均衡算法的情况下,针对高负载(5 000并发用户/s)情况下的系统性能和可靠性,分别采用粘性会话、会话复制、会话服务器(独立数据库作为会话服务器)、粘性会话服务器(独立数据库作为会话服务器)4种会话保持方法进行了测试,平均响应时间如表1所示.

表1 平均响应时间 ms

性能曲线图如图4.

图4中响应时间越大,表明性能越差;曲线坡度越大,表明响应时间随并发用户增加而增加的趋势越大.去除性能最差的会话复制方法,得到性能曲线图如图5.

从测试结果,可以看出在4种方法中,粘性会话方法性能最优,而且随着并发用户的增长,性能变化不大.而会话复制方法性能最差,响应时间和其他3种方法不在同一个数量级上,并且随着并发用户的增长,性能急剧下降.剩下的会话服务器和粘性会话服务器方法性能相近,而粘性会话服务器方法与会话服务器方法相比,性能随并发用户增加而下降的趋势不明显.

4 结语

在深入研究了现有几种集群环境中会话保持的方法,并比较了各自的优缺点后,本文提出了粘性会话服务器的方法,并且在项目实践中得到了应用,收到了较好的应用效果.

然而,在实践当中,也发现此方法还存在一定的缺陷,随着并发用户的不断增加,尤其是并发用户超过20 000用户/s时,系统的性能曲线会急剧上升,向“会话服务器”方法的性能曲线靠拢.经跟踪分析发现,此时作为会话服务器的独立数据库的性能成了系统瓶颈,因此,改进会话服务器的实现方式,提升其性能,成了改进系统整体性能的关键.今后的实践中,可以考虑使用性能更优的内存池替代数据库作为会话服务器的实现.

[1]陈一骄,卢锡城,时向泉,等.一种面向会话的自适应负载均衡算法[J].软件学报,2008,19(7):1 828 -1 836.

[2]孙海霞,马玉凤.负载均衡综述[J].电脑知识与技术,2003(4):161 -198.

[3]魏利峰,左明,王志晓,等.一个基于集群的Web服务器负载平衡模型[J].计算机工程,2005,31(10):116-118.

[4]张靖.Web服务器负载均衡研究[D].成都:电子科技大学,2005.

[5]田晓玲.基于Session技术的购物车的设计与实现[J].北京工业职业技术学院学报,2009(1):62-64.

[6] ZHANG W.Linux server cluster for load balancing[EB/OL].(2005 -09 -18)[2011 -04 -03].http://www.linuxvirtualserver.org.

[7]任国庆.基于内容分类和会话共享的集群负载均衡研究[D].长沙:湖南大学,2010.

[8]赵志鹏.J2EE下设计模式在Web系统中的研究与应用[D].大连:大连理工大学,2007.

[9]庄红林,万志琼,王琳,等.民族药(傣药)数据库的建设与研究[J].云南民族大学学报:自然科学版,2010,19(6):410 -413.

[10]商宇.基于J2EE规范B/S架构的HR系统的设计与实现[J].云南民族大学学报:自然科学版,2007,16(3):267-269.

猜你喜欢

会话粘性集群
演化折现Hamilton-Jacobi 方程粘性解收敛问题的一个反例
功能性新材料产业集群加速形成
QQ和微信会话话轮及话轮转换特点浅析
海上小型无人机集群的反制装备需求与应对之策研究
中国建筑业上市公司成本粘性实证分析
中国建筑业上市公司成本粘性实证分析
培育世界级汽车产业集群
高管薪酬与上市公司相互影响机制的探究
三方博弈下企业成本粘性驱动性研究
勤快又呆萌的集群机器人