是否可以在不断开连接的 TCP 套接字的情况下进行不停机部署?



有一个长连接的TCP套接字。最多两个客户端可以连接到服务器。换句话说,负载不高。但是,一旦建立TCP连接,除非发生意外,例如服务器断电或网络故障,否则套接字将不会断开连接。重新启动进程时是否可以重用现有的 TCP 套接字?我认为无法使用像 AWS NLB 这样的 TCP 负载均衡器,因为现有套接字不会移动到新应用程序。我希望有一个不停机的部署,因为我正在开发的系统是一个在套接字损坏和数据丢失时可能会遭受经济损失的系统。低级套接字编程是可以的。

我已经阅读了CloudFlare https://blog.cloudflare.com/graceful-upgrades-in-go/的文章,解释了Nginx的优雅重新加载机制。由于HTTP服务器是频繁打开和关闭套接字的服务器,因此该文章假设服务器的连接有一天会关闭,但我的情况略有不同。所以我不确定这是否可以使用。

套接字可以在多个进程之间共享,例如,通过在同一父进程中打开套接字并分叉子进程。但是,如果使用套接字的最后一个进程已关闭,则套接字将隐式关闭,因此基础连接将隐式关闭。

这意味着您必须确保始终有一个使用套接字的进程处于打开状态。例如,如果新软件的部署没有首先退出旧进程,然后创建新进程,但如果新进程将启动并且旧进程会将套接字传输到新进程,则可以执行此操作,请参阅我可以将文件描述符共享到 linux 上的另一个进程还是进程的本地进程? 了解如何在 Linux 中做到这一点。其他方法是在执行fork()时使用文件描述符继承。

请注意,这些文件描述符的共享仅适用于状态完全保留在操作系统内核中的普通套接字。TLS套接字将更加困难或不可能,因为在这种情况下,还需要以某种方式共享当前的用户空间状态。

另一种方法是使用一些中间"代理",一方面具有与fragil应用程序的稳定套接字连接,另一方面是与要更新的应用程序的强大套接字处理(即在需要时重新连接(。然后,此代理在两端之间传输流量,并在需要时在出现问题时重新连接套接字。

最新更新