在本文中,我们将探讨针对仅向前迁移、无缝开发人员协作和生产安全部署而优化的数据库迁移和发布流程。此流程经过量身定制,可确保数据库架构完整性、应用程序兼容性以及更新期间的最小风险,并遵循**扩展和收缩模式**的原则。
核心原则
仅向前迁移:无回滚:所有迁移都向前进行,以避免数据丢失或不一致等风险。删除或更改现有架构元素(例如,删除列)的更改将推迟到稍后阶段。专用迁移拉取请求:数据库架构更改作为独立拉取请求 (PR) 提交,与应用程序代码更改分开。这可确保数据库保持稳定状态,而无需将迁移与部分实现的功能耦合。扩展和收缩模式:扩展阶段:引入新列、表或索引,而不删除现有架构元素。确保应用程序向后兼容。收缩阶段:仅在验证应用程序中不再使用弃用的架构元素后,才删除它们。带外迁移:迁移独立于应用程序部署执行,避免在生产环境中不必要的资源使用。最小化锁问题:使用在线模式更改工具(例如,pt-online-schema-change,gh-ost)来防止表锁并避免在迁移期间降低数据库性能。建议的工作流程
开发人员工作流程
针对特定功能的开发:开发人员从主干分支创建功能分支(例如,feature/add-new-column)。架构变更以 SQL 文件的形式实现,并添加到独立的迁移分支(例如,migrations/add-new-column)。文件夹结构示例:
migrations/
├── 2024122001_add_column_to_users.sql
├── 2024122002_add_new_table_orders.sql
提交拉取请求:开发人员提交针对主干的迁移特定 PR。审阅者验证 SQL 查询,检查其对性能的影响,并确保遵守扩展和收缩模式。合并到主干:已批准的迁移将合并到主干分支并准备部署到沙盒/暂存环境。部署过程
沙盒/暂存部署
沙盒环境部署最新的trunk分支。迁移是在扩展阶段应用的,添加列、表或索引而不删除现有的架构元素。生产部署
**步骤 1:应用迁移**
迁移应用于生产数据库,与应用程序部署无关。使用在线模式更改工具来防止锁定和性能下降:gh-ost \ --host=production-db-host \ --database=app_db \ --table=users \ --alter="ADD COLUMN new_column VARCHAR(255) DEFAULT NULL" \ --execute**步骤 2:部署应用程序变更**
仅在迁移完成后部署应用程序,确保它可以访问更新的模式。根据需要使用基于环境的功能标志激活依赖功能。合同阶段
一旦应用程序不再依赖于弃用的模式元素,就会提交单独的迁移 PR 以删除未使用的列或表。这些迁移遵循同样严格的审查和部署流程。处理潜在问题
锁定和性能下降:使用 pt-online-schema-change 或 gh-ost 等工具进行大型表修改。这些工具可以创建影子表、逐步应用更改以及交换表而无需停机。模式验证:自动测试以验证:迁移幂等性。在类似生产的数据集上成功执行。应用程序与新旧模式兼容。数据回填:对于大规模数据迁移(例如填充新列),使用批量更新来最小化数据库负载:UPDATE users SET new_column = old_column WHERE new_column IS NULL LIMIT 1000;使用 cron 或 Celery 等作业调度程序自动执行批处理。最佳实践
避免过早移除列:在安排移除列之前,请确认应用程序不再使用列。使用日志记录或审计查询来确认是否已不再使用。自动化迁移管道:使用 CI/CD 工具在沙盒、暂存和生产环境中自动执行迁移。管道步骤示例:
- name: Apply Migrations
run: ./migration-tool migrate --env production
监控迁移影响:使用数据库监控工具(例如 PostgreSQL 的 pg_stat_activity)来跟踪迁移性能和资源使用情况。有效协作:就迁移计划和潜在影响在开发人员、DBA 和 DevOps 团队之间保持清晰的沟通。结论
通过遵循这些原则和工作流程,团队可以确保整个发布过程中的数据库稳定性和应用程序兼容性。仅向前迁移、扩展和收缩模式以及自动化工具可实现无缝转换,即使在高流量生产环境中也是如此。此过程可最大限度地降低风险、避免停机并确保顺利推出 Web 应用程序的功能。