网络负载平衡方案的会话状态

时间:2010-07-20 11:56:22

标签: asp.net database session-state load-balancing

我们目前已为网站设置了当前服务器:

  • 服务器1:管理系统&数据库
  • 服务器2:公共站点
  • 服务器3:公共站点

使用Windows网络负载平衡系统管理服务器2和3。它们都运行公共站点代码的副本。

网站严重依赖会话,因为它们使用用户登录,我的问题是:

如何在服务器之间保留状态?

公共网站的web.config目前如下所示:

<sessionState mode="StateServer" cookieless="false" timeout="40" stateConnectionString="tcpip=localhost:42424"/>

当然,这只是将“localhost”更改为我要存储会话的I.P的情况?我正在考虑使用数据库服务器来存储会话,所以它看起来像这样:

<sessionState mode="StateServer" cookieless="false" timeout="40" stateConnectionString="tcpip=databaseserverIP:42424"/>

这是明智的吗?

我发现了很多关于这个主题的相互矛盾的文档,并希望有人能够深入了解他们之前/将会如何做到这一点。

另外(虽然我在这里!),管理系统允许您上传文章的图像。我正在考虑在服务器2和3上设置一个虚拟目录,这将指向网站共享映射到管理站点上的上传目录,是否有任何理由不赞同这个?

为我的无知道歉,这对我来说是一个未知的领域!

谢谢,肖恩

4 个答案:

答案 0 :(得分:4)

取决于您想要的州服务。

通常在负载均衡的情况下,您需要使用SQL Server会话或ASP.NET状态服务。

每个都有它的pro / con(SQL Server会话需要序列化/反序列化,但是如果服务器崩溃则保持状态,如果服务器故障转移,ASP.NET状态不会保持状态,但由于没有序列化/反序列化,因此更快)。

无论如何,考虑在单独的独立机器上托管服务 - 因此它不会与其他进程争夺资源。

关于这两者的讨论需要您进一步研究 - 就像您是否主要关注可用性或速度一样。

请记住,如果要在Web服务器(即webfarm)之间共享会话,则需要将每个服务器的machineKey设置更新为相同。

Here's关于ASP.NET会话状态的一篇好文章(以及我提到的machineKey问题)。

答案 1 :(得分:2)

您应该使用SQL数据库来存储会话。设置mode =“SqlServer”并运行aspnet_regsql将会话表添加到数据库中。

此外,您需要确保会话中存储的任何对象都标记为[Serializable]

答案 2 :(得分:1)

另一种需要考虑的方法是“粘性”会话。

这是您将负载均衡器配置为始终将给定“会话”指向同一个框的位置。大多数(如果不是全部)商业负载平衡器都支持这一点。基本上,他们插入自己的会话cookie或http标头,用于标识给定的用户会话。然后,此会话将始终路由到同一个框(除非它已关闭)。

这种方法的专家是您可以继续使用普通会话状态,因此它简化了您的服务器配置和设置。

缺点是您没有故障转移冗余,因为丢失单个服务器仍会导致其上的所有会话丢失,加上它会影响整体负载平衡性能,因为它无法动态调整如果一台服务器开始过载(它可以将会话路由到另一台服务器,但必须继续将现有会话发送到同一台服务器。)

答案 3 :(得分:0)

如果你想要可用性(即任何服务器都可以使用会话而不考虑服务器故障)那么SQL路由是可行的方法,但你也可以查看ScaleOut SessionServer(http://www.scaleoutsoftware.com/pages/products/scaleout-sessionserver.php

干杯