我有一个非常基本的应用程序与独角兽。 Rails 5.1应用程序简单地回声/打印" Hello World"。对于测试,我给了4名工人。
unicorn.rb:
worker_processes 4
preload_app true
timeout 30
listen '127.0.0.1:3000', :tcp_nopush => true, :backlog => 4096
# Logging
...
现在,我向主进程发送USR2
信号。主过程成功接收到我的信号并创建了另一个主人,然后将其标记为" 旧"并将PID写入oldbin
文件
问题从这里开始。当我确保创建了第二个主人和他们的孩子时,我将QUIT
发送给旧主人。问题就在这里。当老主人收到QUIT
时,整个新旧主人和孩子都会掉线并重新创建。这使我的系统停机几秒钟。
基本上,新主人自杀然后重新创建。为什么?我在这做错了什么?我认为这是零停机时间。我可以向你保证我有3-5秒的停机时间。
我检查过,老主人用PID 5(例如)创建新主人,他们的孩子为6,7,8,9。当我退出旧主人时,新主人变为10,工人变为11,12 ,13,14。只是表明旧的和新的都退出并重新重新 - 创建。
我不使用-D
命令。我使用foreman生成systemd
文件,这就是它的样子:
[Unit]
PartOf=bp-web.target
[Service]
User=Pratha
WorkingDirectory=/var/www/app/releases/20170628140005
Environment=PORT=%i
ExecStart=/bin/bash -lc 'exec bundle exec unicorn -E production -c config/unicorn.rb'
Restart=always
StandardInput=null
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=%n
KillMode=mixed
TimeoutStopSec=5
答案 0 :(得分:1)
这是预期的行为:
Supervisord要求独角兽进程不要守护进程。同时向独角兽发送SIGUSR2会导致旧主人死亡。由于 supervisord观看旧主人 ,这将导致它将应用程序视为已退出,即使它正在使用新的进程ID运行。 最后,Supervisor将尝试重新启动应用程序,但由于新的独角兽大师正在使用所有套接字,因此无法执行此操作。
解决方案:
请参阅链接:Unicorn + Systemd/Supervisord & Zero Downtime = unicornherder