ONM*_*MNZ 4 django amazon-ecs django-migrations aws-fargate
使用 ECS Fargate 运行数据库迁移的建议部署策略是什么?
我可以在启动 Gunicorn 服务器之前更新容器命令以运行迁移。但如果配置了多个实例,这可能会导致并发迁移同时执行。
我还必须考虑图像已经在运行的事实。如果我弄清楚如何在新映像启动并运行之前运行迁移,我必须考虑这样一个事实:旧映像仍在旧代码上运行,并且可能会破坏或导致奇怪的数据损坏副作用。
我正在考虑创建一个新的 ECS::TaskDefinition。让其运行一个运行迁移的一次性迁移脚本。然后容器关闭。我更新了所有其他 TaskDefinitions 以使其具有 DependsOn,这样它们在完成之前不会启动。
我可以在启动 Gunicorn 服务器之前更新容器命令以运行迁移。但如果配置了多个实例,这可能会导致并发迁移同时执行。
这是一种可能的解决方案。为了避免并发问题,您必须在容器脚本中添加某种分布式锁定,以便在运行迁移之前从 DynamoDB 或其他内容获取锁定。我见过这样做的。
我建议的另一个选择是从 AWS CodeBuild 任务运行 Django 迁移。您可以在部署之前手动触发它,也可以在部署之前作为更大的 CI/CD 部署管道的一部分自动触发它。这样您至少不必担心一次运行多个任务。
我还必须考虑图像已经在运行的事实。如果我弄清楚如何在新映像启动并运行之前运行迁移,我必须考虑这样一个事实:旧映像仍在旧代码上运行,并且可能会破坏或导致奇怪的数据损坏副作用。
这是每个已创建的系统中的每个数据库迁移都会遇到的问题。如果您非常担心它,则必须使用单独的数据库进行蓝绿部署以避免此问题。或者,您可以通过将 ECS 配置为在开始新任务之前停止所有旧任务来接受部署期间的一些停机时间。
我正在考虑创建一个新的 ECS::TaskDefinition。让其运行一个运行迁移的一次性迁移脚本。然后容器关闭。我更新了所有其他 TaskDefinitions 以使其具有 DependsOn,这样它们在完成之前不会启动。
这是一个好主意,但我不知道有什么方法可以设置DependsOn单独的任务。我所知道的 ECS 中的唯一DependsOn设置是针对单个任务中的多个容器。
| 归档时间: |
|
| 查看次数: |
1079 次 |
| 最近记录: |