如何以零停机时间部署ASP.NET应用程序
要部署我们网站的新版本,请执行以下操作:
- 压缩新代码,然后将其上传到服务器。
- 在实时服务器上,从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。