我目前正在尝试解决问题的核心,我的 LVS 控制器似乎不时丢弃来自客户端的数据包。我们在我们的生产系统上有这个问题,并且可以在登台时重现这个问题。
我在 lvs-users-mailing-list 上发布了这个问题,但到目前为止没有得到任何回应。
我们在 PV XEN-DomU 中使用 ipvsadm 和 Linux CentOS5 x86_64。
我们在 DR 模式下使用 IPVS,我们使用 lvs-kiss 来管理正在运行的连接。
ipvsadm
在heartbeat-v1-cluster(两个虚拟节点)中运行,主节点和备份节点在两个节点上持续运行。
对于 LVS 服务,我们使用由心跳设置的逻辑 IP(主动/被动集群模式)
真实服务器是物理 Linux 机器。
充当控制器的 VM 在使用桥接网络的 Dom0 上作为 XEN-PV-DomU 运行。
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 次尝试中 - 有趣的是。
在这个 tcpdump 中,我们可以看到来自客户端的请求,由 Director 进行连接重置回答。数据包不是通过 LVS 转发的。
我欢迎任何关于如何进一步追踪这个问题的想法。如果有任何信息不清楚/缺失以深入研究问题 - 请询问。
你有关于 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)