tunnel模式和arp代理/代答

这次在项目上部署sql组件的时候,负载采用的是lvs的tunnel模式,机器为vmware,网络环境为思科的asic。
由于采用的是硬件SDN,而思科是默认打开arp代理和arp代答模式(arp_flood)的,结果导致lvs同网段的机器无法访问到VIP,因为获取不到VIP的mac地址,arp表无法写入,所以之后打开了arp_flood就解决了同网段无法访问的问题。

端口自动学习

除此之外,另一个网段访问这个VIP由于经过了网关,也就是走入了硬件SDN交换机,lvs的tunnel会在被负载的机器上添加一张tunl网卡,这样回包的时候就不需要再经过lvs机器了,而是以自身为源vip地址往客户端发包即可,这样确实节省了时间。但是在这个网络环境下,交换机自动会记录返包的端口更新为VIP所在端口,这就导致了这个端口和真实应该发往的VIP对不上,因为这不是lvs机器而是真实的被负载的机器,然后就MAC冲突开始丢包了。后来行方关闭了端口的自动学习,问题也就得到了解决。

mtu

最后一个坑就是mtu了,在经过上述修改后,被负载的机器的自身网卡mtu为1480,tunl为1500,lvs的网卡为1500,这就造成了隐患。
具体表现就是,我在通过lvs的vip去访问数据库时,通过短的sql语句去DML时没有问题,但一旦使用长sql语句就会卡住不动,无法进行insert操作,当然这就是因为mtu值设置的不对,导致长sql语句被分包,然后出现异常,该问题在mtu全部修改为1500后得到解决。

# 设置mtu值命令
ifconfig [网卡] mtu 1500 up
# 这样重启后还是会失效,最好是写入网卡配置里

总结

网络是个坑,但是得知道怎么排查才行。

Q.E.D.


刚毕业走上社会被毒打的搬砖狗