2010-01-21 100 views
4

我想无缝升级我的Rails应用程序:无缝部署

含义:

  1. 如果没有迁移需要运行我想透明的升级代码,并没有要求在去404部署。
  2. 这很难我想有一些可以无缝地升级数据库的过程,在这段时间内,当数据库更新完成时,阻止网络请求(在管道中排队),允许通过。 (我只需要这个工作来缩短迁移 - 就像5-10秒的迁移)。

你将如何去实现这一目标?

+0

你使用哪个数据库? – Karussell 2010-01-21 11:13:38

+1

mysql,但我可能会限制自己,所以我不允许有任何非向后兼容的迁移。 – 2010-01-21 11:46:13

+0

我有一种感觉,我将不得不以保守模式运行 – 2010-01-21 12:47:40

回答

0

你应该看看Capistrano

+0

你是说只需运行几条* ln -s *命令就可以实现无缝部署?我使用capistrano,它的404中央 – 2010-01-21 11:47:23

+0

Capistrano提供了一个维护模式,您可以启用部署。此外,您可以配置Capistrano以便在部署时返回适当的503状态码。 – 2010-01-21 11:50:45

+0

我不想要任何503s我想要200s一路穿过 – 2010-01-21 12:39:21

3

升级只是代码

如果你刚刚升级的应用程序代码的乘客应该让你做到这一点没有慢半拍。但是,如果升级出错,它不会保护您,因为您应该考虑拥有两台或更多负载平衡的Web服务器,您可以单独进行循环升级。

升级数据库

作为一个用户,我宁愿看到比我的浏览器旋转10秒“停机维护”页面。如果您解释停机时间​​是几秒钟的顺序并将页面设置为自动刷新。

如果你是坚定的关于无停机时间,同时做数据库的升级,你有几个选择:

  1. 您可以在您保留旧的模式是有效的这样的方式重构你的数据库。这意味着您可以保留两个版本的应用程序针对同一个数据库运行,并随着时间迁移到新的模式。有很多'数据库重构'文章,其中大多数人主张使用触发器/等等来实现期望的结果。我个人认为这是很多努力,没有很多的奖励。

  2. 根据您的应用程序,您可能会严重偏向于读写操作,这意味着您可以在升级数据库时显示未缓存数据的“维护”页面(这是Facebook如何升级数据库)。如果您的大量数据存储在memcached或redis中,这将更加有效。或者,您可以切换到只读数据库从属设备并禁用任何写入操作。

我希望这有助于!