管理生产环境的演变

Posted

技术标签:

【中文标题】管理生产环境的演变【英文标题】:Managing evolutions in production environment 【发布时间】:2013-06-23 06:38:00 【问题描述】:

我们正在使用 play 2.1.1 将新应用程序部署到生产环境中,并且遇到了一些实际问题,非常有限的文档并没有太大帮助...

所以是时候更新到新版本了,我们运行了通常的停止/升级/启动脚本,但它们失败了。出于某种原因,游戏拒绝应用进化。开始的时候一直说

糟糕,无法启动服务器。 @6elnj89fh:数据库“默认”需要改进!

即使我们尝试通过命令行和 application_prod.conf 文件设置 applyEvolutions.default=true 也是如此。它还抱怨说

警告!此脚本包含可能具有破坏性的 DOWNS 演变

这对我来说没有多大意义,因为我们正在升级版本,所以无论如何都不应该应用降级。但似乎这可能是它拒绝应用进化的原因。

此时我并不担心,因为我认为有一些手动方法可以应用进化。经过广泛的搜索后,它看起来好像......在游戏 1 中支持此功能,但在游戏 2 中不支持。在开发模式下,您只需按下浏览器中的按钮即可应用进化,但在生产模式下,我找不到任何方法手动应用进化。这是真的还是我错过了?我真的认为这是一个重要的功能! (事后看来,我可以手动应用脚本并禁用进化插件,但这样我就会失去有用的进化跟踪..)

我还想知道您将如何“支持”您的数据库,因为我确信我们会在某个时候需要这样做。如果有手动方式来做到这一点,它可能会有一个可选的版本参数来降级数据库。例如。如果您使用的是第 5 版并且需要返回到第 4 版,则您运行 play apply-evolutions 4 它将应用第 5 版的降级并相应地更新进化数据库。我可以手动应用下降,但问题是进化数据库将再次处于无效状态......

越来越绝望,我尝试了所有我能找到的设置来重新启动服务器并添加了-DapplyDownEvolutions.default=true 选项。我假设此设置仅在选择降级数据库时才会应用降级(尽管似乎没有这样的选项),但实际上它所做的是应用 ups 然后立即应用 downs (我后来在故障排除中发现了这一点服务器现在终于启动了 - 没有任何消息 - 但在访问该站点时给出了一个神秘的错误消息)。这是这个设置应该做的吗?如果是,我无法理解为什么该设置甚至存在。我想不出在迁移到更新的数据库版本时您想要应用 ups 然后立即 downs 的任何场景。有人能解释一下这个设置吗?

此时,我终于可以通过手动重新运行适当的“UP”来让应用程序再次运行。

此时,我们基本上正在重新编写脚本以自行处理进化,以便更好地控制正在运行的内容并启用返回.. 能够使用播放功能会更好所以我希望有人可以对此有所了解。如果没有,也许这个咆哮可以帮助处于类似情况的人......

【问题讨论】:

:+1: for '我找不到手动应用进化的方法' 【参考方案1】:

编辑:针对 Play 2.5 更新


大约 3 年多以来,我们一直在使用 Play 的演变进行生产,并且从未遇到过严重的问题。

我建议有一个暂存环境,您首先在其中针对测试数据库运行您的演进。测试数据库应该具有与生产数据库完全相同的版本。你会在进化过程中犯错,这是在它们进入生产服务器之前找到它们的一种方法。

推荐设置

对于我们的生产系统,我们启用了以下设置:

play.evolutions.db.default.autoApply=true

设置autoApply 确保自动应用进化,无需用户交互。显然,这是我们在升级生产数据库时想要的。

对于我们的staging/testing系统,我们启用了这两个设置:

play.evolutions.db.default.autoApply=true
play.evolutions.db.default.autoApplyDowns=true

第二个设置applyDownEvolutions 确保自动应用 DOWNS 进化。我们不希望在我们的生产系统上使用它,因为它可能会导致数据丢失(因为 DOWNS 演变通常包含诸如 DROP TABLE 之类的东西)。

但是,在测试系统上,如果您正在测试应用程序的不同分支或版本,您可能希望在不同的数据库版本之间切换。在这种情况下,您可能希望在测试新分支时自动关闭和升级数据库。

进化失败后恢复

请记住,如果由于 SQL 错误(在生产或测试系统上)导致一次进化失败,您必须手动将数据库恢复到正常状态。您可以通过查看play_evolutions 表来做到这一点。 Play 跟踪应用的演变及其错误。最后一个条目显示了最后应用的演变以及遇到的错误。

从错误消息中,您通常可以追踪错误的 SQL 并修复您的进化脚本。然后,您可以将数据库恢复到以前的演进版本,并从play_evolutions 表中删除失败的演进条目。 Play 然后认为新的进化尚未应用,将再次运行它。

希望这会有所帮助。

【讨论】:

什么情况下会自动向下迁移?我原以为您想要自动向后迁移的唯一时间是回滚代码时。但是,由于正在部署的旧版本代码中不存在向下迁移,我看不到 Play 何时知道运行它。 向下进化只能在测试服务器上启用,并且只有在设置了applyDownEvolutions 设置时才会运行。在启动时,它检测到缺少进化并向下迁移数据库。它知道如何向下迁移,因为它将向下的演变存储在play_evolutions 数据库表中。 从 Play 2.5 开始,我认为设置是 play.evolutions.db.default.autoApply=true

以上是关于管理生产环境的演变的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB管理之生产环境说明

Laravel 6 在生产环境中如何管理队列?

企业生产环境用户权限集中管理项目方案

Flask 学习-18.配置管理开发/生产/测试环境

Django 调试视图,用于管理员的生产环境

如何在 Azure API 管理上分离开发和生产环境?