Rails Rails 生产环境下面 reload!

linjunhalida · 2014年09月07日 · 最后由 Victor 回复于 2014年09月11日 · 4460 次阅读
本帖已被管理员设置为精华贴

rails console 可以用reload!来重新加载所有的源文件,方便一边开发一边调试。原理是清除掉所有的常量,下次使用的时候会再自动加载。

我在想,是否可以在生产环境下面这样做(config.cache_classes=true),平时不开启这样的功能,更新了代码之后,手动触发一个force_reload!,之后代码就更新了?

tmp/restart.txt

@wuwx 这种是容器级别的重启,会有 downtime。。

  1. 这个 force_reload! 具体指的是什么呢?有相关文档吗?
  2. 如果考虑到生产环境部署时有 downtime,可以考虑使用 unicorn,能够达到部署重启时 zero downtime 的效果。

unicorn 这类容器都可以做到 gracefully restart 吧

Unicorn, Passenger 4 的重启都是无缝的,只是重启期间需要 2 倍内存。

#2 楼 @linjunhalida 应该没有 downtime 啊,除非你的应用压力太大,一段时间的不响应会导致 OS 的 socket 队列过长而开始丢包。如果已经是这个情况了,那你应该前面有一个 LB 顶着,然后后端轮流升级才对。

是的,unicorn 这类是可以做到无缝重启,我是看到 reload! 这个功能后,想到可以在 ruby 进程里面实现重启。所以问一下大家。

unicorn 的重启是热重启吧,加了 Gem 或者修改了配置需要关闭进程后再启动才有效

#8 楼 @sanivbyfish Unicorn 虽然是热重启,但是项目过大的时候,重启的瞬间 (几秒钟) 是卡住的

config.cache_classes 关掉会有性能问题,另外生产环境这样 reload 会产生不可预知的结果。

好的办法是使用集群分批重启(分批下线,重启,上线)

你以为你用的是 Erlang 啊。

感觉又回到了我的某个论调..."运维是成本和技术上的平衡".......套过来说的就是与其花时间研究如何在 ruby 里面 reload(全部 reload 相当于重启,部分 reload 则不知道哪些需要 reload, 以及 reload 的顺序), 不如在更通用的层面上统一解决这个问题 (比如大集群分批重启,或者小集群使用提供的无缝重启功能)

如果你在产品环境 config.cache_classes = true 那么每一次请求都会让你的代码重载一次。性能将成为悲剧

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