云 运行 进行数据库迁移

Cloud run with database migrations

我想 运行 在云 运行 入口点进行数据库迁移(例如 php artisan migrate),以避免在 运行 这些之前使用外部工具促进修订。

在 kubernetes 中,这个功能可以通过在部署上有一个初始化容器来实现 运行 迁移并将最大激增设置为 1,确保只有一个 pod 在推出到其他容器之前尝试迁移。

是否在任何地方定义了 CloudRun 的部署策略?如果 CloudRun 在停止批发之前等待修订中的一个容器健康,那就太好了,这将满足这一目的(尽管如果多个容器尝试迁移,postgres 事务性 DDL 的问题并不算太糟糕)。我认为这是我观察到但不确定的行为。

是否有 better/low-maintenance 方法来 运行 迁移而不是在每个入口点 运行?

云 运行 上没有就绪探测。当您部署新修订时:

  • 容器已下载
  • 容器已启动
    • 如果容器启动失败 -> 错误信息
    • 否则,将流量配置切换到新版本

通过这最后一步,新流量被路由到新版本,之前收到的请求并已经路由到之前的版本继续在之前的实例上处理。

这是简单的版本。在可持续流量的情况下,同时有多个实例,它会更复杂。

希望这些信息对您有所帮助!

In kubernetes this functionality can be achieved by having an init container on a deployment run the migrations and setting max surge to 1, ensuring only one pod attempts the migration before rolling out to other containers.

这通常不是一个好的做法,即使在 Kubernetes 中也是如此。

理想情况下,您的数据库迁移代码应该是 idempotent。尤其是在无服务器世界中,除非您改变思维方式并思考这些概念,否则您会发现这些原语的缺乏令人惊讶。

Cloud 运行 的推出策略是通过配置手动流量拆分——根据您定义的百分比在修订版之间路由流量。

您可以开发云 运行 服务的新版本,接收 0% 的流量。

部署修订后,云 运行 仍将 运行 至少一个容器,以查看应用程序是否准备就绪(即进程开始侦听端口)。不过,您可能不应该依赖在此过程中出现的 只有 1 个实例 ,因为这不是保证的行为。

使用此技巧,您可以执行数据库迁移(请注意启动超时文档的 "Limits" 部分) 侦听端口号之前。但是您需要编写一些逻辑(或使用外部 locking/synchronization 机制)以确保代码路径不会在将来(或在迁移发生时同时)一遍又一遍地执行。