【问题标题】:Entity Framework migration strategy for multiple instances多实例的实体框架迁移策略
【发布时间】:2019-02-14 21:18:55
【问题描述】:

我有一个在 AWS 弹性容器服务 (ECS) 上运行的 .NET 核心应用程序。 - 该应用程序在两个不同的实例上运行。 - 数据库是 SQL 服务器

应用程序在启动时运行数据库迁移,效果非常好。但是后来我不得不迁移大量数据,这意味着迁移需要更长的时间。这导致移动的数据重复。

发生这种情况是因为两个应用程序首先检查数据库是否已执行迁移,然后都发现它没有执行,然后都开始运行迁移,这需要时间。完成后,它将迁移添加到数据库中。

人们如何解决这个问题?

我和其他人想到的可能解决方案

  1. 仅从一个应用实例开始,然后向上扩展。 这会起作用,但是每次迁移时我都必须手动缩小和放大。 (可以自动完成,但需要时间)

  2. 将长时间运行的迁移包装在事务中,并在开始时将迁移设置为在数据库中完成。在提交更改之前检查它是否在数据库中。如果事务失败,请从数据库中删除迁移。

  3. 锁定数据库? EF Core lock the database during migration 。看起来很奇怪。

  4. 使迁移成为部署过程的一部分。这似乎是最佳实践,但这意味着构建服务器需要知道数据库机密。我不害怕给它,但这意味着我必须维护一个重复的集合。

外面的人是做什么的?我错过了一些明显的解决方案吗?

谢谢

【问题讨论】:

    标签: sql-server entity-framework asp.net-core amazon-ecs


    【解决方案1】:

    我们也曾经让我们的应用程序执行迁移,但即使是 Microsoft recommends avoiding this 在多实例环境中:

    我们建议生产应用不应在应用启动时调用 Database.Migrate。不应从服务器场中的应用程序调用 Migrate。例如,如果应用已通过横向扩展部署在云上(应用的多个实例正在运行)。

    数据库迁移应作为部署的一部分,并以可控的方式进行。

    就像所有事情一样,有不同的方法可以解决问题。我们的团队很小,因此我们通过 EF CLI 工具生成迁移脚本,然后作为部署/维护例程的一部分手动运行它们。如果您的流程允许,这当然可以自动化。

    【讨论】:

    • 当你的 API 有 2 个节点(在 kubernetes 集群中运行例如),并且部署一个新版本,它将更改数据库模式作为部署时,根据设计,另一个节点将收到来自 EF 的错误,指出要运行迁移
    猜你喜欢
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多