如何将网站部署到生产中,对用户的影响最小

时间:2010-12-08 01:17:54

标签: asp.net iis deployment

我正在努力寻找最佳的服务器架构解决方案,将每月更新部署到Asp.net外部公众网站。我正在寻找的方法是发布一个新版本的网站,对用户的影响最小。除了部署标准方式(即停止IIS,在现有网站上复制新网站,启动IIS),那里有哪些“更好”的解决方案?如果他们保持会话并且在更新期间不必看到“正在维护的网站”消息,那将是很好的。

我的服务器配置

我们有2个IIS Web服务器(2003),并且正在尝试找出将它们用于部署的最佳方法。我的第一个想法是使用最新版本更新非活动Web服务器。然后优雅地将Web流量指向该服务器,对用户的影响最小(最好的情况是,用户不会丢失其会话)。您将如何“重新”从服务器1到服务器2的“重新发布”流量?更改防火墙NAT?更改DNS记录?其他方式?我们需要能够在发布新更改(duh)后立即测试实时站点。

顺便说一下,我们正在使用nant和cruise控件来自动化构建,并使用自定义Web服务将构建部署到生产中。所以只需点击一下按钮就可以自动完成。

使用第三台服务器可以实现更好的解决方案吗?如果是这样的话?

3 个答案:

答案 0 :(得分:2)

嗯,这里有几件事情:

  • 首先,考虑使用负载平衡解决方案。 Windows 2003服务器附带Windows负载平衡(WLBS),尽管它不是最好的产品。但它是免费的。有了它,您可以将所有流量指向一个服务器,更新它,然后执行相反的操作。

  • 其次,您可能需要考虑如何使用会话。 HTTP是无状态的,这意味着只要您可以在任何页面命中重建用户的会话,您应该没问题。实现这一目标的一个理想步骤是使用ASP.NET Forms身份验证 - 由它编写的cookie不依赖于ASP.NET会话。当然,这种方法会带来更大的风险 - 如果用户在复制文件时遇到问题,用户将有机会获得错误屏幕。然后,当应用程序池刷新时会有延迟。

总的来说,更好的选择是负载平衡。尽管如此,考虑尝试第二个选项 - 如果用户无法粘贴到池中的某个服务器,则可以重新生成的会话可以正常工作。

答案 1 :(得分:2)

我们的方式是

我们有一个来自netscaler的负载均衡器,

从负载均衡器中取出一个网络服务器,执行所有部署,执行iisreset并将其放回负载均衡器中。

对server2做同样的事情。

最后使loadbalancer缓存无效。

答案 2 :(得分:1)

为了简洁,只想添加它。在我之前的工作中,我们使用以下设置实现了无缝部署:

ASP.NET webserver seamless deployment

负载均衡器将指向生产ASP.NET Web服务器(在您的情况下为两个,但我们有三个),并且Web服务器将其会话设置从专用于托管OutOfProc ASP.NET会话的第三个服务器提取。

要部署站点,我们将其中一台服务器从负载均衡器中拉出来,更新文件,将其重新启动,然后将其放回负载均衡器池中。重复其余的网络服务器。

因为每个网络服务器从一个中央服务器获取会话数据,所以取出一个网络服务器,没有注销该服务器上的用户。

如果我们的代码更改与现有会话数据不兼容,我们要等到计划的维护时段进行部署。否则,具有该会话数据的用户在注销之前会收到错误。

此外,由于此设置依赖于Web服务器,因此如果您想提高可靠性,可以将OutOfProc更改为基于SQL的会话服务器。您需要多个服务器来复制相同的会话数据库并将Web服务器指向它们。更复杂,但会减少网站停机时间。