我们最近发布了 planetscale_rails Gem,它包含一系列 Rake 任务,用于管理 Rails 应用程序的架构。该工作流旨在帮助开发人员在不担心停机的情况下部署更改,从而加快发布速度并提升团队信心。本文将探讨直接对生产数据库运行 Rails 迁移的风险,并教您如何设置一个可以减少这些风险的工作流。


零停机时间的生产架构迁移工作流

以下是我们用于 Rails 应用程序的高级工作流:

  1. 在开发环境中运行 MySQL 以进行架构修改。
  2. 在准备部署到生产环境时使用 PlanetScale 分支。
  3. 使用 GitHub 进行代码审查,合并至主分支时自动部署代码更改。
  4. 将架构更改与代码更改分开,通过 PlanetScale Deploy 请求部署架构更改。

分离架构更改与代码更改的重要性在于能够降低停机风险。


PlanetScale Deploy 请求如何防止停机

PlanetScale 数据库采用类似 Git 的工作流进行架构更改:

  • 创建初始主分支并完成迁移。
  • 将主分支推广为生产分支并与生产应用连接。
  • 从生产架构分支创建新分支进行架构修改,随后通过 Deploy 请求安全地将更改部署至生产环境。

Deploy 请求使用 Vitess 的在线架构迁移工具,在无需锁定表的情况下安全地进行架构更改。它还支持数据无损回滚功能。


架构迁移优先于代码更改

与代码部署捆绑的迁移流程可能带来问题,通过分离代码和架构部署,团队可以更安全地按步骤完成操作。以下是无停机时间的 PlanetScale + Rails 工作流:

无停机时间的工作流步骤

  1. 安装 PlanetScale CLI(参考 pscale README)。
  2. 安装 PlanetScale Rails Gem(参考 planetscale_rails README)。
  3. 使用 CLI 创建新 PlanetScale 数据库分支:Bashpscale branch switch my-feature --database my-db-name --create此命令生成 .pscale.yml 配置文件供 Rails 识别分支信息。
  4. 在新分支上运行 Rails 迁移:Bashbundle exec rails psdb:migrate
  5. 创建新的 PlanetScale Deploy 请求:Bashpscale deploy-request create database-name my-feature
  6. 在 GitHub 上打开 Pull Request:包含迁移文件及 schema.rb 更改,同时附上 Deploy 请求链接。
  7. 审核并依次部署架构和代码更改。

planetscale_rails 提供的 Rake 任务

以下是 Gem 提供的 Rake 任务:

  • rake psdb:migrate:迁移当前环境的数据库。
  • rake psdb:rollback:回滚当前环境的主数据库。
  • rake psdb:schema:load:将当前架构加载到数据库。
  • rake psdb:setup_pscale:通过代理连接到 PlanetScale。

配置 schema_migrations 表

在分支间 schema_migrations 表会自动复制。在您的 PlanetScale 仪表板上启用“自动复制迁移数据”(Settings > Automatically copy migration data)以确保数据一致性。


常见迁移场景的安全操作

添加列

  1. 创建 Deploy 请求进行架构修改。
  2. 合并代码以使用新列。

Deploy 请求工具可避免表锁定。

删除列

  1. 在模型中标记列为 ignored,并部署此更改:Rubyclass Project < ActiveRecord::Base self.ignored_columns += %w(category) end
  2. 确认未使用则部署迁移移除列。
  3. 清理 ignored_columns 代码并部署。

重命名列

重命名列需步骤:

  1. 添加新列。
  2. 应用程序开始写入旧列和新列。
  3. 使用脚本回填数据:RubyProject.all.find_each do |project| project.update(:new_column, project.old_column) end
  4. 更新应用读取新列并移除旧列。

添加或删除索引

Deploy 请求可安全添加或移除索引。删除索引前检查其在查询中是否仍被使用:

SQLselect * from sys.schema_unused_indexes;

数据迁移

数据迁移脚本示例:

RubyProject.all.find_each do |project|
  project.update(:new_column, project.old_column)
end

复杂迁移可通过 Ruby 类封装,代码审查并测试后在生产环境运行。


结论

通过 PlanetScale 和 planetscale_rails,您可以实现零停机时间的 Rails 架构迁移工作流。虽然起初设置可能需要额外工作,但长远来看,它有助于提升发布效率和团队信心,快速响应意外问题并确保生产环境的稳定性。



使用 PlanetScale Rails Gem 实现零停机时间的 Rails 迁移插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:http://www.choupangxia.com/2025/09/11/planetscale-rails-gem/