为什么LVS丢包?

我目前正试图回到一个问题的核心,我的LVS导演似乎不时从客户端丢失一个数据包。 我们在生产系统上遇到了这个问题,并且可以在升级时重现问题。

我在lvs-users-mailing-list上发布了这个问题,到目前为止没有回应。

我们的设置:

我们在PV XEN-DomU中使用Linux CentOS5 x86_64的ipvsadm。

当前版本详情:

  • 内核:2.6.18-348.1.1.el5xen
  • ipvsadm:1.24-13.el5

LVS-设置:

我们使用DR模式的IPVS来pipe理我们使用lvs-kiss的连接。

ipvsadm在heartbeat-v1-cluster(两个虚拟节点)中运行,主节点和备份节点都在不断运行。

对于LVS服务,我们使用由心跳(active / passive-clustermode)设置的逻辑IP

真正的服务器是物理的Linux机器。

networking设置:

作为director的VM在Dom0上使用桥接networking作为XEN-PV-DomU运行。

networking“在场”:

  • abn-network(staging-network,用于将客户端连接到director),由真实服务器用来向客户端发送答案(直接路由方式),用于ipvsadm slave / master multicast-traffic
  • lvs-network:这是连接director和real-servers的专用VLAN
  • DR-arp-problem:解决了我在服务-ip的真实服务器上抑制了arp-answers的问题
  • 服务IP在真实服务器上的lvs接口上configuration为逻辑IP。
  • 在这种设置中,ip_forwarding在任何地方都不需要(无论是在director还是在真实服务器上)。

虚拟机详情:

1 GB RAM,2个vCPU,系统负载几乎为0,内存73M空闲,224M缓冲区,536Mcaching,无交换。

几乎总是100%空闲,0%us / sy / ni / wa / hi / si / st。

configuration细节:

ipvsadm -Ln对于有问题的服务显示:

 TCP xy183.217:12405 wrr persistent 7200 -> 192.168.83.234:12405 Route 1000 0 0 -> 192.168.83.235:12405 Route 1000 0 0 

xy前两个八位字节来自我们内部的B类范围。 我们使用192.168.83.x作为lvs-network进行登台。

持久ipvsadmconfiguration: / etc / sysconfig / ipvsadm :–set 20 20 20

集群configuration: /etc/ha.d/haresources :$ primary_directorname lvs-kiss xy183.217

以上服务的lvs-kiss-configuration-snippet:

 <VirtualServer idm-abn:12405> ServiceType tcp Scheduler wrr DynamicScheduler 0 Persistance 7200 QueueSize 2 Fuzz 0.1 <RealServer rs1-lvs:12405> PacketForwardingMethod gatewaying Test ping -c 1 -nq -W 1 rs1-lvs >/dev/null RunOnFailure "/sbin/ipvsadm -d -t idm-abn:12405 -r rs1-lvs" RunOnRecovery "/sbin/ipvsadm -a -t idm-abn:12405 -r rs1-lvs" </RealServer> <RealServer rs2-lvs:12405> PacketForwardingMethod gatewaying Test ping -c 1 -nq -W 1 rs2-lvs >/dev/null RunOnFailure "/sbin/ipvsadm -d -t idm-abn:12405 -r rs2-lvs" RunOnRecovery "/sbin/ipvsadm -a -t idm-abn:12405 -r rs2-lvs" </RealServer> </VirtualServer> 

idm-abn,rs1和rs2通过/ etc / hostsparsing。

关于服务:

这是一个soa-web服务。

我们如何重现错误:

从客户端,我们在三秒内以一次呼叫的间隔对Web服务进行持续的呼叫。 不时会有一个连接从导演重置到客户端。

有趣的是:这发生在nx100th + 1次尝试 – 有趣的是一个。

我们做了什么来追查问题:

  • Checked / proc / sys / net / ipv4 / vs :所有值都设置为默认值,所以drop_packet不在位(= 0)
  • 客户端上的tcpdump,导向器的前端/ abn,目录的后端/ lvs,真实服务器的lvs和abn

在这个tcpdump中,我们可以看到来自客户端的请求,通过导演的连接重置来回答。 数据包不通过LVS转发。

我欢迎任何有关如何进一步跟踪这个问题的想法。 如果有任何信息不清楚/缺less来深入解决问题,请询问。

你对LVS-DR导向器有任何有状态的iptables规则吗? 正如我所看到的,你使用的端口12405,所以如果你有这样的规则:

 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 12405 -j ACCEPT 

在LVS-DR真实服务器回应客户(而不是导演)的请求时,导演不会将这些连接添加到连接跟踪表中,并且在导演的iptables上将不会检测到FIN数据包,而规则ESTABLISHED,RELATED 。 由于您只在端口12405上允许NEWSYN )数据包, FIN将被阻塞。 您必须在LVS-DR导向器上使用无状态防火墙来实现负载均衡服务:

 iptables -A INPUT -m tcp -p tcp --dport 12405 -j ACCEPT