当一个服务器IP改变时,确实存在的TCP(例如http / mysql)连接仍然在运行

我们有一些PHP-FPM服务器,当他们需要一个数据库连接时,他们连接到一个HAProxy服务器,它select一个数据库服务器来使用,并打开连接。 当我们然后想要对HAProxy服务器执行一些维护(例如需要HAProxy重启的configuration更改)时,过程如下:

  1. 在HAProxy服务器上closuresKeepalived
  2. 等待浮动IP转移到备份HAProxy服务器(也运行Keepalived)
  3. 等到HAProxy统计报告只有一个连接(我们检查有多less连接)
  4. 重新启动HAProxy
  5. 重新启动Keepalived

当步骤2发生时,那个时候打开的mysql连接会发生什么? 根据这个TCP会话和IP变化问题 ,连接将被丢弃。 这是真的吗? 如果是这样,可以做些什么来防止这种情况发生? 连接可以以某种方式强制使用服务器的主(非浮动)IP?

我们也有两个运行Keepalived的Nginx服务器的类似设置,我们正在计划进行等效的过程。 如果我们这样做,同样的问题适用 – 当IP移动到另一个服务器时,现有的http连接会发生什么?

我感谢您的帮助。

他们断开。 TCP没有用于更改IP地址的协议部分,所以客户端不会知道它已经改变了。 一个新的连接将不得不build立。

build立连接时,客户机将select用于TCP连接的IP地址。 select可以由应用层进行,可以通过在连接之前将套接字绑定到特定的IP上,或者如果应用层没有做出select,则由内核来进行。

内核所做的select可以通过几种不同的方式进行控制。 具有静态IP地址和浮动IP地址的主机应该configuration为使用静态IP地址作为出站连接。 如果您只想将IP用于传入连接而不用于传出连接,则可以将其分配给虚拟接口。

默认情况下,内核select的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作为通过eth0发送的SYN数据包。