教义迁移-负载均衡器的发布流程

时间:2018-10-02 17:30:18

标签: doctrine-orm load-balancing database-migration downtime

我在使用LoadBalancer的类似产品的环境中执行“教义迁移”时遇到问题。

发布步骤:

  1. 从负载均衡器(ELB)中取消注册节点。
  2. 更新节点上的代码
  3. 执行必需的命令(带有执行学说的迁移)。
  4. 在负载均衡器(ELB)中注册节点。

但是,第一个节点一切正常,我们发布新代码并执行迁移。但是,如果迁移包含不带默认值的表添加列,则下一个节点会出现问题。因为在下一个节点中,我们没有更新的代码(具有ORM的更新的元数据)。

作为示例,我们包含迁移:

ALTER TABLE customers ADD blocked BOOLEAN DEFAULT NULL;
UPDATE customers SET blocked = FALSE;
ALTER TABLE customers ALTER blocked SET NOT NULL;

在第一个节点上-一切正常。我们具有表的新结构和实体的更新后的元数据。但是,下一个节点无法将记录插入客户,因为它们的元数据不知道blocked字段。

在这种情况下我们的工作方式(无停机时间):

  1. 仅为添加列添加首次迁移,为设置的默认值添加首次更新。
  2. 代码应在对象的构造函数中设置默认值。
  3. 添加第二个迁移以删除默认值,并将其设置为非空。

结果,我们有了下一个流程。

第1版

ALTER TABLE customers ADD blocked BOOLEAN DEFAULT NULL;
UPDATE customers SET blocked = FALSE;

第2版

UPDATE customers SET blocked = FALSE WHERE blocked IS NULL;
ALTER TABLE customers ALTER blocked SET NOT NULL;

版本1和版本2-不同的版本。

但是,如果我们在团队重构代码时拥有旧版代码,这对管理来说将非常困难。因为我们应该了解所有PR-x.x.x发布后应该合并哪个PR。

我认为发布后包含的功能应解决此问题(抱歉,可能不正确的名称)。例如:

$ ./bin/console doctrine:migrations:migrate --pre-release
# Release all nodes.
$ ./bin/console doctrine:migrations:migrate --post-release

并且应该通过界面或注释标记迁移...

class Version000 implements PreRelease
class Version001 implements PostRelease

也许DoctrineMigrations或第三方库支持此功能。或者,也许我没有正确考虑,我们已经简化了解决方案?

0 个答案:

没有答案