Socket Takeover
在 Meta 的《Zero Downtime Release:Disruption-free Load Balancing of a Multi-Billion User Website》论文中提到了一种 Socket Takeover 技术,
该技术能够 将一个打开的 Socket FD 从旧进程传递到新进程。
相关技术
file descriptor
要理解这项技术,首先要明白 Linux 的 file descriptor。file descriptor (简称 fd)是一个抽象的指示符,以一个非负整数来表示。fd 和底层文件系统中的文件进行绑定,fd 只在打开文件的进程有效。
如果把 fd 当作一个普通的值传递给其他进程用于打开,其他进程是无法使用这个 fd 的。
Unix domain socket
Unix domain socket(简称 uds)是在 unix 环境下的一种特殊的 socket。uds 地址采用路径名的形式。与网络套接字不同,跨 Unix 域套接字的 I/O 不涉及底层设备上的操作(这使得 Unix 域套接字比在同一主机上执行 IPC 的网络套接字要快得多)。
uds 在传输数据时,除了能够像普通的 socket 那样传输数据,还能够进行特殊的 辅助数据传输(Ancillary Data Transfer )。
在 Linux 上可以进行三种类型的辅助数据传输:
SCM_RIGHTS
SCM_CREDENTIALS
SCM_SECURITY
在实现 Socket Takeover 时就需要使用到 SCM_RIGHTS
。
SCM_RIGHTS
能够在不同进程之间传递 file descriptor(更准确来说是传递的文件所有权,类似于父子进程之间能够共享文件)。
实现
下面是用 Go 实现的 Socket Takeover demo,该demo中包含三个模块:client(TCP 客户端)、server(TCP server)和forward(UDS Server)。
|
|
|
|
|
|