Rails 服务器自动重启影响 Rails 后台任务的问题

linjunhalida · 2015年05月20日 · 最后由 linjunhalida 回复于 2015年05月20日 · 2692 次阅读

服务器设置了自动镜像备份(AWS),备份的过程中,需要重启服务器。会有一些问题:

  • 服务器跑了 Resque 或者 Sidekiq,后台有任务在执行中,重启的时候,是等待任务执行完毕,还是让任务失败?
  • 服务器上面跑的 Redis 往往很快就关闭了,但是 Resque/Sidekiq 还保持连接,可能发生数据丢失的状况?
  • 服务器跑的 mysql 也会停止,如果比 Rails 进程更先停止,那么是否会发生数据丢失或者错误的状况?

根据以上问题,是否需要在操作系统层面上管理 Rails 进程?这样可以做依赖管理(比如用 systemd),请问大家的看法?

Sidekiq 有种状态模式叫 quiet (或是 USR1 信号),这个时候 Sidekiq 不会再开始新的任务,但已经开始的任务还能继续执行

发布前,先将 Sidekiq 切到 quiet 模式,然后发布代码,重启 Rails App Server,最后才重启 Sidekiq。

https://github.com/mperham/sidekiq/wiki/Signals#usr1

USR1 tells Sidekiq it will be shutting down at some point in the near future. It will stop accepting new work but continue working on current messages. Use USR1+TERM to guarantee shutdown within a time period. Best practice is to send USR1 at the start of a deploy and TERM at the end of a deploy.

楼主遇到的问题,Sidekiq 稳定关闭用 #1 楼 @huacnlee 说的就 OK。 另外两个,数据库比服务先关闭,导致数据丢失风险的,还是用操作系统层面的进程依赖来实现吧。就像那些依赖网络的服务,都是在系统关闭网络前,先被调用关闭的。

不过,楼主说的关机备份的方式,好像本身就是个问题。 大部分服务,无论数据库还是文件,都可以联机备份的。配合自动部署脚本,可以随时在新机器上配置出一样的环境。这样就不用关机备份了,也就没有那些困扰了。

#1 楼 @huacnlee 重启机器的话,还是要做依赖管理,sidekiq 先关闭,然后再关 redis。

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