无需停机即可在 Heroku 上完成 Rake 任务和迁移
Rake tasks and migration on Heroku without downtime
上下文
我正在使用 Heroku 为我的 rails API (v5.2) 和 PostgreSQL 数据库提供服务,
经常,在一些迁移之后,我必须手动 运行 一些特定的 rake 任务。
那些 rake 任务通常会删除 table 的所有行,然后再用不同的数据重新创建它们。
这对我来说是有问题的,因为它会造成大约 10 分钟的停机时间。 20 分钟,每周两次(通过打开和关闭 Maintenance mode)。
问题
我想避免迁移之间的停机时间。
预期解决方案
为此,我计划使用 Heroku preboot alongside release phase tasks。
为我的应用程序激活 preboot
后,我会在我的 Procfile
中放置一个脚本
release: ./release-tasks.sh
并且在 release-tasks.sh
文件中是这样的:
heroku run rake my_rake_task --app myApp
问题
是good/ok解决方案吗?
是否确定在迁移阶段,用户将能够
在新数据库上线之前查询 "old" 数据库?
有没有办法按需激活发布脚本? (例如使用
Heroku 中的环境变量? -- 我不会每次迁移都需要它)。
这是一个很好的解决方案,是的。发布阶段旨在帮助 运行 部署应用程序时进行迁移。
虽然这不会阻止您的特定情况下的停机时间。发布阶段不会在每次发布时都启动一个新数据库。它只是用你的命令运行 one-off dyno。
这里唯一的解决办法是更改迁移策略以避免删除和重新创建所有内容。根据您正在做的事情,您也许可以 update/add/remove 您需要的数据。
或者您可以使用新数据创建一个新的临时 table,然后删除旧的 table 并将新的重命名为永久名称。
不过,这两种解决方案都需要您编写自己的代码。
上下文
我正在使用 Heroku 为我的 rails API (v5.2) 和 PostgreSQL 数据库提供服务,
经常,在一些迁移之后,我必须手动 运行 一些特定的 rake 任务。
那些 rake 任务通常会删除 table 的所有行,然后再用不同的数据重新创建它们。
这对我来说是有问题的,因为它会造成大约 10 分钟的停机时间。 20 分钟,每周两次(通过打开和关闭 Maintenance mode)。
问题
我想避免迁移之间的停机时间。
预期解决方案
为此,我计划使用 Heroku preboot alongside release phase tasks。
为我的应用程序激活 preboot
后,我会在我的 Procfile
release: ./release-tasks.sh
并且在 release-tasks.sh
文件中是这样的:
heroku run rake my_rake_task --app myApp
问题
是good/ok解决方案吗?
是否确定在迁移阶段,用户将能够 在新数据库上线之前查询 "old" 数据库?
有没有办法按需激活发布脚本? (例如使用 Heroku 中的环境变量? -- 我不会每次迁移都需要它)。
这是一个很好的解决方案,是的。发布阶段旨在帮助 运行 部署应用程序时进行迁移。
虽然这不会阻止您的特定情况下的停机时间。发布阶段不会在每次发布时都启动一个新数据库。它只是用你的命令运行 one-off dyno。
这里唯一的解决办法是更改迁移策略以避免删除和重新创建所有内容。根据您正在做的事情,您也许可以 update/add/remove 您需要的数据。
或者您可以使用新数据创建一个新的临时 table,然后删除旧的 table 并将新的重命名为永久名称。
不过,这两种解决方案都需要您编写自己的代码。