首页 > 架构 > ZendPlatform Session 跨服务器解决方案白皮书

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 无法及时获取正确的用户信息的问题,并最终导致用户使用上的不方便。

Session 集群化管理

Zend之前的一些解决方案:
负载均衡Session方案

通过负载均衡服务器把特定的HTTP请求指定到相同的服务器。存在着一些不足:

• SessionID与服务器的对应很难成功地保持。在没有HTTP协议校验的前提下,HTTP协议很容易丢失目标。而且,因为负载均衡的性能问题使用HTTP协议进行校验是不稳定的。
• 如果在负载均衡服务器上面启用Session定向,将不利于负载均衡服务器本身的运行特性。尤其是在使用了了流行的NAT技术后,影响更加明显。
• 为了达到SessionID与服务器的对应的目的,负载均衡将需要花费相当昂贵的系统消耗来实现。
• 当负载均衡服务器的为了实现Session功能的时候,它的负载将会急速上升,并逐渐地成为了服务器集群升级的的瓶颈。在集群服务器上添加服务器将会因为负载均衡的的瓶颈问题而变得困难。
通过NFS系统来共享Session的方案
因为负载均衡实现Session共享的局限性,有人开始尝试用NFS来共享。通过集群中的NFS文件服务器来实现,从而来实现集群里的服务器的Session应用。甚至有人觉得通过负载均衡服务器来实现Session共享会变得没有必要,而且可以使得网络的硬件投入得到减少,DNS轮询都能够满足Session的应用。
但是这种方法同样存在着一些局限性:

• 数据完整性: NFS的文件加锁机制在许多场合下是不合适的。这种情况有可能导致Session的数据很容易出错。
• 速度缓慢:从NFS文件系统提取Session数据远远比本地提取耗时,同时网络的架构也将影响数据的传输速度。
• 将所有的数据都存储在一个服务器上意味着这是一个系统故障点:如果NFS服务器出现了故障,整个PHP应用系统将无法工作。为此就必须为NFS服务器配置更多的设备和更完善的电源管理。但是,这也是一个很大的资金投入,同时,他还是没有从根本上解决单一故障点的问题。因为NFS的网络接口还是一个。
• 系统升级: 把系统所有的数据都存放在一个中心节点伴随着的一个问题是系统的升级变得困难,而中心点就是系统升级的一个瓶颈。所以,往集群里面增加服务器所带来的效益将为因为这个瓶颈问题而被降低。
• 安全性: NFS 一直以来都被认为是一个安全性比较差的协议。许多专业的IT公司也因此放弃了NFS网络文件系统。
• 持续的硬件投入

采用数据库来存放Session信息

第三种解决Session不能跨服务器的方法是把共享的Session放在一台相应的数据库服务器中。这种方法也有效地解决了NFS文件系统方案带来的数据完整性和有效性等问题。但是这个方案同样地存在着某些不足:

• 速度:相对本地存储来说,数据库服务器将需要在数据库处理上面占用整个PHP应用平台的时间。
• 故障点:数据库服务器还是存在着单一故障点的问题。
• 系统升级:使用数据库来存储Session这个方案同样存在着升级困难的问题。而这个问题在考虑数据库服务器的处理能力和负载的时候会显得尤为突出。

小结

目前,通用的解决方案并不能满足PHP集群化应用发展的需求。总体来说,有一下几个方案的困难需要解决:

• 系统升级的瓶颈问题:目前已有的解决方案总是把问题集中在一个单一的中心节点上面。为此 ,限制了其方案的处理能力,为集群应用的发展造成了困难。
• 性能:目前已有的解决方案往往需要过度牺牲中心节点的系统资源,所以中心节点的硬件投入比较大。
• 故障点:目前已有的解决方案都需要一个中心节点,为此整个系统存在着单一故障点的问题。这也意味着系统在运行过程中存在着较大的风险。

Zend 的解决方案

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 也不会给现有的网络架构和设备增加额外的负担。
• 速度优势:经过压力测试,session clustering 模块是现有的Session跨服务器解决方案的4到6倍的速度。
• 无故障点:如果因为不可预测的原因,有一台服务器停止服务了,损失的也只是那一台服务器的session数据,而不是整个系统。损失的数据可以迅速在其它的服务器上重新建立。
• 安全性: Session clustering’s 内在的数据完整性和加锁机制可以实现强大的Session应用。并允许高用户负载下的商业应用。
• 错误矫正: session clustering可以选择把session数据存储在硬盘当中。从而可以从系统或者内存的出错中恢复过来。
• Session clustering试你的资金投入均匀分布在服务器机群中:session clustering可以与任何的负载均衡技术环境运行(包括DNS轮询)。
• 强大的兼容性: Zend的 session clustering 解决方案提供了强大的集成特性,可以兼容现有的代码和PHP应用。现有的PHP项目可以直接移植到session clustering 解决方案当中应用。

分类: 架构 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.

=2加3(必填)请输入两数相加的结果。