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

Dan*_*ira 9 session cluster-analysis

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

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

那么,在这种情况下......

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

编辑:经典ASP有一些解决方案吗?

Til*_*ill 7

扩展@ yogman的答案.

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

即使我提到分布式它基本上就像在一个备用/空闲服务器上启动一个实例一样简单,你可以将其配置为ip,port和使用多少内存并完成.

memcached -d -u www -m 2048 -l 10.0.0.8 -p 11211
Run Code Online (Sandbox Code Playgroud)

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

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

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

memcached的API 通常应该可用.我说应该是因为我只知道Perl,Java和PHP.但我确信,例如在Python中人们也有办法利用它.有一个memcached wiki,如果你需要指针,或者如果我太过分了,请在评论中告诉我.;)


ine*_*ine 6

有三种方法可以在ASP.NET中存储会话状态.第一个是进程中,变量存储在内存中.第二种是通过将以下内容放在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" />
Run Code Online (Sandbox Code Playgroud)

正如您在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"
/>
Run Code Online (Sandbox Code Playgroud)

有关所有这些选项的更多详细信息,请参见此处:http://www.ondotnet.com/pub/a/dotnet/2003/03/24/sessionstate.html


Chr*_*rts 0

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

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