Rails部署:数据库和应用程序不同步

时间:2013-11-14 13:37:22

标签: mysql ruby-on-rails deployment solr capistrano

在Rails应用程序中,我有一个需要一段时间才能完成的迁移。首先,它更新列的默认值,然后重新索引Solr索引。问题是,在迁移运行时,旧版本的应用程序使用部分新数据库和solr索引来处理请求。而且由于新的默认列,它会引发一些错误。

有避免这种行为的最佳做法吗?我们应该使用第二个数据库和solr索引吗?我们正在与capistrano一起部署。

1 个答案:

答案 0 :(得分:2)

这是长期运行的复杂rails数据库迁移的常见问题。

有几种方法:

(1)在运行数据库迁移之前,将您的网络流量重定向到带有消息的页面,例如“我们将在接下来的30分钟内停止维护”。这样可以防止任何请求进入并使用仅部分迁移的数据库命中您的应用程序。由于停机时间,这并不理想。

(2)在代码部署之前运行数据库迁移,但要确保数据库是向后和向前兼容的。然后部署代码以使用新架构。您可能还想写入旧模式(直到下一个版本),以防您需要“回滚”。然后,在另一次迁移中删除或重命名列以清除架构。这称为“零停机数据库迁移”。

(3)您可以拥有两个数据库,一旦准备好新数据库,您就可以进行切换。但这里的问题是如果来自应用程序的频繁写入,如何使它们保持同步。您可以运行脚本以便在之后同步它们。

作为预防措施,您应该在迁移之前对数据库进行备份转储,以防您需要回滚。由于某些数据库迁移是不可逆转的,例如,删除列。 或者,您可以将受影响的表复制到临时表中作为备份。

当然,在相对平静的时期进行迁移。

对于solr,它应该处理增量更新而不会抛出错误。