一个站点下有两个应用程序池或根虚拟目录

一个站点下有两个应用程序池或根虚拟目录

这可能听起来像是一个非常愚蠢的问题,所以让我先说一下我想要实现的目标,然后再继续我的问题,即我如何设想这样的事情运作。

我正在尝试将我们的 Web 应用程序完全无缝地部署到 IIS(不中断用户或活动连接)。

我设想的实现方法是让两个根虚拟目录共享同一个站点。我所说的根虚拟目录是指 IIS 内部创建的目录,并将其分配给每个站点或 Web 应用程序的根目录;但这里我希望有两个这样的根虚拟目录(每个都绑定到自己的应用程序池,但都引用来自不同的文件夹)。 在正常运行期间,其中一个 vdir 将处于非活动状态。

在进行部署时,我会将新代码放入第二个(非活动)vdir 引用的另一个文件夹中,然后将其标记为活动。我想要实现的是让 IIS 开始发送所有新的连接(请求相同的站点)迁移到使用新代码的第二个虚拟目录,但保持旧虚拟目录处于活动状态,直到所有剩余连接都断开(某些连接,例如文件上传,可能会长时间运行)。一旦所有剩余连接都断开,旧虚拟目录/应用程序池将变为非活动状态,而使用新代码的第二个虚拟目录/应用程序池将成为唯一活动状态。

我希望这是有道理的。

如果没有的话,我尝试用一​​个例子来解释一下。

--- Web Site ("mysite.com")
    --- Root VDir#1 (IIS Internal, App Pool: AppPool#1, Virtual Path: /, Physical Path: C:\inetpub\MySite.v1084\). ACTIVE
    --- Root VDir#2 (IIS Internal, App Pool: AppPool#2, Virtual Path: /, Physical Path: NONE). INACTIVE

在部署期间,Root VDir#2 将变为活动状态,其物理路径将更改为 C:\inetpub\MySite.v1085。这将是 IIS 为所有新连接提供的默认 vdir。一旦与 Root VDir#1 的所有活动会话/连接都终止,它就会变为非活动状态。

这样的事可能吗?还有其他方法可以做这样的事吗(我知道 IIS 中有某种形式的内置负载平衡(“Web Farms”?)但我不太熟悉它)。

答案1

您所提议的听起来像是 A/B 交换。(类似问题

有一个 IIS 插件工具来自微软的 Web Deploy。它将自动执行将更新的代码部署到 IIS 的大部分物理动作,但无缝迁移的要求是棘手的,因为您有长时间运行的文件事务。处理此问题的最佳方法是获取负载平衡器,同时运行您网站的两个生产实例,并使用第三个实例进行暂存更新。

(顺便说一句,Azure 正在使用“云服务”做类似的事情——有一个“交换”命令可以完成同样的事情。)

回到您的特定设置,考虑以下配置:

一台 IIS 计算机,两个网站。网站 A 和网站 B。它们不指向相同的文件。它们有自己的文件夹。网站 A 在线并为生产中的用户提供服务,而网站 B 处于离线状态。当您准备更新时,您可以更新网站 B,然后切换网站 A 的开启/关闭状态。现在 B 处于在线状态,而 A 处于离线状态。这是 A/B 轮换。稍后,当您进行下一次更新时,您可以更新 A,然后切换网站 B 的开启/关闭状态。现在 A 处于在线状态,而 B 处于离线状态。

交换时,可能会丢失流量(并且可能会终止这些文件传输),但如果您的应用程序流量较少,可能没人会注意到(您决定)。但是,如果这是任务关键、流量较大的站点,请获取负载平衡器并按照其他人描述的方式使用它。

据我所知,WebDeploy 不会做的是交换站点 A 和站点 B。为此,您需要编写脚本并在命令行中执行

Web Deploy + 脚本的好处是您最终可以自动化这一过程,并将其与持续部署系统结合起来。

使用此设置可能无法保存长时间运行的文件传输。另一个挑战是应用程序的任何内存状态。如果您的 Web 应用程序是使用内存数据设计的,那么在进行 A/B 交换时您将丢失它。如果程序员正在使用会话,您可能能够打开会话服务。会话数据将与应用程序的其余部分不在同一个进程中,并且可能会在 A/B 交换后继续存在。与您的程序员讨论应用程序如何管理内存数据。也许它实际上没有任何内存数据。也许它可以在应用程序重新加载后轻松重新创建——(例如从数据库重建缓存)

相关内容