【IT168 评论】
一、概要:
现如今随着Web网络继续为企业提供一种经济的销售他们商品和服务的方式,我们仍将会看到更多基于Web应用的投资。Web的一个内部特征,和当我们设计、维护其web基础架构时企业所面临的一个最常见的技术问题,就是用户浏览器和web服务器间的一种无状态交互。这种无状态交互对于随机访问页面或点击超链接时可能是非常好的,然而,就像在线银行和电子商务一样还是有许多web应用需要了解在网站上用户的交互和当前状态。无法妥善地进行存储和访问安全认证,或添加、删除的列可能被放置在虚拟购物车里,可能导致灾难性的后果。
就像我们所知道的cookie一样,然而,Cookie是Web服务器发送给Web浏览器的体积很小的纯文本信息,以文本文件的形式存放在用户的计算机中,这些Cookie一般用于保存用户的访问状态,当用户再次访问同一个网站时会将这些Cookie信息发送回服务器,使得服务器能够恢复用户上一次的访问状态。使用Cookie的根本目的是为了在用户访问期间实现不同页面之间的数据传输,以解决HTTP无状态的问题。Cookie技术能够增强网站的服务功能,为用户带来方便。但是Cookie还有许多限制和不足,针对Cookie技术的局限性,就提出了会话(Session)的概念,并将会话技术集成在语言中。会话是指用户访问Web服务器期间存放在Web服务器上的所有与用户访问状态有关的信息。每次新创建的会话都有一个唯一的标识串,称为会话ID,会话ID被保存在Web服务器中,其它会话信息都在会话ID的索引下进行保存和读取。一次会话从创建到被删除的时间称为会话生存期,会话生存期的长短由会话管理机制决定。Cookie与会话的不同之处在于:Cookie将用户访问的状态信息通过Web浏览器存放在用户计算机中,而会话通过会话管理机制存放在Web服务器中。
在本节中,我们将探讨MySQL和MySQL集群如何使用一种经济有效、高性能、开源的以数据为中心的会话(session)管理解决方案。
二、会话管理解决方案:
由于网络已经给企业销售诸多商品和服务,当访问他们的网站时,企业一直致力于为用户预计更好的体验。确保企业能够继续在网络上取得成功的关键因素就是更高的客户满意度和品牌忠诚度,从而确保不发生类似潜在的客户突然成为竞争对手网站上的客户那样令人沮丧的情况。因为当浏览页面时,所有购物车里的产品丢失将会影响bottom-line(底线)。一个有效的session管理策略应该是每个企业在线策略的一组成部分。当设计一个session管理架构时,对研究这些sessions将如何以一种开放、可靠和高性能方式来进行访问才是有意义的。
Session管理的一个摆在首要的技术原因就是它自身的HTTP协议。这个协议用于在浏览器和网络服务器间的通信,它是无状态的。‘无状态’意味着HTTP协议并不保存任何有关从Web服务器中用户请求哪些网页的信息或一些交互/事务。而我们所说的会话就是用户访问Web服务器期间存放在Web服务器上的所有与用户访问状态有关的信息。许多传统的数据库应用使用sessions来帮助控制用户交互,而一些其他的应用使用session是来降低服务器端的处理和资源消耗情况的。
浏览器 VS 服务器端的解决方案
当在处理一个请求时,应用程序通常需要使用另一个请求的结果。例如,请求添加一列,当在一个虚拟书店里浏览时把一本书放到购物车里,需要记住的就是当在checkout时知道什么时候创建了一个预订请求。换言之,在HTTP请求时需要存储应用的状态。有两个常见的方式来实现这一点:通过cookies在浏览器里存储定义会话状态的变量,和包括每个请求,或使用cookie在服务器上存储这些变量。(网络,应用程序或数据库级)
Cookies是一种很好的解决方案,如果在浏览器和服务器的请求间,应用程序并不需要保存大或复杂的数据集。但是也有一些限制。 例如,浏览器可以限制他们从任何域存储来的Cookie数量,甚至限制其大小。就像每台用户计算机一般只允许存放300个Cookie,同一个Web服务器只能发送20个Cookie等。而有关Cookie的隐私和安全也将影响到您的会话管理策略,特别是他们通过终端用户在浏览器里禁用它。
另一个常见的方式就是在服务器端存储和管理session(web,应用程序,数据库)。使用服务器端的会话管理,得记住会话变量和为每个会话存储的数据。随着流量的增长, 所以在服务器端支持session。另外加上数据的大小和复杂度,将使得扩展性和性能问题很有可能就会快速加升。
另一个考虑就是对于session数据得存储多久的安全问题,由于HTTP的无状态性,用户什么时候完成一个session和它不在网站上就不知道。一些交互可能需要用户去登录、使用注销、对一个旧的会话数据进行删除。然而,这往往是不实际可行的。在没有删除这些session时有一个风险,不仅是由于在服务器上消耗的资源,而且是那些旧的session可能需要知道什么是’session-hijacking(会话劫机)。在删除这些旧session状态前,超时多久得依赖应用和企业的需求。
三、数据库层的会话管理:
据我所知道,我们可以把session保存在web服务器的三种不同的地方(内存、文件和数据库),而这3种机制又各自有他们的特点和优点。而本文中主要介绍的就是关于数据库层的会话管理机制。而基于数据库的会话管理是最容易扩展的,它需要web服务器有一个网络数据库系统的支持,而所有的会话信息全部保存在这个数据库中,而我们这里所提到的网络数据库系统就是MySQL数据库。而在MySQL数据库系统的支持下会话管理能够充分利用数据库的事务处理、安全存取、数据完整性检验等机制,有效地管理所有的会话信息。这些特点下面都会有讲到。会话信息在数据库中相互之间是很容易建立起逻辑联系,设计出统一快速的存取方法。所以这个机制是特别适用于大型的web网站。我们使用MySQL数据库来存储session变量。而A session variable keeps a value on all pages for the appropriate session handling functionality you may be leveraging(会话变量用来保存您可以利用合适的会话处理功能页面的值)。他们的特点包括如下:
--平台互操作性;
--性能&吞吐量;
--高效锁和事务支持;
--可扩展性;
--负载平衡;
--安全性;
--高可用性和MySQL集群;
--管理session数据&超时;
--唯一、定制的最终用户体验。
3.1 平台互操作性:
无论您为您的应用选择什么平台,MySQL都是及可能支持它的。下列支持的平台包括:
red hat linux, suse linux, solaris, windows, HP-UX
利用MySQL数据库的另一好处就是它所支持得各种语言。不管您是否正使用php,.net,jave,perl,MySQL数据库都提供支持,和与数据库连接的接口。而我们所知的LAMP(Linux,apache,MySQL,php/perl)就是默认的形式,它的意思是允许session管理策略充分利用LAMP的开源特征和低的TCO,(在所有组件组成的架构里)。一个基本的会话管理架构图如下:

3.2 性能&吞吐量:
由于HTTP协议的无状态性,应用程序可能需要反反复复从服务器端请求资源。 例如,一个在银行或金融网站上的用户请求做一些复杂的运算,和把各种账目分类等一系列操作。这反过来又可能在各种数据库上创建或执行许多复杂的SQL语句,或在应用服务器上调用数学运算操作和函数。而使用一个会话变量的应用可以重复使用已由用户请求过的结果 ,so that this performance hit does not have to occur more then is necessary. (以便性能率没有以使这一表现没有达到出)。
比起在传统文件系统上或专有/闭源数据库(就是商业数据库)上,使用MySQL来存储这些session变量,可以对session管理架构提供更好的整体性能提升。在下图中,是一个关于MySQL和专有/关闭(商业)开源数据库性能特征的图形描述,,在2002年2月25日由eWeek在“ Server数据库冲突”发表的。

不论是为这种可能非常短暂的数据要求事务的完整性,MySQL提供了一个插件式存储引擎来满足session管理设计的需求。 MySQL还包括许多不同特征的存储引擎。比如说:MyISAM, InnoDB, NDB,而这三种对session管理而言是最受欢迎的选择。他们的一些较显着特点列举如下:
--MyISAM: 高性能、高效存储;
--InnoDB: 支持事务、行级锁;
--NDB: 集群-支持高可用性、内存和磁盘存储;支持事务。
使用MySQL数据库的另一原因就是请求所生成的I/O总量。而对文件系统的读和写可能导致一个影响整体网站的瓶颈。而php的会话变量 。对支持限制少量用户的会话请求和很少的并发会话数是非常好的。然而潜在的瓶颈就是存储和修改的会话上升了,更多的请求作为一个结果被提出。幸运的 是,这仅仅是一个默认的,php能很好的与MySQL一起来作为会话管理存储。
3.3 高效锁 & 事务支持
当使用一个基于文件的会话管理时,可能会遭遇到的瓶颈之一就是文件系统无法提供一个有效的锁机制。我们知道,在文件会话管理机制里,它的会话信息一般是以文本文件的形式存放在web服务器的硬盘上的。而当使用MySQL时,MySQL会提供一些存储引擎,在处理锁时更有效,如果应用程序需要,它能提供各种事物级的支持。使用基于MySQL的会话管理系统,inserts,updates,deletes和并发访问都将更具扩展性和健全性。(pdf上估计有的单词写错了,没有按原文翻译)。
3.4 扩展性和负载平衡:
一个使用session的应用是有限的,在这么多中,每一个HTTP请求都必须处理用于session变量下的请求。关于记录状态的信息,由于一个请求的结果需要另一请求的变量。其实就是我们知道的,如果这个sessionID存在就只要检索它就行。 通常,在Web服务器上执行会话的应用程序将存储他们的会话变量。 例如,当在网络上用户初次浏览一个网页时,创建session,而所有后续的请求,希望进一步浏览、搜索、添加、删除购物车中的物品,或登录、注销,都必须在保存会话变量的Web服务器上处理。这种结构使许多应用使用HTTP来分配通过多个Web服务器的请求,因此不能容易实施扩展的方法,为了处理越来越多的要求。下图是一个在web服务器上存储会话变量的应用:

系统组件间有2个基本策略用来进行负载均衡:静态和动态负载均衡。
静态的负载均衡
也就是作业的初始放置问题,已经得到了广泛的研究,可是由于在一定时刻获取全局状态的精确信息是不可能的,而且根据该不精确信息做出的调度又不能更改,因而其效果有限。
动态负载均衡
也就是根据处理结点的负载情况动态地改变分配给它的作业量策略,希望能最好地解决各个节点之间的均衡。大多数情况下,动态负载均衡要比静态负载均衡性能提高大约30%。
在MySQL数据库里,可以采用的一个策略就是使应用程序能够利用多个Web服务器来存储这些session变量。MySQL的扩展能力如下图所示:

MySQL提供了一种可扩展性需求,通过全球访问最频繁的网站,不仅对session管理,而且还为其他应用程序组件,如以数据库,事务和商务智能/数据仓库。使用商业化硬件与开源软件的LAMP组件的扩展架构能力是能让您的应用去扩展和把成本仍然保持在控制之中。使用MySQL的另一个好处是可选的、易于使用、复制,扩展到另一角度是能实现故障转移、性能或维护功能。
3.5 安全:
对web架构的session介绍就是他们本身对黑客提供一种闯入该系统的方式。会话的无效控制往往会声称自己是一个基于网络应用程序最脆弱的领域。有各种基于会话类型的攻击和其中许多可以被定为模拟攻击,也被称为“会话劫机” 。而所谓的'会话劫机'就是发生攻击者试图接管2台计算机间所建立的TCP会话的时候。在这个攻击类型中,攻击者试图通过冒充该用户来访问其他用户的会话。例如,劫机用户的会话可允许用户查看已保存的设置,其中可能包括个人敏感信息,或在匿名身份下粘贴到论坛里。至少,这些攻击的类型要求恶意用户获得有效的会话标识符sessionID,因为这是用于身份验证最起码的信息。
攻击者获得一个有效的session标识最少有3种方法:
--prediction(预测);
--capture(捕获);
--fixation(固定);
‘预测’攻击就是包括猜测一个有效的会话标识符来获得访问。
‘捕获’攻击是很容易的,因此更加平常。当使用cookies来存储sessionID时,使用它,因此,一个web浏览器的弱点就是利用它来获得这个信息。
‘固定’攻击欺骗受害者使用由攻击者选择的sessionID。如果成功了,它将选择最简单的方法来获得一个正确的session id.
使用MySQL数据库来作为会话管理执行的一部分能提供一个安全补充层,通过转移这些会话标识符到数据库层。虽然使用数据库作为会话存储并不能确保您的应用程序无法破解,它只会因此变得更困难和复杂。
MySQL自带一套内置安全特征,包括:
--一套基于ACL的安全模式;
--支持yaSSL;
--数据加密;
--从主机和IP地址到列级的细粒度访问系统;
--权限管理系统能够连接和执行数据操作;
--登录连接语句;
3.6 高可用性和MySQL集群
有时会话管理架构需要我们使用的数据库也能达到5个9的高可用性,在没有降低性能或预算的情况下。为了达到可用性和扩展性要求,典型的应用是使用昂贵的商业集群方案或是大的SMP系统。而使用MySQL集群,一方面能非常高效地扩展,达到高可用性,保持高性能特征,与商业系统比起来花费一小部分费用。
MySQL集群就是MySQL数据库的一个高端版本,尤其设计用于容错性,需要扩展和高可用性的关键应用,它还支持把数据存储在内存或磁盘上,通过shared-nothing来集群,并不需要昂贵的共享存储来扩展。
在下图中是一个会话管理架构利用MySQL集群来作为一个会话存储:

3.7 管理会话数据和超时
当与session一起使用时得考虑到另一问题就是他们的使用可导致同步问题。由于HTTP的无状态特性,当用户完成应用时是没有办法知道的。而与此相反,应用程序不使用HTTP协议,就可以面临一个关于删除连接或清理状态的事实,它会代表用户即使忘记去使用logout(注销)常规,这往往会引发case(事件)。然而,当用户正在通过网络开展session,服务器已经无法知道,如果用户意外或有目的地结束session.因此,对session的数据能保存多久作出了一个决定。
由于在MySQL 5.0里存储过程的介绍,我们现在提供了一个有效的方法来处理session数据的常规分析、删除和管理超时。最主要的好处就是,它与数据库提供了一个更有效的交互方式,因为你没有准备和执行数个不同的查询来执行相同的操作。(应该指出在一个带存储过程或不带的会话管理架构中使perl,php,java或.net )
使用MySQL数据库,我们能创建表来存储下列关于session的信息:
--variables: 变量名和值。例如,在几秒内一个理想的会话超时变量;
--users:存储一个用户email,名字,密码、上次登录和访问次数;
--sessions: 存储cookie,userid,开始session和访问次数;
--logins: 这可能就包括一个过去登录的情况和登录失败的情况;
我们能使用存储过程来最小优化往返和对数据库的影响:
--login:检查login的凭证;
--cookies: 在cookie上返回一个userid;
--password: 更改或创建login和password;
--session维护:删除旧的session和历史性地归档。
下面是一个例子,关于在MySQL数据库里调用存储过程:

3.8 一个定制、独特的终端用户体验:
利用会话来创建一个定制、独特的终端用户体验。这就是说可以在对用户直接感兴趣的网页上来实现的。它是否以他们可能有兴趣的产品或广告,网页表现格式,或提醒他们注意特价或促销活动。有关会话的信息不仅导致更好的整体客户满意度更好,而且加强他们忠诚度的可能性,并返回到购买更多的商品和服务。无论您将打算存储的会话数据是多么复杂或动荡。
在任何情况下,MySQL都提供了一个很好的存储介质。就像我们将看到的一个关于Evite的案例研究。没有使用MySQL可能无法实现让客户满意度个性化水平。
四、Evite使用MySQL的会话管理案例:
Evite是在1998年成立的一个关于免费在线活动规划服务,它是全球最具领导性的互动媒体公司之一,该网站提供有600万用户并每月达900万的邀请。它的巨大成功导致惊人的流量,比去年增长80% ;
Evite已使用为期四年的oracle来满足他们所有的数据管理要求。然而,他们发现orcale公司的软件是非常昂贵并对少经验的员工使用时是非常困难的。该公司还需要一个数据库来提供他们性能和可扩展性,以满足他们潜在的成指数增长的流量。仅仅一年后,MySQL就变成evite IT基础设施的一个关键组成部分,并取代昂贵的商业的解决方案。几乎Evite网站的每一网页都是MySQL,MySQL驱使关键应用的数据仓库、跟踪和会话管理应用。
Evite用户可以创建个性化的网上邀请。用户可以查看本地活动来符合特定的兴趣,保持了个性化地址簿,和共享照片,使其成为一个高度定制化并丰富的体验。通过使用MySQL,Evite使他们来跟踪每一个用户Evite session的状态。在没有数据或状态消失的情况下,任何Evite网络服务器能够参加session,无论哪种具体web服务器或服务器组的问题。
经一度使用oracle之后, Evite选择MySQL是因为其性能优越,MySQL在高峰时段超过1000万的查询(能力)是非常优越的。每天服务超过5百万的网页,并允许evite以符合成本效益地扩展每年成80%增长的流量。
五、Neckermann.de 和MySQL 集群
karstadtQuelle AG的电子商务附属公司neckermann.de用MySQL集群取代了原有的数据库系统,当neckermann.de开始为在线存储的会话数据规划一个新的平台时,该公司的重点就是降低运营成本和提高灵活性。德国的电子商务零售商发现它一直寻找在linux下运行MySQL集群和基于英特尔芯片的刀片服务器硬件。
当它提出来作为新的解决方案时,Neckermann.de 公司雇佣MySQL AB公司专业的服务组织来提供援助,将MySQL集群使用到其应用中去,包括帮助调优性能。 Michael Sorg说:“在MySQL顾问的帮助下,我们能够在短期内建立一个高性能的数据库系统,以满足需求”。 Neckermann.de公司的媒体负责人GmbH说。 “会话数据的管理需要数据库以快速、可靠的过程频繁、重复读和写请求。现在我们已经成功地为Neckermann.de公司完成了MySQL集群的部署,和将着手为我们的其他子公司推出这一解决方案。
为了更有效地响应和迅速地越来越多的客户需求,Neckermann.de公司要求以具有集群商用刀片式服务器的扩展方案的多处理器系统来取代目前的扩展化策略,为了实现这一目标,该公司成功地评估了MySQL集群。
Neckermann.de的原24-路Unix服务器已被换为基于intel技术的双处理器刀片服务器。 MySQL集群对于会话数据管理而言是主要的管理系统。
六、为什么选择M ysql呢?
因为MySQL 为会话管理提供了下列诸多特性:
特征 | 优点 |
插件式存储引擎 | 您决定使用哪种存储引擎取决于您基于会话管理策略上的应用需求。 |
性能 | 在上面关于性能的图中可知,MySQL是一个高性能的数据库。您是否需要基于内存或磁盘的数据,低的I/O。MySQL能提供这种特性。 |
事务 | 在msyql数据库中也是非常重要的特征。我们能提供合适的锁和隔离级别来满足您应用的需求。 |
复制 | 使用MySQL主从复制,企业将提高扩展性和高可用性以适用潜在增长的需求。MySQL复制是非常容易设置的,也允许复杂的链接复制技术来完成更大的扩展性。 |
查询缓存 | 在同一个数据集里会话可能经常需要重复运行一样的查询。返回一样的结果集。MySQL查询缓存对结果集进行缓存(处理),来提高性能。 |
优化连接处理 | MySQL连接处理是优化web,提供高性能,并且是可扩展的。MySQL不需要复杂的连接池来提高扩展性。 |
安全 | 安全特征包括数据加密、SSL等 |
集群-高可用性 | MySQL集群可以为用户和Web服务提高会话数据的可用性。同时具备优于传统集群数据库产品的性价比。 |
版权声明:
本文由上海爱可生信息技术有限公司根据甲骨文公司官方文档翻译整理而成,版权归属甲骨文公司,转载请保留此版权声明。