代码之家  ›  专栏  ›  技术社区  ›  royse41

网络负载平衡场景中的会话状态

  •  3
  • royse41  · 技术社区  · 15 年前

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

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

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

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

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

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

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

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

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

    我发现了很多关于这个问题的相互矛盾的文档,如果有人能深入了解他们以前/将来是如何做的,我将不胜感激。

    还有(当我在这里的时候!),管理系统允许你上传文章的图片。我正在考虑在服务器2和3上设置一个虚拟目录,它将指向管理站点上上传目录的网络共享映射,有什么理由不赞成这样做吗?

    抱歉我的无知,这是我未知的领域!

    谢谢,肖恩

    4 回复  |  直到 15 年前
        1
  •  4
  •   RPM1984    15 年前

    取决于你想要什么样的国家服务。

    一般来说,在负载平衡的情况下,您会选择SQL Server会话或ASP.NET状态服务。

    每个都有其pro/con(SQL Server会话需要序列化/反序列化,但如果服务器发生故障,则保持状态;如果服务器发生故障,则ASP.NET状态不保持状态,但由于没有序列化/反序列化,因此速度要快得多)。

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

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

        2
  •  2
  •   matt-dot-net    15 年前

    此外,还需要确保会话中存储的所有对象都标记为[Serializable]

        3
  •  1
  •   Rob Levine    15 年前

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

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

    这种方法的优点是您可以继续使用普通会话状态,从而简化服务器配置和设置。

    新的 会话到另一台服务器,但必须继续将现有会话发送到同一台服务器。)

        4
  •  0
  •   Cheshire Cat    15 年前

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

    推荐文章