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