我们有一些 PHP-FPM 服务器,当它们需要数据库连接时,它们会连接到 HAProxy 服务器,该服务器会选择要使用的数据库服务器并打开连接。然后,当我们想要对 HAProxy 服务器进行一些维护时(例如需要重新启动 HAProxy 的配置更改),过程如下:
- 关闭 HAProxy 服务器上的 Keepalived
- 等待浮动IP转移到备份HAProxy服务器(同样运行Keepalived)
- 等到 HAProxy stats 只报告一个连接(我们检查有多少连接)
- 重启 HAProxy
- 重启 Keepalived
当第 2 步发生时,此时打开的 mysql 连接会发生什么情况?根据这个 TCP Sessions and IP Changes question,连接将被丢弃。真的是这样吗?如果是这样,如果有的话,可以做些什么来防止这种情况发生?是否可以以某种方式强制连接使用服务器的主(非浮动)IP?
我们也有类似的设置,两台 Nginx 服务器运行 Keepalived,我们正计划执行相同的过程。如果我们这样做,同样的问题也适用 - 当 IP 移动到另一台服务器时,现有的 http 连接会发生什么情况?
我感谢您的帮助。
他们断开连接。TCP 没有用于更改 IP 地址的协议部分,因此客户端不会知道它已经神奇地更改了。必须建立新的连接。
用于 TCP 连接的 IP 地址由客户端在建立连接时选择。选择可以由应用层通过在连接之前将套接字绑定到特定 IP 来做出,或者如果应用层没有做出选择则由内核做出。
内核做出的选择可以通过几种不同的方式进行控制。应将同时具有静态 IP 地址和浮动 IP 地址的主机配置为使用静态 IP 地址进行传出连接。如果您只想将 IP 用于传入连接而不用于传出连接,则可以将其分配给虚拟接口。
默认情况下,内核选择的 IP 地址是分配给发送 TCP SYN 数据包的接口的地址。如果您使用的是 IPv6,则可以进行更细粒度的控制,以下是一些可在 Linux 上使用的命令示例:
上面的一对命令将
2001:db8::234
用于通过 SYN 数据包发送eth0
。