如何以零停机时间部署ASP.NET应用程序

时间:2020-03-06 14:52:05  来源:igfitidea点击:

要部署我们网站的新版本,请执行以下操作:

  • 压缩新代码,然后将其上传到服务器。
  • 在实时服务器上,从IIS网站目录中删除所有实时代码。
  • 将新的代码zip文件解压缩到现在空的IIS目录中

这个过程全是脚本化的,并且很快完成,但是当删除旧文件并部署新文件时,仍然会有10到20秒的停机时间。

关于0秒停机方法有什么建议吗?

解决方案

我能想到的仅有的零停机时间方法包括在至少2台服务器上进行托管。

我们需要2台服务器和一个负载均衡器。步骤如下:

  • 打开服务器2上的所有流量
  • 在服务器1上部署
  • 测试服务器1
  • 打开服务器1上的所有流量
  • 在服务器2上部署
  • 测试服务器2
  • 开启两台服务器上的流量

事实是,即使在这种情况下,如果我们使用"粘性会话",我们仍将重新启动应用程序并丢失会话。如果我们有数据库会话或者状态服务器,那么一切都应该很好。

Microsoft Web部署工具在某种程度上支持此功能:

Enables Windows Transactional File
  System (TxF) support. When TxF support
  is enabled, file operations are
  atomic; that is, they either succeed
  or fail completely. This ensures data
  integrity and prevents data or files
  from existing in a "half-way" or
  corrupted state. In MS Deploy, TxF is
  disabled by default.

似乎该交易是整个同步的。另外,TxF是Windows Server 2008的功能,因此该事务功能不适用于早期版本。

我相信可以使用文件夹作为版本和IIS配置数据库来将脚本修改为0-停机时间:

  • 网址:http:// app
  • 到\ web \ app \ v2.1 \

此方法具有以下优点:

  • 如果新版本有问题,我们可以轻松回滚到v2.0
  • 要部署到多个物理或者虚拟服务器,可以使用脚本进行文件部署。一旦所有服务器都具有新版本,就可以使用Microsoft Web部署工具同时更改所有服务器的配置数据库。

我建议将旧文件保留在那里,然后简单地覆盖它们。这样,停机时间仅限于单文件覆盖时间,并且一次仅丢失一个文件。

尽管不确定这是否对" Web应用程序"有所帮助(我想我们是在说这就是我们正在使用的内容),这就是为什么我们始终使用" Web站点"。同样,使用"网站"进行部署不会重新启动网站并删除所有用户会话。

对于单个服务器,我将对George的回答进行一些改进,如下所示:

  • 使用Web部署项目将站点预编译为单个DLL
  • 压缩新站点,并将其上传到服务器
  • 将其解压缩到位于具有该网站正确权限的文件夹中的新文件夹中,以便解压缩的文件正确继承权限(也许是e:\ web,带有子文件夹v20090901,v20090916等)
  • 使用IIS管理器更改包含该站点的文件夹的名称
  • 将旧文件夹保留一段时间,以便在出现问题时退回到旧文件夹

步骤4将导致IIS工作进程回收。

如果我们不使用InProc会话,则停机时间仅为零;如果可以的话,请改用SQL模式(甚至更好,请完全避免会话状态)。

当然,当有多个服务器和/或者数据库更改时,它会涉及更多……。

我最近经历了这个问题,我想到的解决方案是在IIS中设置两个站点并在它们之间切换。

对于我的配置,我为每个A和B站点都有一个Web目录,如下所示:
c:\ Intranet \ Live A \ Interface
c:\ Intranet \ Live B \ Interface

在IIS中,我有两个相同的站点(相同的端口,身份验证等),每个站点都有自己的应用程序池。其中一个站点正在运行(A),另一个站点已停止(B)。实时主机还具有实时主机头。

当要进行实时部署时,我只是发布到STOPPED站点的位置。因为我可以使用其端口访问B站点,所以可以预热该站点,以便第一个用户不会导致应用程序启动。然后使用批处理文件将实时主机标头复制到B,停止A并启动B。