首页 文章

两个Unicorn服务器如何绑定到同一个Unix套接字?

提问于
浏览
1

这个(相当旧的)article似乎暗示两个Unicorn主进程可以绑定到同一个Unix套接字路径:

当旧主人收到QUIT时,它会正常开始关闭其工作人员 . 一旦所有 Worker 完成了服务请求,它就会死亡 . 我们现在有一个新版本的应用程序,完全加载并准备好接收请求,没有任何停机时间:新旧工作者都共享Unix域套接字,因此nginx甚至不必关心转换 .

读书,我不明白这是怎么可能的 . 根据我的理解,要真正实现零停机,您必须使用 SO_REUSEPORT 让旧服务器和新服务器临时绑定到同一个套接字 . 但 SO_REUSEPORTnot supported on Unix sockets . (我通过绑定到另一台服务器已经在使用的Unix套接字路径来测试它,我得到了 EADDRINUSE . )

那么如何实现文章所描述的配置呢?

  • Nginx将HTTP请求转发到Unix套接字 .

  • 通常,单个Unicorn服务器接受此套接字上的请求并处理它们(足够公平) .

  • 在重新部署期间,新的Unicorn服务器开始接受此套接字上的请求并处理它们,而旧服务器仍在运行(如何?)

1 回答

  • 1

    我最好的猜测是第二个服务器在使用相同的套接字文件调用 bind 之前立即调用套接字文件上的 unlink ,所以实际上有一个小窗口,没有进程绑定到套接字,连接将被拒绝 .

    有趣的是,如果我绑定到套接字文件然后立即删除该文件,则实际接受与套接字的下一个连接 . 第二次和后续连接被 ENOENT 拒绝,如预期的那样 . 因此,当一个进程控制另一个进程绑定的套接字时,内核可能会为您提供一些帮助 . (这是在Linux BTW上 . )

相关问题