【问题标题】:Goal of zero downtime, how to use upstart with sockets & (g)unicorn:零停机时间的目标,如何使用带有套接字的新贵和(g)独角兽:
【发布时间】:2015-03-17 21:29:45
【问题描述】:

我的目标是电子商务应用程序的零停机部署,我正在尝试以最好的方式实现这一目标。

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

我的策略是在我的guincorn.py/unicorn.rb 文件中设置preload_app=true,然后通过向运行服务器的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 看到了an interesting way of accomplishing that。这对 upstart 来说是一个挑战,因为一旦 gunicorn/unicorn 的 exec-fork 接管,upstart 就不再监控它最初管理的流程,需要以某种方式重新建立。

【问题讨论】:

    标签: ruby-on-rails django sockets unicorn gunicorn


    【解决方案1】:

    您应该查看我在 GDS 的同事发来的 unicornherder,它专门用于管理此问题:

    Unicorn Herder 是一个实用程序,旨在帮助 Upstart 和类似的主管与 Unicorn 一起使用。

    【讨论】:

    • 谢谢!如果您对此有答案,我也对套接字的事情很好奇。这能以某种方式处理吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 2013-04-12
    • 1970-01-01
    • 2014-01-15
    • 2012-01-05
    • 2013-01-10
    相关资源
    最近更新 更多