我们正在使用ipvs
L4 负载平衡,它以 ipip 隧道模式将数据包传输到 L7 后端。
有三个 ipvs 系统配置了源散列以实现持久性。有时,ipvs 会将数据包传输到错误的后端。
例如,ipvs 1 从客户端 1.1.1.1 接收数据包,并将该数据包发送到后端 realserver 1,同一客户端的下一个数据包由 ipvs 2 接收,然后发送到后端 realserver 2。现在,后端 2 不知道这个数据包,因为连接实际上是由 realserver 1 发起的,因此 realserver 2 使用 RST 数据包结束连接。
这不仅发生在特定客户端上,所有客户端都具有相同的行为。
据我了解,由于源散列算法,所有 L4 ipv 都应该选择相同的真实服务器。
我在实验室中建立了相同的设置,但无法重现。有问题的设置是生产设置,因此我无法出于调试目的对其进行任何重大更改。
Keepalived用于管理ipvs。
关于如何以最小的影响调试此问题的任何指导都将非常有帮助。
PS - 我知道源散列不太一致,但发送到错误真实服务器的数据包太多了。我们还有其他集群,从未见过此问题。
IPVS 1
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP x.x.x.26:443 401541 3620595 0 458422K 0
-> x.x.x.1:443 401234 3618511 0 458239K 0
-> x.x.x.2:443 15 126 0 12341 0
-> x.x.x.3:443 35 213 0 20832 0
-> x.x.x.4:443 16 113 0 10980 0
-> x.x.x.5:443 19 132 0 12113 0
-> x.x.x.6:443 18 140 0 13616 0
-> x.x.x.7:443 12 97 0 9262 0
-> x.x.x.8:443 19 120 0 10448 0
-> x.x.x.9:443 164 1083 0 88618 0
-> x.x.x.15:443 9 60 0 5498 0
IPVS 2
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP x.x.x.26:443 402903 3626029 0 459621K 0
-> x.x.x.1:443 12 56 0 4150 0
-> x.x.x.2:443 21 132 0 12967 0
-> x.x.x.3:443 168 1084 0 89908 0
-> x.x.x.4:443 14 122 0 11005 0
-> x.x.x.5:443 12 79 0 7045 0
-> x.x.x.6:443 402584 3623968 0 459444K 0
-> x.x.x.7:443 29 146 0 12899 0
-> x.x.x.8:443 22 190 0 17336 0
-> x.x.x.9:443 10 66 0 6049 0
-> x.x.x.15:443 31 186 0 15724 0
谢谢 !