如何部署零停机ASP.NET应用程序(How to deploy an ASP.NET Applic

2019-07-19 16:53发布

若要部署我们的网站,我们做以下的新版本:

  1. 拉上新的代码,并将其上传到服务器。
  2. 在直播服务器,删除从IIS网站目录中的所有活的代码。
  3. 提取新代码的压缩文件到现在空IIS目录

这个过程是所有脚本,并很快发生,但仍然可以是10-20秒停机时的旧文件被删除,新的文件正在部署。

在0秒的停机时间的方法有什么建议?

Answer 1:

您需要2个服务器和负载平衡器。 下面是步骤:

  1. 打开服务器2上的所有流量
  2. 服务器1上部署
  3. 测试服务器1
  4. 打开服务器1上的所有流量
  5. 服务器2上部署
  6. 测试服务器2
  7. 打开两个服务器上的交通

事情是,即使在这种情况下,你仍然必须重新启动应用程序和会话的损失,如果您正在使用“粘性会话”。 如果您有数据库会话或状态服务器,那么一切都应该罚款。



Answer 2:

在微软Web部署工具支持这种在一定程度上:

使Windows事务文件系统(TxF的)支持。 当启用TxF的支持,文件操作都是原子; 也就是说,他们要么成功或完全失败。 这可确保数据的完整性和防止现有的“中途”或损坏状态数据或文件。 在MS部署,TxF的默认情况下禁用。

看来交易整个同步。 此外,TxF的是Windows Server 2008中的功能,因此本次交易功能将不能与早期版本。

我相信这是可以修改你的脚本使用文件夹,版本和IIS元数据库0停机时间:

  • 在现有的路径/网址:
    • 路径 :\网络\程序\ 2.0 \
    • 网址 : HTTP://应用
  • 新的(或修改)的网站复制到服务器下
    • \网络\程序\ 2.1 \
  • 修改IIS元数据库来改变网站的路径
    • \网络\应用\ 2.0 \
    • \ WEB \程序\ 2.1 \

这种方法具有以下优点:

  • 倘若新版本有一个问题,你可以很容易地回滚到V2.0
  • 要部署到多个物理或虚拟服务器,你可以使用你的脚本文件部署。 一旦所有的服务器有了新的版本,你可以同时改变使用Microsoft Web部署工具的所有服务器的元数据库。


Answer 3:

您可以利用应用程序请求在IIS路由上的不同端口的两个本地IIS站点之间的软件负载均衡器实现在一台服务器上零停机时间部署。 这被称为蓝绿部署策略 ,其中只有两个站点之一是在负载均衡器可在任何给定的时间。 部署到“瘫痪”的网站,暖起来,并把它纳入了负载均衡器(通常是由路过一个应用程序请求路由健康检查),然后取原站点上涨,走出了“池子”(再次通过使其健康检查失败)。

一个完整的教程可以在这里找到。



Answer 4:

我通过这个去最近,我想出了一个解决办法是有两个网站在IIS中设置并在它们之间进行切换。

对于我的配置,我对每个A和B这样的网站的web目录:C:\局域网\活一个\接口C:\局域网\活乙\接口

在IIS中,我有两个相同的网站(相同的端口,认证等),每个都有自己的应用程序池。 其中一个网站的运行(A),另一种是停止(B)。 实时单也有活的主机头。

当涉及到部署到生活,我只是发布到停止的网站的位置。 因为我可以通过它的端口访问B位,我可以预先暖站点,以便第一个用户不会导致应用程序的开始。 然后使用批处理文件复制我实况主持人头B,停止A和B.启动



Answer 5:

使用Microsoft.Web.Administration的ServerManager的类,你可以开发自己的部署代理。

关键是要改变VirtualDirectory,导致新老网络应用程序之间的在线原子开关的PhysicalPath。

请注意,这可能会导致新旧应用程序域并行执行!

问题是如何改变数据库等同步

通过查询与旧的或新的PhysicalPaths的AppDomain的存在有可能的时候,老的AppDomain(S)已终止检测,如果新的AppDomain(S)已经开始了。

要强制一个AppDomain开始你必须做出一个HTTP请求(IIS 7.5支持自动启动功能)

现在,你需要一种方法来阻止新的AppDomain请求。 我使用了一个名为互斥体 - 这是创建和部署代理拥有的,等待由新的Web应用程序的的Application_Start,然后通过部署代理发布一次的数据库更新已经作出。

(我用的标记文件的Web应用程序,以使互斥等待行为)一旦新的Web应用程序正在运行,删除的标记文件。



Answer 6:

行,所以既然大家都downvoting我在2008年写了归途*答案...

我会告诉你我们是怎么做的,现在在2014年,我们不再使用的网站,因为我们正在使用ASP.NET MVC现在。

当然,我们并不需要一个负载平衡器和两个服务器来做到这一点,那很好,如果你对你保持每个网站3台服务器,但它是为大多数网站总矫枉过正。

此外,我们不依赖于微软的最新向导 - 太慢了,太多隐藏的魔法,太容易改变它的名字。

下面是我们如何做到这一点:

  1. 我们有复印件生成的DLL为“滨酒馆”文件夹后生成步骤。

  2. 我们除了使用比较(这是极好的**),以验证和同步更改的文件(通过FTP,因为,获得广泛支持)到生产服务器

  3. 我们有一个包含在“滨酒吧”到“斌”一个按钮,一切复制网站上的安全网址(以先备份来实现快速回滚)。 此时应用程序重新启动。 那么,我们的ORM检查是否有需要添加和创建它们的任何表或列。

这只是毫秒的停机时间。 该应用程序重新启动可能需要一两秒钟,但在重启过程中请求被缓冲,有效的零停机时间。

整个部署过程需要5秒到30分钟,这取决于有多少文件被更改多少变化审查。

这样,您就不必整个网站复制到不同的目录,但只是bin文件夹中。 您还可以在过程中完全控制,并确切地知道正在发生变化。

**我们总是这样的,我们正在部署的变化快速眼球 - 作为最后一分钟的仔细检查,所以我们不知道怎么测试,如果有什么休息,我们准备好了。 我们除了使用比较,因为它可以让你通过FTP轻松差异文件。 我绝不会做这种没有BC,你不知道你正在改写。

*滚动到底看到它:( BTW我将不再推荐网站,因为他们是慢打造,可与半编译临时文件严重崩溃。我们用他们过去,因为他们允许更灵活的文件通过文件部署非常快,以解决一个小问题,你可以看到你正在部署什么。(如果使用的当然是无法比拟的 - 否则算了吧)。



Answer 7:

唯一的零点停机时间的方法我能想到的包括举办至少2台服务器。



Answer 8:

我会改进乔治的回答一下,如下,一台服务器:

  1. 使用Web部署项目到现场预编译成一个DLL
  2. 拉上新的网站,并把它上传到服务器
  3. 它解压缩到位于与该站点的正确权限的文件夹中的一个新的文件夹,因此解压缩文件继承正确的权限(也许是E:\网络,包括子文件夹v20090901,v20090916等)
  4. 使用IIS管理器更改文件夹包含网站名称
  5. 保留旧的文件夹中有一段时间了,所以你可以回退到它在出现问题时

第4步将导致IIS工作进程循环。

这是,如果你不使用的是InProc会话只有零停机时间; 使用SQL模式,而是如果你可以(甚至更好,完全避免会话状态)。

当然,这是一个涉及多一点,当有多个服务器和/或数据库的变化....



Answer 9:

为了扩大sklivvz的答案,这依赖于具有某种负载平衡器(或只是同一服务器上的备用副本)

  1. 直接所有交通站点/服务器2
  2. 可选稍等一下,以保证尽可能少的用户尽可能对部署的版本挂起的工作流程
  3. 部署到网站/服务器1,预热时间尽可能
  4. 执行数据库迁移事务(力争使这成为可能)
  5. 立即将所有流量网站/服务器1
  6. 部署到网站/服务器2
  7. 直接流量到两个站点/服务器

这是可能引进一点烟雾测试,通过创建一个数据库快照/复制,但是这并不总是可行的。

如果可能的话,需要使用“路由的差异”,如不同承租人URL:S(customerX.myapp.net)或不同的用户,以部署到豚鼠的不知情组第一。 如果没有失败,发布给大家。

由于数据库迁移都参与其中,回滚到以前的版本往往是不可能的。

有一些方法可以使应用程序在这些情况下,如使用事件队列和回放机制发挥更好,但因为我们在谈论部署变化的东西,在使用中,真的没有傻瓜证明的方式。



Answer 10:

这就是我要做的事:

绝对最低系统要求:
1个服务器

  • 1个负载平衡器/反向代理(例如nginx的)端口80上运行
  • 2 ASP.NET核/单声道反向代理/ fastcgi的的chroot监狱或码头的容器侦听2个不同的TCP端口
    (或者甚至只有两个在2个不同的TCP端口反向代理应用程序没有任何沙箱)

工作流程:

开始交易myupdate

try
    Web-Service: Tell all applications on all web-servers to go into primary read-only mode 
    Application switch to primary read-only mode, and responds 
    Web sockets begin notifying all clients 
    Wait for all applications to respond

    wait (custom short interval)

    Web-Service: Tell all applications on all web-servers to go into secondary read-only mode 
    Application switch to secondary read-only mode (data-entry fuse)
    Updatedb - secondary read-only mode (switches database to read-only)

    Web-Service: Create backup of database 
    Web-Service: Restore backup to new database
    Web-Service: Update new database with new schema 

    Deploy new application to apt-repository 
    (for windows, you will have to write your own custom deployment web-service)
    ssh into every machine in array_of_new_webapps
    run apt-get update
    then either 
    apt-get dist-upgrade
    OR
    apt-get install <packagename>
    OR 
    apt-get install --only-upgrade <packagename>
    depending on what you need
    -- This deploys the new application to all new chroots (or servers/VMs)

    Test: Test new application under test.domain.xxx
    -- everything that fails should throw an exception here
    commit myupdate;

    Web-Service: Tell all applications to send web-socket request to reload the pages to all clients at time x (+/- random number)
    @client: notify of reload and that this causes loss of unsafed data, with option to abort 

    @ time x:  Switch load balancer from array_of_old_webapps to array_of_new_webapps 
    Decomission/Recycle array_of_old_webapps, etc.

catch
        rollback myupdate 
        switch to read-write mode
        Web-Service: Tell all applications to send web-socket request to unblock read-only mode
end try 


Answer 11:

我建议保留旧的文件那里,只是覆盖它们。 这样的停机时间限制为单文件覆盖次,只有过一个文件在同一时间失踪。

不知道这有助于在“Web应用程序”,但(我认为你说这是你使用的是什么),这就是为什么我们总是用“网站”。 还以“网站”部署不重新启动您的网站,并删除所有用户会话。



文章来源: How to deploy an ASP.NET Application with zero downtime