扩展ASP.NET应用程序

时间:2010-12-28 21:56:06

标签: c# asp.net session scalability web-farm

这是一个非常广泛的问题,但希望我能得到有用的提示。目前我有一个在单个服务器上运行的ASP.NET应用程序。我现在需要扩展以适应不断增加的客户负载。所以我的计划是:

1)将ASP.NET和Web组件扩展到五台服务器上。

2)将数据库移动到服务器场。

我不相信我会对数据库产生问题,因为就应用程序而言,它只是一个IP地址。但是,我现在担心ASP.NET和Web层。我已经担心的一些问题:

  • 最简单的模型是仅实现一个负载均衡器,它会以循环方式将请求分配给五个服务器中的每一个?

  • HTTPS和SSL连接是否有问题,现在每次发出请求时它们都可以在不同的物理服务器上终止? (例如,表现?)

  • 是否有关于通过Cookie进行会话维护(登录)的问题?我的猜测是否定的,但无法解释为什么......; - )

  • 会话数据本身(存储服务器端)是否有任何问题?显然,我需要在服务器之间复制会话状态,或以某种方式强制请求只转到单个服务器。不管怎样,我在这里看到了一个问题......

5 个答案:

答案 0 :(得分:3)

正如David所说,这个问题的大部分内容更像是一个管理问题,并且可能对ServerFault有用。他发布的链接有很好的信息。

对于您的Session问题:您将需要查看会话状态服务(IIS作为单独的服务来维护多个服务器之间的共同状态)和/或存储asp.net会话状态在SQL数据库中。你可以在David Stratton的链接中找到两个选项,我敢肯定。

从很大程度上讲,一旦设置了进程外会话状态,它就会变得透明。但它确实要求您在Session中存储Serializable个对象。


Round-Robin DNS是在这种情况下进行负载均衡的最简单方法,是的。它没有考虑每台服务器上的实际负载,也没有任何一台服务器可能因维护而停机的规定;任何拥有该特定IP的人都会将该网站视为“关闭”,即使其他四台服务器可能正在运行。

负载平衡和处理SSL连接可能都受益于反向代理类型的情况;代理处理所有进入的连接,但它所做的只是加密并平衡对Web服务器的实际请求负载。 (当然,这些问题更多地放在政府当局,但......)


如果所有Web服务器都将自己宣传为同一个网站(通过主机标头等),那么Cookie就不会成为问题。每个服务器都乐意接受使用相同域名的任何其他服务器设置的cookie,而不知道或关心服务器发送的是什么;它基于Web浏览器在获取cookie值时连接的服务器的主机名。

答案 1 :(得分:2)

这是一个非常广泛的问题,很难在像这样的论坛中完全回答。我甚至不确定问题是否属于这里,或者它是否应该在serverfault.com。然而....

Microsoft提供了有关该主题的大量指导。从BING“扩展asp.net应用程序”的第一个结果就是这个。

http://msdn.microsoft.com/en-us/magazine/cc500561.aspx

答案 2 :(得分:1)

我只想提出你应该关注数据库的领域。

首先,大多数仅使用单个数据库服务器构建的数据模型需要进行大量更改才能在多主机模式下支持数据库服务器场。

如果您使用自动递增整数作为主键(大多数人都这样做),那么您基本上已经搞砸了。有几种方法可以暂时缓解这种情况,但即便是这些方法也需要大量的猜测并且具有很高的碰撞潜力。一种缓解措施包括将每台服务器上的种子值设置为足够高的数字,以减少发生冲突的可能性......这通常会有一段时间。

当然,您必须弄清楚如何跨服务器对用户进行分区......

我的观点是,这个区域不应轻易刷掉,而且几乎总是比通过将数据库服务器放在更大的硬件上来“扩展”数据库服务器更难以实现。

如果您故意构建具有多主角色的数据模型,那么请忽略。 ;)

关于会话:不要相信“粘性”会话,粘性不是保证。坦率地说,我们的东西通常被部署到服务器场,所以我们完全禁用了get get的会话状态。移动到服务器场之后几乎没有理由使用会话状态,因为必须从状态服务器检索数据,反序列化,序列化并在每次单页加载时将其存储回状态服务器。

考虑到公共数据库和网络流量以及他们的目的是减少数据库和网络流量,那么你就会明白他们不再为你买东西了。

答案 3 :(得分:0)

我看到了与循环http / https会话相关的一些问题。我们曾经在进程会话中使用并告诉负载均衡器使会话变得粘滞。 (我认为他们使用cookie)。

它让我们避免SQL会话,但意味着当我们从http切换到https时,我们的F5盒子无法保持粘性。我们最终改为SQL会话。

您可以调查将加密推送到负载均衡器。我记得那是我们问题的可能解决方案,但唉,不是我们调查的那个。

答案 4 :(得分:0)

SQL服务器上的会话数据库可以通过少量代码轻松扩展。配置更改。您可以将asp.net会话粘贴到会话数据库,无论您的服务器场中的哪个Web服务器提供请求,基于会话ID的sql状态服务器映射都可以完美运行。这可能是使用SQL Server扩展ASP.NET会话状态的最佳方法之一。有关更多信息,请阅读链接True Scaleout model for session state