2009-09-16 82 views
2

现在,我的站点由一台服务器提供服务,但我预计很快需要增加服务器容量。我不想在多个服务器之间分割我的网站,而是需要跨服务器管理会话,我希望拥有多个具有相同代码库的Web服务器,并使用基于路由器的循环负载共享将用户分配到每个服务器。而且一旦用户点击一个Web服务器,让他在整个会话期间与该Web服务器保持联系。据我所知,我不需要任何特殊的asp.net代码来实现这一点。ASP.NET站点的负载共享

没有人有这种做法的任何警告或意见?

回答

1

你在说些什么叫做粘性会话或会话亲和力。如果你的路由器支持这一点,那么你是黄金。

唯一caviat是负载平衡不会是完美的。如果你有几个高负载用户在同一台​​服务器上随机结束,他们将在那里静静地等待会话结束。

我已经实现了这种负载均衡的,我的工作,而且不需要特殊的asp.net代码来实现。

1

大多数(perhap全部)负载平衡器确实有强制执行,其中在同一个IP用户定向到在每次请求相同的Web服务器“粘性”会话的能力。无需更改代码即可完成此操作。有两个注意事项可以想到:

  1. 使用粘性会话将意味着流量负载将不会像在不使用粘性会话时那样平均分配。但是,分配应该是“足够”IMO。
  2. 使用代理服务器的用户中,只有很小比例的用户可能会在不同的请求上使用不同的IP。这些用户在传递到不同的服务器时可能会遇到“奇怪”的行为。
1

此配置的另一个特点是,如果您的服务器出现故障,该服务器上的用户会话也将丢失其会话。我认为这是最常用的设置之一,因为如果路由器支持粘性会话或会话亲和性,它不需要任何开发工作。

1

正如其他人所说,你应该能够打开粘性会话的负载平衡器,应该照顾大多数的“留一台服务器上”的问题给你。

但是,您将希望确保您已设置适当的位置来处理用户在错误的服务器中间会话中登陆 - 粘滞会话通常基于IP地址,并且如果您运气不好,用户IP可以更改中间会话,或者服务器可能会脱机,并且用户将被引导至其他服务器。

你应该确保你的MachineKeys是所有服务器相​​同的 - 这将确保你能正确解密的视图状态的所有服务器上。

如果您有自己的服务器,你可以在machine.config做到这一点,否则你可以在web.config中的应用程序级别设置它,更多的细节可以在此找到如何:

Configure MachineKey in ASP.NET 2.0

如果您在IIS 7上运行,则会有一些细微的差异。5 - Tess Ferrandez在最近的帖子“Forms authentication fails after installing IIS 7.5”中有更多细节。

您可能要做的另一件事是将您的sessionState从InProc移到Sql或StateServer。

+0

@Zhaph - Ben Duguid:我是这方面的新手。你的评论增加了一些混淆。您的注意事项是针对Web场景,其中所有Web服务器都可以根据先前请求中的哪一个请求进行请求。虽然@langekg询问有关基于IP地址提供所有请求的单个Web服务器。但是,如果他根据您的解决方案配置Web场,他应该能够配置所有服务器可以根据负载来请求任何请求的内容。请你可以更新我的想法。 – Nirlep 2009-09-20 18:19:02

+0

Hi Neil,最初的问题是:“我希望有多个Web服务器都具有相同的代码库,并使用基于路由器的循环负载共享来将用户分配给每个服务器。” - 这对我来说听起来像一个农场。将流量引导到基于IP的服务器是路由器的一项功能。我的答案是指出,在不改变他的代码基础的情况下,只需对配置进行一些调整即可,他将能够在他的设置中添加弹性,以便如果服务器因任何原因而脱机,那么用户不会失去他们的会话,因为它们被移动到其他服务器。 – 2009-09-21 07:49:26