为什么LVS会丢包?

Nil*_*ils 2 xen lvs centos5

我目前正在尝试解决问题的核心,我的 LVS 控制器似乎不时丢弃来自客户端的数据包。我们在我们的生产系统上有这个问题,并且可以在登台时重现这个问题。

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

我们的设置:

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

当前版本详细信息:

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

LVS-设置:

我们在 DR 模式下使用 IPVS,我们使用 lvs-kiss 来管理正在运行的连接。

ipvsadm 在heartbeat-v1-cluster(两个虚拟节点)中运行,主节点和备份节点在两个节点上持续运行。

对于 LVS 服务,我们使用由心跳设置的逻辑 IP(主动/被动集群模式)

真实服务器是物理 Linux 机器。

网络设置:

充当控制器的 VM 在使用桥接网络的 Dom0 上作为 XEN-PV-DomU 运行。

网络“在玩”:

  • abn-network(staging-network,用于将客户端连接到director),由真实服务器用于向客户端发送应答(直接路由方式),用于ipvsadm slave/master 多播流量
  • lvs-network:这是一个连接控制器和真实服务器的专用 VLAN
  • DR-arp-problem:解决了我在真实服务器上为 service-ip 抑制 arp-answers
  • service-IP 被配置为 real-server 上 lvs-interface 上的逻辑 IP。
  • 在此设置中,任何地方都不需要 ip_forwarding(无论是在导演上,还是在真实服务器上)。

虚拟机详情:

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

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

配置详情:

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

TCP  x.y.183.217:12405 wrr persistent 7200
 -> 192.168.83.234:12405   Route   1000   0          0
 -> 192.168.83.235:12405   Route   1000   0          0
Run Code Online (Sandbox Code Playgroud)

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

持久 ipvsadm 配置: /etc/sysconfig/ipvsadm:--set 20 20 20

集群配置: /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>
Run Code Online (Sandbox Code Playgroud)

idm-abn、rs1 和 rs2 通过/etc/hosts解析。

关于服务:

这是一个 soa-web-service。

我们如何重现错误:

从客户端,我们以每三秒一次调用的间隔不断地调用 Web 服务。不时会有从控制器到客户端的连接重置。

有趣:这发生在第 100 次 + 1 次尝试中 - 有趣的是。

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

  • 检查/proc/sys/net/ipv4/vs:所有值都设置为默认值,因此 drop_packet 未到位(= 0)
  • 客户端的tcpdump,director的fronted/abn,目录的backend/lvs,real-servers的lvs和abn

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

我欢迎任何关于如何进一步追踪这个问题的想法。如果有任何信息不清楚/缺失以深入研究问题 - 请询问。

Str*_*dic 5

你有关于 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
Run Code Online (Sandbox Code Playgroud)

在 LVS-DR 中,真实服务器响应来自客户端(而不是控制器)的请求,控制器不会将这些连接添加到连接跟踪表中,并且FIN不会在带有规则的控制器的 iptables 上检测到数据包ESTABLISHED,RELATED。由于您只允许NEW( SYN) 端口 12405 上的数据包,因此FIN将被阻止。您必须在 LVS-DR Director 上使用无状态防火墙来实现负载平衡服务:

iptables -A INPUT -m tcp -p tcp --dport 12405 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)