【问题标题】:Migrating EF Code First in multiple instances在多个实例中迁移 EF Code First
【发布时间】:2014-08-18 15:35:43
【问题描述】:

我有一个使用 EF6 Code First 的 MVC 应用程序。我想将此应用程序部署到多个数据中心。在具有迁移的部署中,我可以编写一个脚本来尽可能同时迁移它们,但如果一个数据中心速度较慢,那么由于架构不再匹配,所有调用都可能被拒绝。尝试协调的脚本也会使滚动升级变得不可能。

有没有办法让 EF 至少尝试运行查询,即使模式不匹配?我可以/应该以其他方式解决这个问题吗?

更新:

让我们看看我能不能更好地用这个词。我想在多个数据中心拥有我的 MVC 应用程序。假设我将应用单独部署到每个数据中心。

选项 1

  1. 部署到数据中心 A
  2. 代码优先迁移在集中式数据库上运行
  3. 对 DC A 的请求成功,但对 DC B 的请求失败

选项 2

  1. 部署到数据中心 A
  2. 不要自动运行迁移
  3. 对 DC A 的请求失败,对 DC B 的请求继续成功

我如何制定部署策略以确保对任一 DC 的请求都能正常工作?

顺便说一句:如果需要特定于平台的解决方案,我正在使用 Azure 网站。

【问题讨论】:

  • “在集中式数据库上运行”迁移适用于数据库,而不是应用程序实例。如果您的架构已更改,那么您需要为每个应用程序部署更新的代码,但您不必为每个应用程序运行迁移。迁移仅适用于集中式数据库。
  • 另外,我相信 EF 会检查数据库版本,如果版本不同,它将失败(它在几个版本之前做过,但我知道他们已经摆脱了一些迁移元数据表)。因此,当您部署更新的实例时,您的第二个应用程序实例只会为对其发出的任何请求抛出错误,这通常非常快。您可以对此进行测试并确定确切的异常并捕获该异常并将用户发送到“站点正在更新”消息,或者如果您有该功能,请尝试将他们引导到不同的实例。
  • 是的,你中了它的头。我完全可以返回错误或“站点正在更新”消息,但似乎应该有一个滚动升级的解决方案,您可以在有限数量的服务器上测试站点,然后再将其发送到其他服务器。

标签: asp.net-mvc entity-framework ef-code-first entity-framework-migrations


【解决方案1】:

在您的帖子中,您似乎担心它在实际升级过程中的表现。没有什么关于测试的。但是在 cmets 中,您询问的是先进行部分部署,然后再进行测试。因此,一方面您希望尽快部署以最大限度地减少停机时间。另一方面,听起来您想在验证第一个部署时部署到一个站点、进行测试并让其他站点继续运行?
验证部署是合理的,但相当复杂。我不确定您是否会为此找到很多自动化方式。 我认为您应该在生产部署之前彻底测试,然后在生产中尽快部署。如果您仅在部署到生产时发现问题,那么您将处于糟糕的境地,因为现在您的网站已关闭,直到您可以修复它。即使您可以让另一个实例与新数据库一起使用,这也是有风险的,因为它将根据它不完全理解的模式来修改内容。此外,如果您确实需要回滚 DDL,那么您几乎肯定会丢失自部署以来修改过的所有数据。因此,旧模式的所有实例最好在升级之前都失败,以防止它们修改有丢失风险的数据。

通常,您应该部署到尽可能接近生产环境的暂存环境,以测试数据库迁移过程。这称为生产前测试,有时涉及将最近的备份从生产恢复到登台,以确保新的约束/结构对现有数据有效。通过部署到这个暂存环境,您应该对生产部署会成功进行非常有信心。

您还可以通过在部署之前进行备份来保护自己免受生产部署问题的影响,以便您可以在必要时回滚(尽管这是最坏的情况,因为这可能意味着丢弃备份/部署和意识到之间的重要数据有问题)。我想 EF 迁移使用事务来运行 DDL 脚本,因此如果出现问题,它们应该全部或全部回滚。

【讨论】:

  • 测试只是如何使用滚动升级的一个例子。 Microsoft 为 Outlook.com、Bing 等执行此操作。这是最后一分钟的健全性检查,因此如果生产中出现下落不明的问题,您不会影响所有人。他们谈论它here
  • 如果您使用直接 SQL,滚动升级可以工作,因为您可以将更新拆分为多个更新,每个更新彼此了解,但鉴于我是一个单人团队,这可能不值得追求和简单给出更好的错误信息。物有所值。
  • 我认为 Azure 文章上下文中的滚动升级只是处理单个实例中对应用程序的更改。在您考虑一个频繁更改模式的集中式数据库之前,这听起来很棒。我发现很多这类功能都不能很好地应对现实世界的挑战。 Outlook 可能对他们的数据库进行了严重分区,因此他们可以在升级特定数据库实例的服务器集的同时升级单个数据库实例,而其他数据库实例/服务器保持不变。
猜你喜欢
  • 2014-10-08
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
  • 1970-01-01
  • 2014-09-02
相关资源
最近更新 更多