多个实例的实体框架迁移策略

Mod*_*man 7 sql-server entity-framework amazon-ecs asp.net-core

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

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

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

人们如何解决这个问题?

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

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

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

  3. 锁定数据库? EF Core 在迁移期间锁定数据库。看起来很奇怪。

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

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

谢谢

Jus*_*son 5

我们也曾经让我们的应用程序执行迁移,但即使是 Microsoft 也建议在多实例环境中避免这种情况:

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

数据库迁移应作为部署的一部分以受控方式完成。

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

  • 如果您的 API 有 2 个节点(例如在 kubernetes 集群中运行),并且您部署了一个新版本,该版本将在部署过程中更改数据库架构,根据设计,另一个节点将收到来自 EF 的错误,说明有迁移需要运行 (2认同)