ZendPlatform Session 跨服务器解决方案白皮书
介绍
这篇白皮书介绍的是Zend Platform 关于session clustering的新的模块。Zend的解决方案是唯一能为不断增加的集群提供线性升级的方案,同时它还提供空前的性能和数据完整性。 在这里,我们首先介绍目前可选的几种方案。然后,将它们与Zend提供的方案做对比,并且对Zend的Session集成模块的设计理念和架构做下阐述。 因特网或者万维网的核心是HTTP协议(超文本传输协议)。同时,因为HTTP协议的无界性,网站应用无法将浏览器访问与不同的服务器连接起来。从本质上说,这意味着用户从一个业务进入到另一个业务时,新的服务器有可能无法得到该用户的信息。 为了解决这个问题,一个新的概念“Cookies”被引入了。所谓的“Cookies”指的是一个小型数据结构,这个存放在用户本地的数据是被用来储存用户的信息。当该用户访问一个网站的时候,网站的服务器从用户本地得到用户数据后经过处理再把结果返回给用户。所以,给用户的感觉是网站似乎记住了该用户的信息。同时,用户可以方便地在登陆该网站时使用原先的设置,甚至不需要输入密码进行登陆。“Cookies”使用最多的领域是记录用户的相关配置信息或者是在一个在线商店所采购的采购记录。 然而,“Cookies”数据保存在用户本地的特点容易造成两个方面的负面效果。第一、过长的“Cookies”数据的保存与传输都将是一个不小的资源消耗。第二、对于一些重要的数据,保存在用户本地容易造成数据错误,从而给用户的访问带来负面影响。为此,基于“Cookies”的HTTP Session 概念产生了。代替传统的把所有的信息存储在用户本地的做法,Session 架构把用户的信息储存在服务器端,而在用户端只保存了区分布不同用户信息的唯一的“Session ID”。 PHP是通过内嵌的扩展来实现Session应用的,并且该扩展是基于地层的架构。PHP对Session的支持允许网站实现大量的注册和访问量。 可是,当要在一个服务器集群实现PHP Session 的应用时,问题变得复杂起来。 Figure: 1 – 服务器集群环境 经典的多服务器集群包含了一组服务器,在每台服务器上面加载相同的PHP应用。同时,服务器集群的出口由一个下载均衡服务器来实现,下载均衡管理器在服务器之间分配流量保证各个服务器的负载是均衡的。这种应用使得网站应用突破了单台服务器的传统模式,而由服务器集群来承载同一个PHP应用。很明显,这种集群服务器的应用提高了PHP业务的性能并减低了终端用户的访问时间。 由于HTTP协议的不确定性,同一个用户的不同HTTP请求很有可能被发送到不同的服务器。所以,将会造成用户的session id 无法及时获取正确的用户信息的问题,并最终导致用户使用上的不方便。 Zend之前的一些解决方案: 通过负载均衡服务器把特定的HTTP请求指定到相同的服务器。存在着一些不足: • SessionID与服务器的对应很难成功地保持。在没有HTTP协议校验的前提下,HTTP协议很容易丢失目标。而且,因为负载均衡的性能问题使用HTTP协议进行校验是不稳定的。 • 数据完整性: NFS的文件加锁机制在许多场合下是不合适的。这种情况有可能导致Session的数据很容易出错。 第三种解决Session不能跨服务器的方法是把共享的Session放在一台相应的数据库服务器中。这种方法也有效地解决了NFS文件系统方案带来的数据完整性和有效性等问题。但是这个方案同样地存在着某些不足: • 速度:相对本地存储来说,数据库服务器将需要在数据库处理上面占用整个PHP应用平台的时间。 目前,通用的解决方案并不能满足PHP集群化应用发展的需求。总体来说,有一下几个方案的困难需要解决: • 系统升级的瓶颈问题:目前已有的解决方案总是把问题集中在一个单一的中心节点上面。为此 ,限制了其方案的处理能力,为集群应用的发展造成了困难。 Zend 公司是应许多客户的要求的情况下,开始Session clustering 模块的开发的。这么客户一直被实现Session共享而带来的系统消耗等问题而困扰。作为PHP发展的主要推动者,Zend公司强烈意识到这个问题的严重性。客户放映的问题主要是集中在Session共享的安全性和多余资源投入。在Zend的Session共享的解决方案出现之前,客户往往要搭建复杂和昂贵的框架添加数据库服务器等硬件来实现Session共享。但是这样的框架还经常无法提供稳定、可靠的Session跨服务器的解决方案。而且,这种复杂的框架还经常给商业应用的稳定性带来错误和潜在的危险。 Zend的新的Session Clustering 的模块(Zend Platform 的部件之一) 就为提供一个综合的Session跨服务器的解决方而开发的。并在这个方案中,有效地解决了上述几个解决方案存在的问题了。更为重要地,没有为现有客户增加成本。 在Zend session clustering 的解决方案中, sessions “居住” 在它第一次被生成的服务器上。同时,这些Session可以别同一个集群服务器所共享。这意味着Zend的解决方案从根本上解决了Session不能跨服务器的问题,并提供了较高的性能。同时,它的系统升级特性也可以让客户呢功能有效地使用现有的系统资源,并简便、迅速地升级。 |
|
Figure: 2 – SC 架构 图 2 给我们展示了Session集群管理的几大部件: Session 的存储 : 可以选择存储在内存或者是存储在硬盘并在内存进行缓存。 SCD守护进程: Session clustering 守护进程, 把Session信息从Session被存储的地方提取出来提交 给PHP engine,或是从集群里别的服务器上提取并提交给PHP engine。 mod_cluster PHP扩展: 是一个PHP的session处理负责与SCD守护进程的通信。 |
|
Zend的session clustering 模块使用了强大的加锁和数据完整性机制来实现session 数据的安全性。在使用Session clustering 时,可以随时地切换两种不同的session存储模式:硬盘或只在内存。这种存储方式也提供了错误恢复的功能,因为如果发生了不可预测的故障时,能够及时恢复Session数据。 Zend的session clustering 模块对现有的PHP的兼容性很强,同时不影响其它的扩展的正常使用,也不需要修改任何代码。Zend Platform的session clustering 的解决方案就是集成了一个PHP的扩展。同时,在PHP.ini里面也可以选择是用现有的解决方案还是session clustering 模式。 结论 Zend的session clustering 模块从技术上来说,比现有的几个解决方案都更加成熟,也是现今唯一的能迅速实现系统升级的解决方案。Session clustering用较低的成本来实现PHPde 集群应用,并可以给客户带来无法比拟的性能、稳定性和数据完整性。. Zend的 session clustering 的解决方案也是目前唯一的一个能够集成到PHP的解决方案。因为实现session clustering的设计与代码编写都是在PHP的架构下实现的。 下面列出的是session clustering与其它方案的比较: • 线性系统升级:在系统架构中不再存在瓶颈问题。新加入的服务器能有效地发挥出应有的性能效益。同时,Session clustering 也不会给现有的网络架构和设备增加额外的负担。 |