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