【问题标题】:How to gracefully restart an unicorn?如何优雅地重启独角兽?
【发布时间】:2013-07-03 07:29:45
【问题描述】:

我有一台服务器,每 1 分钟与厨师一起部署一次。 对于重启独角兽,我将 USR2 信号发送给老主人,然后尝试通过代码减少老工人:

before_fork do |server, worker|

  # the following is highly recomended for Rails + "preload_app true"
  # as there's no need for the master process to hold a connection
  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!

  # This allows a new master process to incrementally
  # phase out the old master process with SIGTTOU to avoid a
  # thundering herd when doing a transparent upgrade. The last worker
  # spawned will then kill off the old master process with a SIGQUIT.
  old_pid = "#{server.config[:pid]}.oldbin"
  if old_pid != server.pid
    begin
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end

  # sleep 1
end

最后,将 QUIT 信号发送给老主人

每次我在日志中收到以下消息:

E, [2013-07-03T10:56:19.983813 #19955] ERROR -- : retrying in 0.5 seconds (1 tries left)
E, [2013-07-03T10:56:20.484468 #19955] ERROR -- : adding listener failed addr=0.0.0.0:3000 (in use)
E, [2013-07-03T10:56:20.484595 #19955] ERROR -- : retrying in 0.5 seconds (0 tries left)
E, [2013-07-03T10:56:20.985190 #19955] ERROR -- : adding listener failed addr=0.0.0.0:3000 (in use)                   
/my_path/766ea02ce174c37de606c1960c498d53c5fb602b/vendor/bundle/ruby/1.9.1/gems/unicorn-4.4.0/lib/unicorn/socket_helper.rb:147:in `initialize': Address  already in use - bind(2) (Errno::EADDRINUSE) 

这意味着无法启动新的master(我没有在进程列表中看到新的master)但无法关闭旧的master并且worker的数量是恒定的。

我可能会以错误的方式做什么? 谢谢)

【问题讨论】:

    标签: ruby-on-rails-3.2 unicorn


    【解决方案1】:

    重启独角兽的优雅方式将是 Rakefile 中的 rake 任务:

    task :restart_server => :environment do
         system("kill -QUIT `cat pids/unicorn.pid`")
         system("bundle exec unicorn_rails -c ./config/unicorn.rb -D")
    end
    

    这里假设文件“unicorn.pid”的路径,主服务器进程存在于application_root/pids/unicorn.pid中。这个路径可以通过改变config/unicorn.rb中pid的值来改变

    pid "pids/unicorn.pid"
    

    另外,如果您使用 cap 进行部署,请确保此文件在远程服务器上具有写入权限,并将此文件添加到 .gitignore,以便此文件不会将您的本地 pid 值覆盖到远程生产和测试服务器上。

    【讨论】:

      【解决方案2】:

      我做了两个步骤来解决这个问题:

      1) 从 unicorn.conf.rb 中删除 application_root 2) 将工人的最大数量从 32 设置为 16

      然后错误从日志中消失了。

      【讨论】:

        猜你喜欢
        • 2013-10-21
        • 1970-01-01
        • 1970-01-01
        • 2012-01-09
        • 2017-01-20
        • 1970-01-01
        • 2012-06-01
        • 2023-03-23
        • 1970-01-01
        相关资源
        最近更新 更多