playframework - 管理生产环境的演变

标签 playframework playframework-2.1 production self-hosting

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

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

Oops, cannot start the server. @6elnj89fh: Database 'default' needs evolution!



这是即使我们尝试设置 applyEvolutions.default=true通过命令行和 application_prod.conf 文件。它还提示说

WARNING! This script contains DOWNS evolutions that are likely destructives



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

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

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

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

在这一点上,我终于可以通过手动重新运行适当的“UP”来再次运行应用程序。

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

最佳答案

编辑:更新 Play 2.5

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

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

推荐设置

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

play.evolutions.db.default.autoApply=true

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

对于我们的 分期/测试 系统,我们启用了这两个设置:
play.evolutions.db.default.autoApply=true
play.evolutions.db.default.autoApplyDowns=true

第二个设置applyDownEvolutions确保也会自动应用 DOWNS 进化。我们不希望在我们的生产系统上出现这种情况,因为它可能会导致数据丢失(因为 DOWNS 演进通常包含诸如 DROP TABLE 等内容)。

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

进化失败后的恢复

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

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

希望这可以帮助。

关于playframework - 管理生产环境的演变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17314720/

相关文章:

java - play 2.1.1 中未找到适合调度程序的方法

javascript - Rails asset pipeline编译js报错

playframework - 带有 Play 框架的 Postgresql

java - 搭建游戏!项目与maven

java - 如果 boolean 值为 false,Ebean 不会更新它们

scala - 如何通过 fromJson(toJson(date)) 将日期与 specs2 匹配

java - HttpURLConnection 是否支持开箱即用的压缩/解压缩?

java - 如何在Java回调函数中访问外部变量

django - 生产中的 Docker 副本与 Gunicorn 工作人员

ios - GCM 证书配置不起作用或 iOS