零停机时间的目标,如何在套接字和(g)独角兽中使用新贵:

耶克塔

我的目标是电子商务应用程序的零停机时间部署,并且我正在尝试以最好的方式做到这一点。

我在nginx / unicorn / django设置以及单独服务器的nginx / unicorn / rails设置上执行此操作。

我的策略是preload_app=trueguincorn.py/unicorn.rb文件中进行设置,然后通过向运行服务器的PID发送USR2信号来重新加载。这将分叉该进程,并且它是子进程,并且pre_fork/before_fork可以接管此进程并发送后续的QUIT信号。

这是我的pre_fork在guincorn版本中所做的示例:

# ...

pidfile='/opt/run/my-website/my-website.pid'

# socket doesn't come back after QUIT
bind='unix:/opt/run/my-website/my-website.socket'

# works, but I'd prefer the socket for security
# bind='localhost:8333'

# ...

def pre_fork(server, worker):
    old_pid_file = '/opt/run/my-website/my-website.pid.oldbin'

    if os.path.isfile(old_pid_file):
        with open(old_pid_file, 'r') as pid_contents:
            try:
                old_pid = int(pid_contents.read())
                if old_pid != server.pid:
                    os.kill(old_pid, signal.SIGQUIT)
            except Exception as err:
                pass

pre_fork=pre_fork

这是我的sysv脚本中的一个选项,它执行重新加载:

DESC="my website"
SITE_PATH="/opt/python/my-website"
ENV_PATH="/opt/env/my-website"
RUN_AS="myuser"

SETTINGS="my.settings"
STDOUT_LOG="/var/log/my-website/my-website-access.log"
STDERR_LOG="/var/log/my-website/my-website-error.log"
GUNICORN="/opt/env/my-website/bin/gunicorn.py"

CMD="$ENV_PATH/bin/python $SITE_PATH/manage.py run_gunicorn -c $GUNICORN >> $STDOUT_LOG 2>>$STDERR_LOG"

sig () {
  test -s "$PID" && kill -$1 `cat $PID`
}

run () {
  if [ "$(id -un)" = "$RUN_AS" ]; then
    eval $1
  else
    su -c "$1" - $RUN_AS
  fi
}

reload () {
  echo "Reloading $DESC"
  sig USR2 && echo reloaded OK && exit 0
  echo >&2 "Couldn't reload, starting '$DESC' instead"
  run "$CMD"
}
action="$1"
case $action in
reload)
  reload
  ;;
esac

我选择preload_app = true来实现零停机时间呼吁。由于工作人员已将应用程序预加载到内存中,因此,只要我正确切换进程,它就应该将停机时间模拟为零。无论如何,这就是想法。

这在我通过端口监听的地方有效,但是我无法通过套接字使其正常工作。

我的问题如下:

  • 这是其他人的做法吗?
  • 有没有更好的方法,例如以某种方式使用HUP?我的理解是您不能preload_app=true与HUP一起使用
  • 是否可以使用套接字执行此操作?我的套接字在QUIT上不断消失,再也不会回来。我的想法是套接字更加安全,因为您必须有权访问文件系统。
  • 有人这样做upstart而不是sysv吗?理想情况下,我希望这样做,并且看到了一种通过聚集PID来完成此操作的有趣方法这对于新贵来说是一个挑战,因为一旦来自gunicorn / unicorn的exec-fork接手,新贵就不再监视它原来管理的流程,需要以某种方式重新建立。
丹尼尔·罗斯曼

您应该看一下GDS同事的独角兽,它是专门为管理这一问题而设计的:

Unicorn Herder是一种实用程序,旨在协助Unicorn使用Upstart和类似的主管。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

零停机时间的目标,如何在套接字和(g)unicorn中使用新贵:

来自分类Dev

Rails中的独角兽和撬

来自分类Dev

独角兽和烧瓶的蓝图

来自分类Dev

如何使独角兽在Ubuntu中运行?

来自分类Dev

如何使独角兽在Ubuntu中运行?

来自分类Dev

独角兽瓶

来自分类Dev

如何使用独角兽和配置文件在生产模式下启动Rails服务器?

来自分类Dev

如何在停机时间为零的情况下使用Docker和Fig更新生产中的Rails应用程序?

来自分类Dev

Nginx上游超时了长时间的独角兽请求

来自分类Dev

使用Ruby 2.0.0和Rails 3.2.14的独角兽热重启

来自分类Dev

独角兽和Nginx的奇怪问题导致502错误

来自分类Dev

芹菜和独角兽工人之间的区别?

来自分类Dev

乘客和独角兽服务器之间的区别

来自分类Dev

更改独角兽的端口

来自分类Dev

独角兽插座消失

来自分类Dev

独角兽开始冻结

来自分类Dev

如何重启我的独角兽服务器?

来自分类Dev

如何手动重启独角兽

来自分类Dev

独角兽工人如何共享Rails会议?

来自分类Dev

使用Docker部署到生产中:零停机时间

来自分类Dev

使用Docker部署到生产环境:零停机时间

来自分类Dev

如何在停机时间最少或没有停机的情况下更改Azure资源中的密码和密钥

来自分类Dev

如何在Python和子进程中使用套接字?

来自分类Dev

Angular App的零停机时间部署

来自分类Dev

捆绑更新独角兽错误

来自分类Dev

独角兽下有大量线程

来自分类Dev

独角兽不重装工人

来自分类Dev

独角兽不采摘stderr

来自分类Dev

独角兽是星期几吗?