2013-07-03 17 views
3

У меня есть серверы, которые развертываются с шеф-поваром каждые 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) 

это означает, что новый хозяин не может быть запущен (я не видел новый хозяина в списке процессов), но старый мастер не может быть закрыт и количество рабочих постоянно.

Что я могу сделать неправильно? Спасибо)

ответ

0

Я сделал 2 шага для решения проблемы:

1) Удалены application_root из unicorn.conf.rb 2) Установить максимальное количество рабочих от 32 до 16

Тогда ошибка исчезла из журналов.

1

Изящный способ перезапуска единорога будет повеса задача Rakefile:

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/ИДП/unicorn.pid. Этот путь может быть изменен путем изменения значения PID в конфигурации/unicorn.rb

pid "pids/unicorn.pid" 

Кроме того, если вы используете колпачок для развертывания, убедитесь, что этот файл имел разрешения на запись на удаленных серверах и добавьте этот файл. gitignore, чтобы этот файл не переопределял ваше локальное значение pid на удаленные серверы производства и тестирования.

Смежные вопросы