使用 PlanetScale Rails Gem 实现零停机时间的 Rails 迁移
我们最近发布了 planetscale_rails
Gem,它包含一系列 Rake 任务,用于管理 Rails 应用程序的架构。该工作流旨在帮助开发人员在不担心停机的情况下部署更改,从而加快发布速度并提升团队信心。本文将探讨直接对生产数据库运行 Rails 迁移的风险,并教您如何设置一个可以减少这些风险的工作流。
零停机时间的生产架构迁移工作流
以下是我们用于 Rails 应用程序的高级工作流:
- 在开发环境中运行 MySQL 以进行架构修改。
- 在准备部署到生产环境时使用 PlanetScale 分支。
- 使用 GitHub 进行代码审查,合并至主分支时自动部署代码更改。
- 将架构更改与代码更改分开,通过 PlanetScale Deploy 请求部署架构更改。
分离架构更改与代码更改的重要性在于能够降低停机风险。
PlanetScale Deploy 请求如何防止停机
PlanetScale 数据库采用类似 Git 的工作流进行架构更改:
- 创建初始主分支并完成迁移。
- 将主分支推广为生产分支并与生产应用连接。
- 从生产架构分支创建新分支进行架构修改,随后通过 Deploy 请求安全地将更改部署至生产环境。
Deploy 请求使用 Vitess 的在线架构迁移工具,在无需锁定表的情况下安全地进行架构更改。它还支持数据无损回滚功能。
架构迁移优先于代码更改
与代码部署捆绑的迁移流程可能带来问题,通过分离代码和架构部署,团队可以更安全地按步骤完成操作。以下是无停机时间的 PlanetScale + Rails 工作流:
无停机时间的工作流步骤
- 安装 PlanetScale CLI(参考 pscale README)。
- 安装 PlanetScale Rails Gem(参考 planetscale_rails README)。
- 使用 CLI 创建新 PlanetScale 数据库分支:Bash
pscale branch switch my-feature --database my-db-name --create
此命令生成.pscale.yml
配置文件供 Rails 识别分支信息。 - 在新分支上运行 Rails 迁移:Bash
bundle exec rails psdb:migrate
- 创建新的 PlanetScale Deploy 请求:Bash
pscale deploy-request create database-name my-feature
- 在 GitHub 上打开 Pull Request:包含迁移文件及
schema.rb
更改,同时附上 Deploy 请求链接。 - 审核并依次部署架构和代码更改。
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)以确保数据一致性。
常见迁移场景的安全操作
添加列
- 创建 Deploy 请求进行架构修改。
- 合并代码以使用新列。
Deploy 请求工具可避免表锁定。
删除列
- 在模型中标记列为
ignored
,并部署此更改:Rubyclass Project < ActiveRecord::Base self.ignored_columns += %w(category) end
- 确认未使用则部署迁移移除列。
- 清理
ignored_columns
代码并部署。
重命名列
重命名列需步骤:
- 添加新列。
- 应用程序开始写入旧列和新列。
- 使用脚本回填数据:Ruby
Project.all.find_each do |project| project.update(:new_column, project.old_column) end
- 更新应用读取新列并移除旧列。
添加或删除索引
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 架构迁移工作流。虽然起初设置可能需要额外工作,但长远来看,它有助于提升发布效率和团队信心,快速响应意外问题并确保生产环境的稳定性。
关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接
本文链接:http://choupangxia.cn/2025/09/11/planetscale-rails-gem/