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

时间:2019-02-13 12:34:47

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

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

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

之所以会发生这种情况,是因为这两个应用程序都首先检查数据库是否已执行迁移,两个都发现数据库尚未执行,然后都开始运行迁移,这会花费一些时间。完成后,它将迁移添加到数据库中。

人们如何解决这个问题?

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

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

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

  3. 锁定数据库? EF Core lock the database during migration。似乎很奇怪。

  4. 使迁移成为部署过程的一部分。这似乎是最佳做法,但这意味着Build服务器将需要知道Database秘密。我不怕给它,但这意味着我必须维护一个重复的集合。

人们在做什么?我是否缺少一些明显的解决方案?

谢谢

1 个答案:

答案 0 :(得分:2)

我们过去也曾经让我们的应用程序执行迁移,甚至在多实例环境中甚至是Microsoft recommends avoiding this

  

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

     

数据库迁移应在部署过程中以受控方式完成。

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