若要部署我们的网站,我们做以下的新版本:
- 拉上新的代码,并将其上传到服务器。
- 在直播服务器,删除从IIS网站目录中的所有活的代码。
- 提取新代码的压缩文件到现在空IIS目录
这个过程是所有脚本,并很快发生,但仍然可以是10-20秒停机时的旧文件被删除,新的文件正在部署。
在0秒的停机时间的方法有什么建议?
若要部署我们的网站,我们做以下的新版本:
这个过程是所有脚本,并很快发生,但仍然可以是10-20秒停机时的旧文件被删除,新的文件正在部署。
在0秒的停机时间的方法有什么建议?
您需要2个服务器和负载平衡器。 下面是步骤:
事情是,即使在这种情况下,你仍然必须重新启动应用程序和会话的损失,如果您正在使用“粘性会话”。 如果您有数据库会话或状态服务器,那么一切都应该罚款。
在微软Web部署工具支持这种在一定程度上:
使Windows事务文件系统(TxF的)支持。 当启用TxF的支持,文件操作都是原子; 也就是说,他们要么成功或完全失败。 这可确保数据的完整性和防止现有的“中途”或损坏状态数据或文件。 在MS部署,TxF的默认情况下禁用。
看来交易整个同步。 此外,TxF的是Windows Server 2008中的功能,因此本次交易功能将不能与早期版本。
我相信这是可以修改你的脚本使用文件夹,版本和IIS元数据库0停机时间:
这种方法具有以下优点:
您可以利用应用程序请求在IIS路由上的不同端口的两个本地IIS站点之间的软件负载均衡器实现在一台服务器上零停机时间部署。 这被称为蓝绿部署策略 ,其中只有两个站点之一是在负载均衡器可在任何给定的时间。 部署到“瘫痪”的网站,暖起来,并把它纳入了负载均衡器(通常是由路过一个应用程序请求路由健康检查),然后取原站点上涨,走出了“池子”(再次通过使其健康检查失败)。
一个完整的教程可以在这里找到。
我通过这个去最近,我想出了一个解决办法是有两个网站在IIS中设置并在它们之间进行切换。
对于我的配置,我对每个A和B这样的网站的web目录:C:\局域网\活一个\接口C:\局域网\活乙\接口
在IIS中,我有两个相同的网站(相同的端口,认证等),每个都有自己的应用程序池。 其中一个网站的运行(A),另一种是停止(B)。 实时单也有活的主机头。
当涉及到部署到生活,我只是发布到停止的网站的位置。 因为我可以通过它的端口访问B位,我可以预先暖站点,以便第一个用户不会导致应用程序的开始。 然后使用批处理文件复制我实况主持人头B,停止A和B.启动
使用Microsoft.Web.Administration的ServerManager的类,你可以开发自己的部署代理。
关键是要改变VirtualDirectory,导致新老网络应用程序之间的在线原子开关的PhysicalPath。
请注意,这可能会导致新旧应用程序域并行执行!
问题是如何改变数据库等同步
通过查询与旧的或新的PhysicalPaths的AppDomain的存在有可能的时候,老的AppDomain(S)已终止检测,如果新的AppDomain(S)已经开始了。
要强制一个AppDomain开始你必须做出一个HTTP请求(IIS 7.5支持自动启动功能)
现在,你需要一种方法来阻止新的AppDomain请求。 我使用了一个名为互斥体 - 这是创建和部署代理拥有的,等待由新的Web应用程序的的Application_Start,然后通过部署代理发布一次的数据库更新已经作出。
(我用的标记文件的Web应用程序,以使互斥等待行为)一旦新的Web应用程序正在运行,删除的标记文件。
行,所以既然大家都downvoting我在2008年写了归途*答案...
我会告诉你我们是怎么做的,现在在2014年,我们不再使用的网站,因为我们正在使用ASP.NET MVC现在。
当然,我们并不需要一个负载平衡器和两个服务器来做到这一点,那很好,如果你对你保持每个网站3台服务器,但它是为大多数网站总矫枉过正。
此外,我们不依赖于微软的最新向导 - 太慢了,太多隐藏的魔法,太容易改变它的名字。
下面是我们如何做到这一点:
我们有复印件生成的DLL为“滨酒馆”文件夹后生成步骤。
我们除了使用比较(这是极好的**),以验证和同步更改的文件(通过FTP,因为,获得广泛支持)到生产服务器
我们有一个包含在“滨酒吧”到“斌”一个按钮,一切复制网站上的安全网址(以先备份来实现快速回滚)。 此时应用程序重新启动。 那么,我们的ORM检查是否有需要添加和创建它们的任何表或列。
这只是毫秒的停机时间。 该应用程序重新启动可能需要一两秒钟,但在重启过程中请求被缓冲,有效的零停机时间。
整个部署过程需要5秒到30分钟,这取决于有多少文件被更改多少变化审查。
这样,您就不必整个网站复制到不同的目录,但只是bin文件夹中。 您还可以在过程中完全控制,并确切地知道正在发生变化。
**我们总是这样的,我们正在部署的变化快速眼球 - 作为最后一分钟的仔细检查,所以我们不知道怎么测试,如果有什么休息,我们准备好了。 我们除了使用比较,因为它可以让你通过FTP轻松差异文件。 我绝不会做这种没有BC,你不知道你正在改写。
*滚动到底看到它:( BTW我将不再推荐网站,因为他们是慢打造,可与半编译临时文件严重崩溃。我们用他们过去,因为他们允许更灵活的文件通过文件部署非常快,以解决一个小问题,你可以看到你正在部署什么。(如果使用的当然是无法比拟的 - 否则算了吧)。
唯一的零点停机时间的方法我能想到的包括举办至少2台服务器。
我会改进乔治的回答一下,如下,一台服务器:
第4步将导致IIS工作进程循环。
这是,如果你不使用的是InProc会话只有零停机时间; 使用SQL模式,而是如果你可以(甚至更好,完全避免会话状态)。
当然,这是一个涉及多一点,当有多个服务器和/或数据库的变化....
为了扩大sklivvz的答案,这依赖于具有某种负载平衡器(或只是同一服务器上的备用副本)
这是可能引进一点烟雾测试,通过创建一个数据库快照/复制,但是这并不总是可行的。
如果可能的话,需要使用“路由的差异”,如不同承租人URL:S(customerX.myapp.net)或不同的用户,以部署到豚鼠的不知情组第一。 如果没有失败,发布给大家。
由于数据库迁移都参与其中,回滚到以前的版本往往是不可能的。
有一些方法可以使应用程序在这些情况下,如使用事件队列和回放机制发挥更好,但因为我们在谈论部署变化的东西,在使用中,真的没有傻瓜证明的方式。
这就是我要做的事:
绝对最低系统要求:
1个服务器
工作流程:
开始交易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
我建议保留旧的文件那里,只是覆盖它们。 这样的停机时间限制为单文件覆盖次,只有过一个文件在同一时间失踪。
不知道这有助于在“Web应用程序”,但(我认为你说这是你使用的是什么),这就是为什么我们总是用“网站”。 还以“网站”部署不重新启动您的网站,并删除所有用户会话。