Python 如何挤压/拆分SQLAlchemy迁移文件以将服务停机时间降至最低?

Python 如何挤压/拆分SQLAlchemy迁移文件以将服务停机时间降至最低?,python,sqlalchemy,database-migration,alembic,Python,Sqlalchemy,Database Migration,Alembic,我有一个SQLAlchemy/Flask应用程序,被数百万人公开访问 每隔两周,我就会发布这个应用程序的新版本,并使用python manage.py db upgrade运行数据库迁移。这将运行自上次运行迁移文件以来创建的所有新迁移文件 这种方法的问题是,由于我的数据库表太大,像添加列这样的简单迁移操作每次可能需要15-20分钟。因此,停止应用程序、运行迁移、更新应用程序代码然后重新启动应用程序可能会导致长时间的停机。我正在尽量减少停机时间 我最大限度地减少停机时间的策略是在部署之前运行尽可能

我有一个SQLAlchemy/Flask应用程序,被数百万人公开访问

每隔两周,我就会发布这个应用程序的新版本,并使用
python manage.py db upgrade
运行数据库迁移。这将运行自上次运行迁移文件以来创建的所有新迁移文件

这种方法的问题是,由于我的数据库表太大,像添加列这样的简单迁移操作每次可能需要15-20分钟。因此,停止应用程序、运行迁移、更新应用程序代码然后重新启动应用程序可能会导致长时间的停机。我正在尽量减少停机时间

我最大限度地减少停机时间的策略是在部署之前运行尽可能多的迁移文件(或迁移文件的部分),而不停止服务。显然,有些操作可以通过这种方式完成

例如,op.add_column()可以在更新代码之前安全运行,而不会干扰应用程序的操作op.delete_列无法删除


是否有任何自动的方法来区分可以在不影响应用程序操作的情况下运行的迁移命令和影响应用程序操作的迁移命令?目前,我必须手动完成这些迁移,并对它们进行脑部手术。很痛。但我不可能是唯一一个经历过这个问题的人。那么其他人使用的解决方案是什么呢?

使用两个应用服务器和两个数据库。第一个是稳定的当前版本,第二个是新部署的版本。当新部署的版本更新(应用了方案迁移和数据迁移)时,将网站流量路由到此新部署的版本。(并重用旧的数据库和应用程序实例/或者干脆杀死它并重新创建一个新实例)。

使用两个应用程序服务器和两个数据库。第一个是稳定的当前版本,第二个是新部署的版本。当新部署的版本更新(应用了方案迁移和数据迁移)时,将网站流量路由到此新部署的版本。(并重用旧的数据库和应用程序实例/或者干脆将其杀死并重新创建一个新实例).

这不起作用,因为当我们切换到第二个DB时,副本和重新路由之间的第一个DB中发生的更改将丢失。这不起作用,因为当我们切换到第二个DB时,副本和重新路由之间的第一个DB中发生的更改将丢失。