分享 最近我遇到一个需求,要求实现 Rails 的热部署

xds2000 · 2012年07月01日 · 最后由 xds2000 回复于 2012年07月03日 · 4772 次阅读

一句话,不支持。 但可以变相实现零当机。

参考 http://www.slideshare.net/pedrobelo/zero-downtime-deploys-for-rails-apps http://www.engineyard.com/blog/2011/zero-downtime-deploys-with-migrations/ http://blog.tstmedia.com/news_article/show/85364?referrer_id=308069

不知道大家有啥点子,出出注意。

在使用 passenger 时,touch tmp/restart.txt也是把rack重启一下,不应该算是热部署。

如果以上有不对的地方,请指教。

unicorn 的 kill -USR2 应该算是热部署吧

热部署在互联网领域是个伪命题,常见的真实需求实际上是“不间断服务”,楼主最好先和需求确定一下是否真的要支持热部署吧

第一个 slide 不错: 实现 Rails 热部署需要解决 3 个问题:

  1. reduce asset pipline time
  2. reduce db migration time
  3. reduce server reboot time

其中下面两个链接讲的大概是减少 db migration 的技巧。 第一个 slide 里还提到了 preboot 方法,通过路由切换的方式减少 server reboot 时间:

正常部署过程是:

  1. Code push
  2. Run buildpack; store slug
  3. Pause routing service
  4. Kill old dynos
  5. Boot new dynos
  6. Resume routing service

使用 preboot 方式之后,减少了 3-6 之间的等待时间:

  1. Code push
  2. Run buildpack; store slug
  3. Boot new dynos
  4. Switch routing
  5. Kill old dynos

但是不能处理带有 db migration 的部署。

@fsword 我的客户确实需要 Hot Deploy,并想应用到 Rails 中。Hot Deploy 的概念来自 Jboss

#4 楼 @xds2000 你的用户是怎么描述“热部署”这个名词的?如果他说“和 jboss 一样”,那我认为需求并没有被明确,因为用户的最终目的显然并不是做一款 ruby 版的 jboss,这种说法更象是个 how to do,而你们需要明确的是 what to do —— 用户希望解决什么实际问题?

@fsword 确切的说,就是当 git repo 更新后,推到生产环境。rack 不重起,就可以把 rails 环境 reload 一遍。类似在 Rails console 下输入 reload! 的效果。

#6 楼 @xds2000 这个描述很细节了,更象解决方案而不是问题本身啊。这么说吧,你们的 rails(单机或者集群)一共有几个进程?在不中断服务的前提下依次重启这些进程能否满足要求?

@fsword 用的是 apache + passenger,没做优化,进程多少不清楚。 不中断服务,重启服务的方法已经了解,可以满足要求。

我这里讨论仅是开个话题。有好思路还请提醒。

什么样的需求,需要严格限定“技术上”的热部署呢?

PaaS 实现

#10 楼 @xds2000 这个不太熟悉,不过我曾经和别人讨论过这种场景,直觉上,PaaS 更加互联网,所以应该更不需要热部署这种东西。比如你可以提供个用户的是某种部署平台实例,它是从实例池取出来的,那么用户需要进行升级的时候只要在实例池中重新取出一个,然后部署好就行了,PaaS 所要做的只是前端机切换,服务并不中断

成功的热部署应该是象 erlang 那样,用非共享的多实例切换来解决问题,但是对 ruby/java 这种对象化的语言来说,vm 实现通常是不支持内存隔离的,所以正确的方向应该是以进程或者主机为单位来切换

你是问的“无缝重启”吧?

#12 楼 @fsword Java 有 OSGi ...

我觉得还是要先定义最大可接受无响应时间

#14 楼 @bhuztez OSGi 没那么有用,实际中如果用 osgi,改造工作将十分漫长。个人理解,java 中的几项设计相互影响,导致 osgi 达不到理想的效果 - 对象和类分离、线程模型、classloader 加载模型。这其中,ruby 不存在第一点的问题,但是在第二点上和 java 是一样的,至于第三点,我还不是很精通,不好乱说

#15 楼 @bhuztez 是的,所谓热部署只是个实现方案,真正的需求是系统的响应指标

@huacnlee 客户是这么希望的,具体实现没要求。

大家交流后基本思路一致。点到为止。不必回复了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号