内容提要
本文介绍了如何使用PlanetScale Rails gem实现零停机的Rails数据库迁移。通过将架构更改与代码更改分开,团队可以安全地进行生产部署,避免因迁移导致的停机。使用PlanetScale的部署请求,工程师可以在不锁定表的情况下进行架构更改,并在出现问题时轻松回滚,从而提高发布效率,减少风险。
延伸解读
为何要分离架构与代码部署
文章指出,将架构更改与代码更改耦合部署是常见风险源。当两者同时进行时,若迁移缓慢或失败,会阻塞代码上线;且无法原子性地同时部署代码和架构,任何一方依赖另一方都可能导致用户遇到错误或停机。因此,建议先部署架构更改,再部署代码更改,以降低风险并确保每一步可控。
部署请求如何实现无锁变更
PlanetScale 的部署请求基于 Vitess 的在线架构迁移工具,能在不锁定表的情况下执行架构更改,避免生产事故。与直接运行 rails db:migrate 不同,部署请求支持安全回滚且不丢失数据。文章强调,在开发环境可继续使用 rails db:migrate,但生产环境应优先使用部署请求来获得安全保障。
常见迁移场景的安全步骤
对于添加列,应先部署架构更改再部署使用该列的代码,且无需担心默认值导致锁表。删除列时,需先在模型中设置 ignored_columns 并部署,确认无查询使用后再执行删除。重命名列不能直接进行,必须通过添加新列、双写、回填、切换读取、删除旧列等多步完成,每一步都是独立的生产部署。
数据迁移与索引操作注意事项
数据迁移应在架构更改后运行,可使用 find_each 分批处理并在控制台打印进度。对于复杂迁移,建议封装为 Ruby 类以便测试和代码审查。添加或删除索引时,部署请求可避免锁表,但删除索引前需确认其未被使用,可通过查询 sys.schema_unused_indexes 检查,但需注意定期任务可能使索引显示为未使用。
Q&A
如何使用PlanetScale Rails gem实现零停机的Rails数据库迁移?
使用PlanetScale Rails gem,可以通过将架构更改与代码更改分开,利用部署请求在不锁定表的情况下进行架构更改,从而实现零停机迁移。
为什么要将架构更改与代码更改分开?
将架构更改与代码更改分开可以避免在生产环境中因迁移导致的停机风险,确保发布过程更加安全和高效。
PlanetScale的部署请求如何防止停机?
PlanetScale的部署请求采用类似Git的工作流程,允许在开发分支上进行架构更改,并通过部署请求安全地将更改推送到生产环境,避免了表锁定。
在进行数据库列的添加时需要遵循哪些步骤?
在添加数据库列时,需先通过部署请求进行架构更改,然后再部署使用该列的代码,以确保无停机和数据一致性。
如何安全地删除数据库列?
安全删除数据库列的步骤包括先在模型中将该列标记为忽略,部署此更改后,再运行部署请求以删除该列,确保在删除前不再使用该列。
使用PlanetScale Rails gem的Rake任务有哪些?
PlanetScale Rails gem提供的Rake任务包括:迁移数据库、回滚数据库、加载当前架构和设置与PlanetScale的连接等。