【问题标题】:Deploy ASP.NET web site changes AND SQL Server changes without downtime无需停机即可部署 ASP.NET 网站更改和 SQL Server 更改
【发布时间】:2011-11-07 03:15:26
【问题描述】:

我有一个带有 SQL Server 2008 数据库的 ASP.Net 4.0 网站。我想同时将相关更改部署到网站和数据库,同时保持网站运行。我的正常程序是首先部署网站更改,然后在网站编译时部署数据库更改。如果我足够快以在第一个请求完成编译之前完成数据库更改,则此方法有效。

我不想在网站上有任何停机时间。

编辑:我不能购买任何新的硬件或软件。

有没有更好的办法?

编辑:注意:我的网站不使用会话状态等持久性信息,因此重新编译应用程序不会对我造成任何问题。

【问题讨论】:

  • 这不应该是服务器故障吗?无论如何stackoverflow.com/questions/148084/… 至少应该回答你一半的问题。
  • 您可能希望通过一些限制来修改您的问题。您是想进行硬件投资,还是想要现有的解决方案?
  • @Roopesh:如果没有代码解决方案,我可能会去服务器故障。
  • @Rick Schott:添加了不需要新购买的编辑。

标签: .net asp.net sql-server iis .net-4.0


【解决方案1】:

当您发布对应用程序的更改时,确实没有好的方法可以防止 IIS 重新启动。这在理论上是可能的,但所需的更改将超过这样做的好处。

我认为您应该将停机时间降至最低,而不是完全消除停机时间。没有人喜欢停机时间,但在很多情况下这是必要的邪恶。

对于您的数据库更改,有一些工具可以使更新数据库的过程变得更加容易。我建议看一下 Red Gate 的 SQL Compare 和 SQL Data Compare。这些工具将允许您比较模式和数据,并在几秒钟内同步数据库。几年来我一直在使用这两种工具,它们确实非常节省时间。

SQL 比较:

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

SQL 数据比较:

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

【讨论】:

  • 我没有遇到 IIS 重启的问题。我没有在应用程序中使用任何持久性数据,例如会话,因为我希望能够在部署期间让我的应用程序保持活动状态。
  • 好吧,那很好。所以主要关注的是数据库更改,我建议看看我建议的工具。它们不会消除停机时间,但有助于将停机时间缩短至几分钟。
  • 我正在使用 Visual Studio 2010 数据库项目。它在创建更改脚本方面做得很好。在大多数情况下,我的数据库更改脚本的执行速度比我的 .Net 代码编译速度要快。在极少数情况下,我正在寻找解决方案。
【解决方案2】:

您将不得不使您的数据库更改向后兼容,首先部署它们。然后你可以继续做你正在做的时间问题。

【讨论】:

  • 我尽可能使更改向后兼容。可以毫无风险地部署新对象,可以延迟丢弃。如果我不需要,我宁愿不要让开发人员不得不保持他们的代码向后兼容。只要数据库更改脚本的运行速度快于我的 ASP.NET 代码编译速度,我当前的方法就可以工作。
【解决方案3】:

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

【讨论】:

  • 你是对的,从长远来看,这就是你想要做的事情,因为你有 $ 来管理硬件和人员。
【解决方案4】:

您的代码与数据库的耦合程度如何?在某些地方是否看起来像这样:

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

ORM 非常适合缓解数据库更改。但是,这对您来说可能不是一个可行的选择。相反,除了 ma​​jor 数据库更改之外,我会尝试编写适用于现有模式和新模式的代码。例如,使您的代码减少对现有(或不存在)列的依赖...如果 int 不存在,则默认为零....如果 varchar 不存在,则默认为空字符串。

“计算机科学中的所有问题都可以通过另一个层次的间接性来解决。”巴特勒兰普森

【讨论】:

  • 紧耦合。数据库更改会破坏应用程序。我避免使用数据库默认值,因为我希望应用程序在预期值为 null 时失败,以避免在开发过程中出现混淆。
【解决方案5】:

如果您正在更改存储过程,也许您可​​以在添加新参数时默认参数?这让您可以在网站发布之前移动数据库代码。

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

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

您需要确保存储的 proc 代码以您希望的方式处理 @New_Parameter = 0。

【讨论】:

  • 这是确保向后兼容性的好方法,但我不愿意更改已通过测试的代码以制作特殊的部署版本。我也不想让开发人员不得不让他们的代码向后兼容。
【解决方案6】:

自动化流程!

我会写一批:

  1. App_Offline.htm 文件复制到网络服务器
  2. 部署 ASP.NET 应用
  3. 部署数据库更改(可以与 2 并行启动。)
  4. 删除或重命名 App_Offline.htm

【讨论】:

  • "不停机" "同时保持网站运行"
  • 可悲....不是一个答案,因为发帖人特别不希望网站上有任何停机时间。
  • @TomTom:鉴于应用程序无法在未部署的数据库更改以及更改数据库需要一些时间的情况下运行,我想如果没有“任何”停机时间是不可能的。
  • 啊,不,这是可行的,但是对于同时具有多个复制数据库的数据库端,它也需要非常特殊的编程。一般不值得,但是,嘿,我不是在这里争论具体要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
相关资源
最近更新 更多