适用于 Web 应用程序的强大数据库迁移和发布流程

在本文中,我们将探讨针对仅向前迁移、无缝开发人员协作和生产安全部署而优化的数据库迁移和发布流程。此流程经过量身定制,可确保数据库架构完整性、应用程序兼容性以及更新期间的最小风险,并遵循**扩展和收缩模式**的原则。

核心原则

  • 仅向前迁移:无回滚:所有迁移都向前进行,以避免数据丢失或不一致等风险。删除或更改现有架构元素(例如,删除列)的更改将推迟到稍后阶段。
  • 专用迁移拉取请求:数据库架构更改作为独立拉取请求 (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 应用程序的功能。