如何管理Web群集中的会话变量?

时间:2008-10-22 00:01:14

标签: session cluster-analysis

会话变量通常保存在Web服务器RAM内存中。

在群集中,客户端发出的每个请求都可以由不同的群集节点处理。对不对?!

所以,在这种情况下......

  • 会话变量会发生什么?它们不是存储在节点RAM内存中吗?
  • 如果其他节点没有我的会话变量,或者至少是所有会话变量,它们将如何正确处理我的请求?
  • 此问题由Web服务器(Apache,IIS)或语言运行时(PHP,ASP.NET,Ruby,JSP)处理?
编辑:是否有经典ASP 的解决方案?

8 个答案:

答案 0 :(得分:7)

延长@ yogman的答案。

Memcached真是太棒了!它是一个高性能的分布式对象缓存。

即使我提到分发它基本上就像在你的一个备用/空闲服务器上启动一个实例一样简单,你可以在ip,port中配置它以及使用多少内存并完成。

memcached -d -u www -m 2048 -l 10.0.0.8 -p 11211

(在守护进程模式下运行memcached,作为用户www,在IP 10.0.0.8上使用端口11211的2048 MB(2 GB)RAM。)

从那时起,您向memcached询问数据,如果数据尚未缓存,则将其从原始源中提取并将其存储在memcached中。我确信你熟悉缓存基础知识。

在群集环境中,您可以将memcached链接到群集中,并在节点之间复制缓存。 Memcached在Linux,Unix和Windows上运行,在任何有备用RAM的地方启动它并开始使用你的资源。

memcached的API应为generally available。我说应该因为我只知道Perl,Java和PHP。但我相信,例如在Python中,人们也有办法利用它。有一个memcached wiki,如果你需要指针,或者在评论中让我知道如果我太过狂热了。 ;)

答案 1 :(得分:6)

在ASP.NET中存储会话状态有3种方法。第一个是进程中,变量存储在内存中。第二种方法是通过将以下内容放在web.config文件中来使用会话状态服务:

<sessionState
    mode="StateServer"
    stateConnectionString="tcpip=127.0.0.1:42424"
    sqlConnectionString="data source=127.0.0.1;user id=sa;password="
    cookieless="false"
    timeout="20" />

正如您在stateConnectionString属性中看到的那样,会话状态服务可以位于不同的计算机上。

第三种选择是使用集中式SQL数据库。为此,您将以下内容放在web.config中:

<sessionState
    mode="SQLServer"
    stateConnectionString="tcpip=127.0.0.1:42424"
    sqlConnectionString=
     "data source=SERVERHAME;user id=sa;password="
    cookieless="false"
    timeout="20"
/>

所有这些选项的更多详细信息都写在这里:http://www.ondotnet.com/pub/a/dotnet/2003/03/24/sessionstate.html

答案 2 :(得分:4)

获取Linux计算机并设置http://www.danga.com/memcached。与其他方法相比,它的速度无与伦比。 (例如,cookie,表单隐藏变量,数据库)

答案 3 :(得分:3)

与各种各样的事情一样,“这取决于”。

有不同的解决方案和方法。

如上所述,会话状态(数据库,memcached,共享文件系统等)的集中存储的概念。

还有一些群集范围的缓存系统可以使群集中的所有计算机都可以使用本地数据。从概念上讲,它与集中式会话状态存储类似,但此数据不是持久的。相反,它存在于各个节点中,并使用您的提供商提供的某种机制进行复制。

另一种方法是服务器固定。当客户端第一次访问群集时,某些机制(通常是群集前端的负载均衡器)将客户端固定到特定服务器。在典型的客户端生命周期中,该客户端将把所有时间都花在一台机器上。

对于故障转移机制,群集中的每台计算机都与另一台计算机配对,因此任何会话更改都与配对计算机共享。如果客户端固定的机器遇到问题,客户端将命中另一台机器。此时,可能由于cookie,新机器发现它不是客户端的原始机器,因此它会ping原始机器和客户机会话数据的配对机器。

此时客户端很可能被固定到新机器上。

不同的平台以不同的方式进行,包括根本没有会话状态。

答案 4 :(得分:3)

使用Hazelcast,您可以使用Hazelcast分布式地图在群集中存储和共享会话,也可以让Hazelcast Webapp Manager为您完成所有操作。请查看文档了解详细信息。 Hazelcast是一个分布式/分区,超轻便,免费的Java数据分发解决方案。

此致

-talip

http://www.hazelcast.com

答案 5 :(得分:1)

要实现经典ASP的负载平衡,您可以将用户特定值存储在数据库中,并在网址中传递引用唯一ID 如下。

在数据库中维护会话表,为每条记录生成唯一ID 。第一次要存储会话特定数据时,在会话表中生成记录并将会话值存储在其中。获取新会话记录的唯一ID,并在Web应用程序中重写所有链接,以便将唯一ID作为查询字符串的一部分发送。

在您需要会话数据的每个后续页面中,使用查询字符串中传递的唯一ID查询会话表。

示例:

考虑您的网站有4个页面:Login.asp,welcome.asp,taskList.asp,newtask.asp

当用户使用login.asp页面登录时,在验证用户后,在会话表中创建记录并存储所需的会话特定值(假设用户的 登录此示例的日期/时间 )。获取新会话记录的唯一ID (假设唯一ID为 abcd )。

使用以下唯一ID附加您网站中的所有链接:

  • welcome.asp?的sessionId = ABCD
  • tasklist.asp?的sessionId = ABCD
  • newtask.asp?的sessionId = ABCD

现在,如果您要在上述任何网页中显示用户的登录日期/时间,您只需使用sessionID参数查询会话表( abcd 在这种情况下)并显示给用户。

由于标识会话的唯一值是网址的一部分,因此为该用户提供服务的任何网络服务器都能够显示正确的登录日期/时间值。

希望这有帮助。

答案 6 :(得分:0)

在ASP.NET中,您可以将会话数据持久保存到SQL Server数据库中,该数据库对于群集中的所有Web服务器都是通用的。

配置完成后(在您网站的web.config中),框架会为您处理所有持久性,您可以正常访问会话数据。

答案 7 :(得分:0)

正如Will所说,大多数负载平衡方法会在分发来自同一客户端的即将发出的请求时使用某种粘性,这意味着,除非实际服务器出现故障,否则唯一的客户端将会访问同一台服务器。

这最大限度地减少了会话数据分发的需要,这意味着只有在服务器最终发生故障时,客户端才会失去会话。根据您的应用程序,这或多或少是至关重要的。在大多数情况下,这不是一个大问题。

即使是最简单的loadbalacing方式(圆润擦DNS查找)也会产生某种粘性,因为大多数浏览器会缓存实际的查找,因此会继续查看收到的第一条记录,AFAIK。

通常是负责sessiondata的运行时,例如PHP可以定义自己的会话处理程序,例如可以将数据保存到数据库中。默认情况下,PHP将sessiondata存储在文件中,并且可以在SAN或等效文件上共享这些文件以共享会话数据。这只是我所拥有的一种理论,但从未进行过测试,因为我们认为失去会话并不重要,并且不希望出现这一点。