如何做到数据库迁移 zero downtime

查看原文

这篇文章是 Discourse 的工程师讲他们如何做自动化部署,同时保证数据库表结构的迁移不会引起故障。他们的部署是全自动的。测试通过,自动部署到 meta.discourse.com。这套流程需要考虑的大问题就是数据库结构怎么做兼容。如果代码变更前后有不兼容的数据库表结构变更,势必引起重启应用后大型崩溃。

  • 首先,他们最终 migration 的各种信息,不只是 ActiveRecord 提供的那些功能,还得要有诸如以下之类的信息:
    • migration 什么时候跑的
    • migration 在哪台机器上跑的
    • migration 跑了多长时间
    • git / rails version
  • 其次,drop table 延迟执行;改字段 => 新建字段复制老字段的值,稍晚一些时候将老字段变为 readonly
  • 不信任自己:代码层面阻拦诸如 DROP TABLE 之类的代码
  • 建议:改造部署流程,提供 pre-deploy & post-deploy 的 db migration