多Web服务器之间共享Session的解决方案

  很多开发中涉及到用户的Session验证很保留的问题,这个问题比较有意思,总结了几种方案,只供参考。

  [  问题提出 ]

  为了满足足够大的应用,满足更多的客户,于是我们架设了N台Web服务器(N>=2),在多台Web服务器的情况下,我们会涉及到一个问题:用户登陆一台服务器以后,如果在跨越到另一台服务器的时候能够继续使用客户的Session?

  (以下描述方案只是针对Linux/Unix + Apache + Mysql + PHP的开发架构,当然,也可以扩展到其他平台。)

  [  问题解决方案 ]

  既然我们的问题已经摆在面前了,那么就要从技术角度去解决问题,给我们的客户更好的体验,总结了几个方案。

  1. 写客户端Cookie的方式

  当用户登陆成功以后,把网站域名、用户名、密码、token、session有效时间全部采用cookie的形式写入到客户端的cookie里面,如果用户从一台Web服务器跨越到另一台服务器的时候,我们的程序主动去检测客户端的cookie信息,进行判断,然后提供对应的服务,当然,如果cookie过期,或者无效,自然就不让用户继续服务了。当然,这种方法的弊端就不言而喻了,比如客户端禁用了cookie或者cookie被黑客窃取了呢?

  2. 服务器之间Session数据同步的方式

  假设Web服务器A是所有用户登陆的服务器,那么当用户验证登陆一下,session数据就会写到A服务器里,那么就可以自己写脚本或者守护进程来自动把session数据同步到其他Web服务器,那么当用户跳转到其他服务器的时候,那么session数据是一致的,自然就能够直接进行服务无须再次登陆了。缺点是,可能会速度慢,不稳定,如果是单向同步的话,登陆服务器出现问题,那么其他服务器也无法服务,当然也可以考虑双向同步的问题。

  3. 利用NFS共享Session数据的方式

  其实这个方案和下面的Mysql方案类似,只是存储方式不一样。大致就是有一台公共的NFS服务器(Network File Server)做共享服务器,所有的Web服务器登陆的时候把session数据写到这台服务器上,那么所有的session数据其实都是保存在这台NFS服务器上的,不论用户访问那太Web服务器,都要来这台服务器获取session数据,那么就能够实现共享session数据了。缺点是依赖性太强,如果NFS服务器down掉了,那么大家都无法工作了,当然,可以考虑多台NFS服务器同步的形式。
(关于NFS的经典文章:http://linux.vbird.org/linux_server/0330nfs.php)

  4. 利用Mysql数据库共享Session数据的方式

  这个方式与NFS的方式类似,也是采用一台Mysql服务器做共享服务器,把所有的session的数据保存到Mysql服务器上,所有Web服务器都来这台Mysql服务器来获取Session数据。缺点也是依赖性太强,Mysql无法工作了影响所有的Web服务器,当然,可以考虑多太Mysql数据库来共享session,使用同步Mysql数据的方式。

  (Mysql同步我写过文章:http://blog.csdn.net/heiyeshuwu/archive/2005/10/31/520007.aspx)

  5. 使用硬件设备

  这个算是比较成熟的解决方案了,使用类似BIG-IP的负载设备来实现资源共享,那么就能够又稳定又合理的的共享Session了。目前很多门户网站采用这种方式。缺点很明显了,就是要收费了,硬件设备肯定需要购买成本的,不过对于专业或者大型应用来讲,是比较合理并且值得的。
(关于BIG-IP设备:http://www.f5.com.cn/channel.php?channel=product&type=BIG-IP-%D3%A6%D3%C3%C1%F7%C1%BF%B9%DC%C0%ED&id=36)

  以上这些只是我的个人愚见,没有经过试验,不保证其准确实在性,只是提供一种想法和参考。

时间: 2024-10-31 00:38:41

多Web服务器之间共享Session的解决方案的相关文章

ASP.NET实现跨子站点和跨服务器之间的session共享

问题描述 请问,在ASP.NET系统中,如何实现二级域名子站点和跨服务器之间的session共享呢?求指点. 解决方案 解决方案二:估计不能,还是估计不能.解决方案三:cookies可以二级域名共享HttpCookiecookies=newHttpCookie();cookies.Domain="baidu.com";解决方案四:引用2楼liuchaolin的回复: cookies可以二级域名共享HttpCookiecookies=newHttpCookie();cookies.Dom

range协议-有关web服务器之间的沟通问题

问题描述 有关web服务器之间的沟通问题 遇到一个问题:两个web服务器之间是如何沟通的,好像是range协议,但完全不懂什么是range协议,也不知道如何入手查询解决这个问题,麻烦大神为我解答,万分感谢,已经两次遇到这个问题了,都不会回答,很尴尬,很期待能够明白!!! 解决方案 http中的range的作用是发送一个文件的一部分,实现断点续传.不知道和服务器通讯有什么关系.

如何在多台服务器上共享Session(PHP/JSP/ASP.NET)以及单点登录(SSO)

如何在多台服务器上共享Session(PHP/JSP/ASP.NET)以及单点登录(SSO)   Apache Session复制: http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html   使用Memcached来共享PHP Session: https://www.digitalocean.com/community/tutorials/how-to-share-php-sessions-on-multiple-memcache

Linux服务器之间共享网络文件系统(NFS)操作概要

当您想在装有Linux和Windows的计算机之间共享磁盘空间的时候,Samba通常是您可选择的解决方案.当磁盘需要在Linux服务器之间共享时,网络文件系统(NFS)协议就会被调用. Linux的数据存储磁盘包含存储于标准目录结构文件系统中的文件夹.附加的磁盘通过附接或者挂载的方式加载.它们的文件系统将被转换为已存在于计算机磁盘的文件系统.这实际上使得被加载硬盘出现在它所挂载的文件系统的子目录中. NFS允许计算机系统通过将远程计算机挂载到本地文件系统,使得能够像访问本地磁盘一样访问远程计算机

Tornado Web服务器中处理空白字符的解决方案_服务器其它

Tornado模板引擎一直有一个坑,有时候你可能觉得并不影响正常使用,但强迫症就是受不了:模板会去掉每行前后的空格. 最后出来的页面就是这样: 不缩进真的很影响心情的好吧,特别是对一个python开发者. 国外一些Q&A对这个情况也有一些讨论,其中提到比较多的就是compress_whitespace.在github找到一个issue:https://github.com/tornadoweb/tornado/issues/178,就是在抱怨空白字符的问题.空白字符在<pre>中被去除

JSP与ASP.Net之间的Session值共享

asp.net|js|session   介绍:ASP.NET中登录后,JSP可以用ASP.Net中的Session的值 这个话题刚开始,宝宝(itbaby.jss.cn)的思路是ASP.NET中序列化Session以二进制数据保存到数据库,然后由JSP读取数据库中的二进制数据反序列化成Session对 象,再强制转化成JAVA的Session对象,在JAVA端转换时,出现了错误,找遍网上的资料也没能解决,故采用一种替换的方式. 替换的方式的思路: 登录的ASPX文件中,在登录成功后将Sessi

让JSP与ASP.Net共享Session值

asp.net|js|session     这个话题刚开始,我的思路是ASP.NET中序列化Session以二进制数据保存到数据库,然后由JSP读取数据库中的二进制数据反序列化成Session对象,再强制转化成JAVA的Session对象,在JAVA端转换时,出现了错误,找遍网上的资料也没能解决,故采用一种替换的方式. 替换的方式的思路:     登录的ASPX文件中,在登录成功后将Session中的变量值保存到数据库中的一张表,关键字使用ASP.NET的Session对象的SessionID

jsp和asp.net共享session值示例代码

 介绍ASP.NET中登录后,JSP可以用ASP.Net中的Session值,大家参考使用吧  思路是ASP.NET中序列化Session以二进制数据保存到数据库,然后由JSP读取数据库中的二进制数据反序列化成Session对象,再强制转化成的Session对象,在JAVA端转换时,出现了错误,找遍网上的资料也没能解决,故采用一种替换的方式.   替换的方式的思路:   登录的ASPX文件中,在登录成功后将Session中的变量值保存到数据库中的一张表,关键字使用ASP.NET的Session对

jsp和asp.net共享session值示例代码_实用技巧

思路是ASP.NET中序列化Session以二进制数据保存到数据库,然后由JSP读取数据库中的二进制数据反序列化成Session对象,再强制转化成的Session对象,在JAVA端转换时,出现了错误,找遍网上的资料也没能解决,故采用一种替换的方式. 替换的方式的思路: 登录的ASPX文件中,在登录成功后将Session中的变量值保存到数据库中的一张表,关键字使用ASP.NET的Session对象的SessionID,然后建立一个ASPX文件,取得当前登录用户的SessionID,并使用的ASP.