【问题标题】:Django migration command hanging on Heroku even without actual new migration即使没有实际的新迁移,Django 迁移命令也会挂在 Heroku 上
【发布时间】:2020-10-13 07:20:45
【问题描述】:

我们正在 Heroku 上运行我们的堆栈。我们正在使用带有 Postgres 11 DB 的 Django 2.2。我们的构建管道(Github Actions)推送到 Heroku(git push https://git.heroku.com...),然后立即运行迁移(heroku run python manage.py migrate --app heroku-app-name)。所有这些都与 Postgres 9.6 数据库一起工作,并且仍在我们的暂存环境(Postgres 11)中工作。现在,在 Postgres 11 上进行生产时,django migrate 命令只是卡住了,不会产生任何输出,即使没有实际的迁移可以应用。

我们的生产设置和我们的暂存设置之间的唯一区别是生产中连接到主数据库和“生产工作负载”的追随者/从属。

为了修复该部署,我必须运行一个

heroku pg:killall -a heroku-app-name
heroku restart -a heroku-app-name

此时构建管道中的迁移任务失败。

之后可以毫无问题地手动应用迁移:

heroku run python manage.py migrate --app heroku-app-name

所以由于某种原因,迁移命令正在“等待”某些东西,一些数据库锁或其他东西,但我无法确定它。对我来说特别奇怪的是,它也卡在没有应用迁移的地方。为什么会卡在那里?

【问题讨论】:

  • 自从我们将 Postgres9 迁移到 Postgres11 后,我们面临着完全相同的问题。尚未找到解决方案。
  • 好吧,不只是我们。如果我找到解决方案,我会及时通知您。
  • 我在内部等待一个新的事件来分析锁本身。如果你已经有了这个,你能列出数据库中的锁吗?也许你会在这个级别看到一些东西。
  • 我们现在已经为我们解决了这个问题。我在下面留下了回复。提示我的事情是在我们部署新版本的日期看到数据库备份失败。有关详细信息,请参见下文。

标签: django postgresql heroku


【解决方案1】:

我们找到了解决方案。实际上有三件事结合在一起。

  1. 我们在运行任何迁移之前触发数据库备份。我们只在生产环境中这样做,而不是在临时环境中这样做,这就是为什么我们的临时环境在生产环境中没有问题的原因。
  2. 数据库迁移(即使看起来没有什么可应用的)实际上正在运行一些命令(除了常规的 SELECT、UPDATE、INSERTS)。例如。在我们的例子中,有一个 CREATE EXTENSION ... IF NOT EXISTS 总是在开头执行。
  3. 虽然 Postgres 9.6 可以并行运行备份作业(我不知道 heroku 在后台使用什么,但我假设是 noraml pg_dump)Postgres 11 上的备份作业(和其他?) 现在对某些操作具有更排他性的锁定。我假设在并行运行备份作业时无法执行 CREATE EXTENSION ... IF NOT EXISTS(即使扩展已经存在)。

(我确信缺少一些 Postgres internas 来更正确地解释这一点)

由于这三件事,数据库阻塞了迁移操作,等待备份作业完成。我已将每日备份作业移至不同的时间并重新配置我们的管道以等待“预部署”备份首先完成。

【讨论】:

  • 我们的情况不同,我认为对我们来说这只是迁移时数据库的负载。正如您所说,锁可能更具排他性。我们将找到一种方法来减少迁移期间的负载。谢谢你的回答!
  • 很抱歉没有帮到你。我希望你也能找到问题的原因!
猜你喜欢
  • 2014-05-02
  • 2016-03-17
  • 2013-03-12
  • 2016-07-05
  • 2022-11-25
  • 2019-12-24
  • 2017-04-10
  • 2021-11-29
  • 1970-01-01
相关资源
最近更新 更多