【问题标题】:CakePHP: deploying database changes with filtersCakePHP:使用过滤器部署数据库更改
【发布时间】:2023-04-09 08:28:01
【问题描述】:

我们需要定期修改生产数据库的结构。在许多情况下,这些更改对应于引用新更改的代码库中的更改。

我们通常会在拉取新更改并运行新 SQL 查询时放置一分钟的失败鲸鱼页面,但我有兴趣编写一个组件或其他东西来即时运行 SQL 查询,所以不需要停机。

我还没有尝试过,但这是我的计划:

  1. 编写一个组件或其他东西来运行一个或多个特定查询。查询可能会有IF EXISTS 之类的检查,因此它们只运行一次。我认为它也必须清除模型/持久缓存。
  2. 从 AppController 的 beforeFilter 内部调用上述组件/查询。
  3. 将更改拉入现场(使用上述代码)。
  4. 等待几秒钟,让应用运行一次(由其他用户或我们)。
  5. 删除触发 SQL 查询运行的 beforeFilter 代码。

这是一个疯狂的想法吗?这是我的问题: A. 这样的事情会奏效吗? B.有没有更好的方法来做到这一点,我错过了? C. 关于模型缓存,我需要了解哪些信息才能避免引发错误。据推测,调试级别将设置为 0(因为该站点将处于生产状态)。

顺便提一下,我们不是在负载平衡系统上。我们在一个专用服务器上。

【问题讨论】:

    标签: php mysql cakephp deployment database-migration


    【解决方案1】:

    这样的事情会起作用吗?

    我相信它会起作用,但如果你用力敲钉子,你也可以用鞋子敲钉子。

    有没有更好的方法来做到这一点?

    Jason McCreary 的评论是绝对正确的,他提到代码不应该自行部署,并且您应该使用部署过程 - 无论是(至少)自定义脚本、迁移,还是像我这样的自定义工具公司的工具BuildMaster 将数据库部署作为一流的概念来处理。

    使用这样的工具来充实您的流程将使您能够轻松地逐步构建一个完全自动化的系统,这样,如果您确实添加了您没有的负载平衡(或其他一些额外的基础设施)花大量时间在各处更新您的部署过程。您还可以计划回滚、高级部署方案以及其他仅通过将部署代码放入应用程序代码中无法完成的很酷的事情。

    特别是对于数据库部署,BuildMaster 可以管理脚本,并在使用适当的部署操作时自动以相同的顺序部署它们。这将最大限度地减少您尝试手动运行它们时可能遇到的任何停机时间。您还可以输入停止/启动应用程序操作,这将清除任何服务器端缓存。然而,总会存在 ViewState 或其他客户端持久性的问题,但这完全是一个不同的问题。

    【讨论】:

      【解决方案2】:

      这样的事情会起作用吗?

      有点。您可能仍会遭受停机。即使只是在查询完成运行时短暂。如果站点在您的部署期间流量很大,您也可能会遇到并发问题。

      有没有我想念的更好的方法来做到这一点?

      使用负载平衡系统,您可以一次更新一个系统,同时将流量转移到另一个系统,直到所有系统都更新完毕。

      您可以feature flag 您的代码。在启用此功能之前,代码不会运行。因此,启动您的代码,当您的数据库更新完成后,启用该功能。

      关于模型缓存,我需要了解哪些信息才能避免引发错误。

      我对缓存不够熟悉,但缓存可能会让人产生网站可用的错觉。但是任何动态请求(表单提交)仍然可能导致错误。

      顺便说一句,如果您还没有,请查看Schema Migrations

      【讨论】:

      • 架构部分很有用,但似乎架构迁移仍然必须从命令行手动执行。那是对的吗?换句话说,你不能只放入一个新的模式文件/快照,然后让 CakePHP 在你拉入更改时自动运行迁移。
      • 运行 shell 将是您部署过程的一部分。使用 Cake 迁移可以很好地在项目中封装所有内容。如果您愿意,请保持 Cake 的方式。当然,欢迎您使用原始的、特定于平台的 SQL 编写自己的代码。
      • 我可以使用 Cake 迁移。直到现在我才知道他们。您如何看待在 beforeFilter 中(有条件地)触发 shell?
      • 我认为代码不应该自行部署。您应该有一个部署过程。因此,我不会采用beforeFilter 方法。最多,我会使用功能标志。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-19
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多