如何创建 ASP.NET 网络场?

Posted

技术标签:

【中文标题】如何创建 ASP.NET 网络场?【英文标题】:How to create an ASP.NET web farm? 【发布时间】:2010-12-21 11:11:03 【问题描述】:

我正在寻找有关如何创建 ASP.NET 网络场的信息 - 即如何使 ASP.NET 应用程序(最初设计为在单个 Web 服务器上运行)运行2、3、10等服务器?

我们创建了一个 Web 应用程序,它可以在同时有 500 个用户的情况下正常工作。但现在我们需要让它为 10 000 个用户工作(同时使用网络应用程序)。

所以我们需要设置 20 台网络服务器并做出一些事情,以便 10 000 名用户可以通过在他们的网络浏览器中输入“www.MyWebApp.ru”来使用网络应用程序,尽管他们的请求将由 20 个网络服务器处理,而他们并不知道。

1)是否有特殊的标准软件来创建ASP.NET网络农场

2) 或者我们应该自己创建一个网络农场,通过手动在不同的网络服务器之间传输请求(使用 ASP.NET / C# )?

我在 Web 上发现的关于 ASP.NET 网络场和可伸缩性的信息非常少:在大多数情况下,关于可伸缩性的文章会告诉您如何优化 ASP.NET 应用程序并使其运行得更快。但我没有找到在 2 个网络服务器上运行的 “Hello world”-like ASP.NET web 应用程序的示例。

如果有人可以发布一篇文章的链接,或者更好地讲述自己在 ASP.NET“网络农场”和解决可扩展性问题方面的经验,那就太好了。

谢谢你, 米哈伊尔。

【问题讨论】:

我来晚了,但这里描述了一个好的起点:docs.microsoft.com/en-us/iis/web-hosting/… 【参考方案1】:

1) 是否有专门的标准软件 创建一个 ASP.NET 网络场?

没有。

2) 或者我们应该创建一个网络农场 我们自己,通过转移请求 手动在不同的 Web 服务器之间 (使用 ASP.NET / C#)?

没有。

要构建网络农场,您需要某种形式的负载平衡。对于多达 8 台左右的服务器,您可以使用 Windows 内置的网络负载平衡 (NLB)。对于超过 8 台服务器,您应该使用硬件负载平衡器。

但是,负载平衡实际上只是冰山一角。您还应该解决许多其他问题,包括:

    状态管理(cookies、ViewState、会话状态等) 缓存和缓存失效 数据库加载(管理往返、分区、磁盘子系统等) 应用程序池管理(WSRM、池重置、分区) 部署 监控

如果有帮助,我会在我的书中介绍其中的许多问题:Ultra-Fast ASP.NET: Build Ultra-Fast and Ultra-Scalable web sites using ASP.NET and SQL Server。

【讨论】:

非常感谢你,理查德!我们将尝试在您的书中查找信息! Richard,***说“NLBS 旨在用于 .. 无状态应用程序”(en.wikipedia.org/wiki/Network_Load_Balancing_Services)。这些信息是否正确?我们的应用程序绝对是“有状态的”! 该声明在技术上是正确的,但它也具有误导性。 HTTP 本身被认为是一种“无状态”协议。在高层次上发生的第一件事是,来自客户端的每个传入请求都可以定向到您的任何一个 Web 服务器。该功能由 NLB 或硬件负载平衡器执行。为了让任何服务器都能够处理每个请求,您的应用程序状态不能存储在单个 Web 服务器上;它要么需要以某种方式(例如 ViewState)跟随请求,要么包含在 HTTP 标头(cookie)中,要么存储在后端数据库中。 Microsoft Web Farm Framework 算不算“标准软件”? iis.net/downloads/microsoft/web-farm-framework【参考方案2】:

我会说你应该配置一个 NLB 集群(网络负载平衡),它基本上在集群节点之间拆分所有请求(并且作为额外的好处,可以检测事情是否出现故障并停止向它们发送请求)。 Windows 中为此内置了一些功能,但它们在性能或可扩展性方面无法与硬件设备进行比较。如果您使用的是 Windows 2008,那么设置一个确实很简单。如果您这样做,请确保您有一个共享的machine key,否则您将开始收到视图状态无效的异常(当一台服务器提交表单并将其发布到另一台服务器并且他们使用不同的密钥对数据进行编码时)。

您也可以使用 DNS 循环,但在 20 台服务器(大概位于 1 个数据中心)中,我认为没有必要进行如此疯狂的长度。如果您有多个数据中心,尽管这绝对值得考虑(因为 NLB 在数据中心之间不能很好地工作)。

您还需要确保用户在交换服务器时不会丢失会话。最简单的方法是使用会话状态数据库(可在 web.config 中配置,或者您可以在 IIS 的配置中在服务器范围内进行)。如果您不使用会话,只需在 web.config 的 Pages 指令中将其关闭即可。您也可以使用会话状态服务器,但我对此没有任何经验。

还可能值得考虑花一些时间优化代码或向静态内容添加缓存指令 - 即使您只减少对其中一些服务器的需求,它也可能非常划算。

希望对您有所帮助。

【讨论】:

感谢您的回答!然后,我们将开始查找有关 NLB 的信息以及您在回复中提到的其他内容。【参考方案3】:

如果您保持服务器无状态,那么使用实现一些轮询协议(将每个调用发送到单个发布的服务器 ip 到不同的 Web 服务器)的好路由器很容易。

如果它不是无状态的(例如 - 如果需要登录或 ssl),那么您需要将每个会话保持在同一台服务器上。

这里是一些关于 MS 应用程序请求路由的信息 - 你会在那里得到一切:

IIS Load balancing

【讨论】:

粘性连接(“将每个会话保持到同一服务器”所必需的)充其量应该被视为临时黑客;它们不具备可扩展性,并且会带来很多麻烦,包括容量规划困难、服务器故障时连接丢失等。【参考方案4】:

我不推荐#2。使用负载均衡器会做得更好。

注意会话状态管理。除非您将负载平衡器配置为让每个用户都在同一个 Web 服务器上,否则您将不得不使用会话状态服务器或数据库。

另外,请检查您的代码对应用程序和缓存变量的使用情况。这些在每个 Web 服务器上都会有所不同。如果这些值是静态的,则您可能没有问题。但如果它们可以更改,您最终可能会在每个 Web 服务器上得到不同的值。

以前在 1.x 中 ViewState 存在问题,as explained here。我不确定这个问题是否仍然存在。

然后,您需要对 web.config 中的机器密钥进行一些更改,如 here 所述。

【讨论】:

以上是关于如何创建 ASP.NET 网络场?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复访问被拒绝路径错误asp.net应用程序访问网络共享

如何在 ASP.NET MVC 3 中为填充的下拉列表创建视图模型

Paypal 表单破坏了我的 ASP.NET 网络表单布局 -> 如何解决?

如何在 ASP.Net 网络表单中使用标签?

ASP.NET:如何在 Web 应用程序之间共享资源(成员资格、库)

如何在 VSTS Build 中将 asp.net 项目发布到文件系统