如何通过长时间的发布任务部署到Heroku

0wi1tuuw  于 2022-09-20  发布在  ElasticSearch
关注(0)|答案(1)|浏览(132)

我们有一个在Heroku上运行的RailsV6应用程序。我们有一个Postgres数据库,我们使用ElasticSearch。当我们推出新版本时,通常在每个发布阶段都需要发生两件事:

1.运行数据库迁移
1.更新ElasticSearch索引目前,这两个操作都发生在Procfile调用的bash脚本中(详细信息如下)。

问题是,即使新代码在发布任务完成后才被“发布”,数据库迁移也会立即生效。在发布相应的代码之前,数据库迁移通常会引入会导致错误的破坏性更改。通常情况下,这不是一个大问题,但Elasticearch重新索引几乎需要两个小时才能完成(它需要在迁移之后进行)。因此,在重建索引期间,数据库已更新,但代码尚未发布。对于网站来说,这段时间太长了,不能被破坏或处于维护模式。

数据库迁移和重建索引是非常常见的操作,而Heroku非常流行。因此,我的问题是,在不停机数小时的情况下,协调这种发布的正确方式是什么?

不成功的想法

我的第一个想法是在重新编制索引后执行迁移。但通常迁移会修改重建索引过程中使用的数据库字段。所以这是行不通的。

我还想过尝试对一个新的/不同的Elasticearch索引执行重新索引,然后在该过程完成时将应用程序指向较新的索引。我不确定如何做到这一点,但这也是有问题的,因为新发布的代码通常需要更新的索引才能正常工作。因此,在重新编制索引的过程中,我们仍有可能破坏网站。

详情

Procfile

release:      bash ./release-tasks.sh
rails:        bundle exec bin/rails s -p 3000

以下是我们发布的-tasks.sh脚本的简化版本:

echo "Running migrations on an existing DB...";
rake db:migrate;

# This effects the production DB immediately

echo "Reindexing..."
rake searchkick:reindex:all

# This takes two hours to finish before the code goes live
toe95027

toe950271#

数据库迁移不应引入突破性更改。您的迁移应该是“安全的”,也就是说,如果迁移运行,您的部署前代码和部署后代码应该都可以工作。

例如,除非预部署代码在self.ignored_columns中包含有问题的列,否则不应从数据库中删除列。

有关更多信息,请查看strong_migrations。创业板页面列出了潜在危险的操作,并提供了安全的替代方案来运行它们。

相关问题