我们需要定期修改生产数据库的结构。在许多情况下,这些更改对应于引用新更改的代码库中的更改。
当我们提取新的更改并运行新的 SQL 查询时,我们通常最终会放置一个失败鲸鱼页面一分钟,但我有兴趣编写一个组件或其他东西来动态运行 SQL 查询,所以不需要停机。
我还没有尝试过,但这是我的计划:
- 编写一个组件或其他东西来运行一个或多个特定查询。这些查询可能会有诸如 IF EXISTS 之类的检查,因此它们只运行一次。我认为它还必须清除模型/持久缓存。
- 从 AppController 的
beforeFilter
内部调用上述组件/查询。 - 将更改拉入实时状态(使用上述代码)。
- 等待几秒钟,让应用运行一次(由其他用户或我们)。
- 删除触发 SQL 查询运行的 beforeFilter 代码。
这是一个疯狂的想法吗?这是我的问题: A. 这样的东西会起作用吗? B. 有没有更好的方法来做到这一点,而我却错过了? C. 我需要了解有关模型缓存的哪些信息才能避免引发错误。据推测,调试级别将设置为 0(因为该站点将投入生产)。
顺便说一句,似乎有必要提及我们不在负载平衡系统上。我们使用单个专用服务器。
最佳答案
Will something like this work?
有点。您可能仍会遭受停机时间。即使只是在查询完成运行时短暂地进行。如果站点在部署期间流量很大,您也可能会遇到并发问题。
Is there a better way to do this that I'm missing?
使用负载平衡系统,您可以一次更新一个系统,同时将流量转移到另一个系统,直到所有系统都更新为止。
你可以feature flag你的代码。启用此功能后,代码才会运行。因此,启动您的代码,并在数据库更新完成后启用该功能。
What do I need to know about the model caches to keep from throwing errors.
我对缓存不太熟悉,但缓存可以提供站点可用的错觉。但任何动态请求(表单提交)仍然可能导致错误。
顺便说一句,看看 Schema Migrations如果您还没有的话。
关于php - CakePHP:使用过滤器部署数据库更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19793777/