无停机时间部署 ASP.NET 网站变更及 SQL Server 变更

3
我有一个使用ASP.Net 4.0和SQL Server 2008数据库的网站。我想同时部署对网站和数据库的依赖性更改,同时保持网站运行。我的常规流程是首先部署网站更改,然后在网站编译时部署数据库更改。如果我足够快地在第一个请求完成编译之前发布数据库更改,则此方法有效。
我不希望网站出现任何停机时间。
编辑:我不能购买任何新硬件或软件。
有没有更好的方法?
编辑:注意:我的网站不使用持久信息(如会话状态),因此重新编译应用程序不会对我造成任何问题。

这个问题应该放在ServerFault上吧?不管怎样,https://dev59.com/bnVC5IYBdhLWcg3w51ry 这个链接至少可以回答你问题的一半。 - Roopesh Shenoy
1
你可能想要在问题中加入一些限制条件。你是想进行硬件投资,还是想用现有的解决方案? - rick schott
@Roopesh:如果没有代码解决方案,我可能会去Serverfault。 - Carter Medlin
@Rick Schott:添加了编辑,无需新购买。 - Carter Medlin
6个回答

3

没有一个好的方法可以防止IIS在应用程序更新时重新启动。理论上是可能的,但需要做出的更改会超过其好处。

我认为您应该尽量将停机时间最小化,而不是完全消除它。没有人喜欢停机时间,但在很多情况下,它是必要的恶。

对于数据库更改,有一些工具可以使更新数据库的过程更加容易。我建议看一下Red Gate的SQL Compare和SQL Data Compare。这些工具可以让您比较模式和数据,并在几秒钟内同步数据库。我已经使用这两个工具几年了,它们真的是节省时间的绝佳工具。

SQL Compare:

http://www.red-gate.com/products/sql-development/sql-compare/

SQL 数据比较:

http://www.red-gate.com/products/sql-development/sql-data-compare/


我对IIS重新启动没有问题。我的应用程序中没有使用任何持久数据,如会话,因为我希望在部署期间保持我的应用程序的活性。 - Carter Medlin
好的,那很好。所以主要问题是数据库更改,我建议看一下我提到的工具。它们不能消除停机时间,但能帮助将停机时间减少到几分钟。 - James Johnson
我正在使用Visual Studio 2010数据库项目。它在创建更改脚本方面做得很好。在大多数情况下,我的数据库更改脚本执行速度比我的.Net代码编译速度更快。在极少数情况下,如果它不能达到这个速度,我正在寻找解决方案。 - Carter Medlin

1

如果您正在进行存储过程更改,或许可以在添加新参数时将参数设置为默认值?这样可以使您在网站发布之前移动数据库代码。

当前生产存储过程的示例...

ALTER PROCEDURE [dbo].[p_Stored_Proc_Name]
    @Some_Id INT
AS

添加一个新参数到存储过程中...
ALTER PROCEDURE [dbo].[p_Stored_Proc_Name]
    @Some_Id INT,
    @New_Parameter = 0
AS

你需要确保你的存储过程代码能够按照你的意愿处理 @New_Parameter = 0。


这是确保向后兼容性的好方法,但我不太舒服修改已经通过测试的代码以制作特殊部署版本。我也不想让开发人员负担保持其代码向后兼容的责任。 - Carter Medlin

1

你需要使你的数据库更改向后兼容,先部署它们。然后你就可以继续处理时间问题。


我尽可能地使更改向后兼容。新对象可以无风险部署,删除可以延迟。如果不必要,我宁愿不让开发人员负担保持其代码向后兼容的责任。只要数据库更改脚本运行速度快于我的ASP.NET代码编译速度,我的当前方法就能够正常工作。 - Carter Medlin

1

我喜欢@rick schott的想法,关于使数据库更改向后兼容。但是,我认为最终你需要某种类型的集群/农场/花园。如果你有集群化的Web服务器和集群化的数据库服务器,你可以从池中取出一个Web和一个数据库,部署到那里,在那里测试应用程序。然后将它们放回池中,取出其他的,更新它们并将它们放回。


你说得对,如果你有足够的资金和人员来管理,那么从长远来看,这就是你想要做的事情。 - rick schott

1
你的代码与数据库有多紧密的联系?在某些地方看起来像这样吗:

dt.Rows[0]["CustomerId"];

ORM(对象关系映射)对于减轻数据库变更非常有用。但是,这可能不适合您。因此,在重大数据库更改之外,我会尝试编写与现有模式和新模式兼容的代码。例如,使您的代码不太依赖于列是否存在(或不存在)......如果int不存在,则默认为零......如果varchar不存在,则默认为空字符串。

"计算机科学中的所有问题都可以通过另一层间接性来解决。" Butler Lampson


紧密耦合。数据库更改会导致应用程序出现故障。我避免使用数据库默认值,因为当预期值为空时,我希望应用程序失败,以避免在开发过程中出现混淆。 - Carter Medlin

-2

自动化流程!

我将编写一个批处理:

  1. 复制 App_Offline.htm 文件到 Web 服务器
  2. 部署 ASP.NET 应用程序
  3. 部署数据库更改(可以与第二步并行进行)
  4. 移除或重命名 App_Offline.htm 文件

"无停机时间" "同时保持网站运行" - Eonasdan
很遗憾...这并不是一个答案,因为发帖者明确表示不想让网站有任何停机时间。 - TomTom
@TomTom:我猜没有“任何”停机时间是不可能的,因为应用程序无法在未卸载数据库更改的情况下运行,而更改数据库需要一些时间。 - Jan
啊,不,这是可行的,但需要进行非常特殊的编程,并且在数据库方面使用多个复制数据库同时运行。一般情况下并不值得,但嘿,我不是来争论具体要求的。 - TomTom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接