急!请教章博士

章博士:你好!我建立了一个LVS/DR方式的FTP集群,基本配置为一台LB调度器,后台五台真实服务器,真实服务器下连接的为NFS文件系统存储,存储中有10000个文件。操作系统都为SUSE 9(内核2.6.5).调度器的调度脚本为:
# Stopping the ip_forward for the secure reason,if you need ip_forward ,you can
# ENABLE it,1 for ENABLE ,0 for DISABLE
echo 0 > /proc/sys/net/ipv4/ip_forward

# Because in the LVS/DR, direcotr is not a gw for realserver ,so we use icmp
# to redirects on, 1 for on ,0 for off
echo "1" > /proc/sys/net/ipv4/conf/all/send_redirects
echo "1" > /proc/sys/net/ipv4/conf/default/send_redirects
echo "1" > /proc/sys/net/ipv4/conf/eth1/send_redirects

# Configging the VIP for the eth1:110,the netmask must be 0xffffffff
# eth1 ip 174.19.200.11
/sbin/ifconfig eth1:1 174.19.200.1 broadcast 174.19.200.1 netmask 255.255.255.255 up
/sbin/route add -host 174.19.200.1 dev eth1:1

# Listing ifconfig information for VIP
sbin/ifconfig eth1:1

# Clearing ipvsadm table
/sbin/ipvsadm -C

## Installing LVS services with ipvsadm
# Adding ftp to VIP with wlc scheduling
/sbin/ipvsadm -A -t 174.19.200.1:ftp -p -s wlc

# Forwarding ftp to realserver using direct routing with with weight=1
/sbin/ipvsadm -a -t 174.19.200.1:ftp -r 174.19.200.3 -w 5 -g

# Forwarding ftp to realserver using direct routing with with weight=1
/sbin/ipvsadm -a -t 174.19.200.1:ftp -r 174.19.200.9 -w 5 -g

# Forwarding ftp to realserver using direct routing with with weight=1
/sbin/ipvsadm -a -t 174.19.200.1:ftp -r 174.19.200.10 -w 5 -g

# Forwarding ftp to realserver using direct routing with with weight=1
/sbin/ipvsadm -a -t 174.19.200.1:ftp -r 174.19.200.12 -w 5 -g

# Forwarding ftp to realserver using direct routing with with weight=1
/sbin/ipvsadm -a -t 174.19.200.1:ftp -r 174.19.200.13 -w 5 -g

# Listing ipvsadm table
/sbin/ipvsadm

真实服务器的脚本为:
# Setting realserver ip_forwarding to OFF(1 on,0 off)
echo "0" > /proc/sys/net/ipv4/ip_forward

# Installing realserver_vip
/sbin/ifconfig lo:1 174.19.200.1 broadcast 174.19.200.1 netmask 0xffffffff up

# Installing route for VIP 174.19.200.1 on device lo:1
/sbin/route add -host 174.19.200.1 dev lo:1

# Configging output
/sbin/ifconfig lo:1

# Listing routing information for VIP 174.19.200.1
/bin/netstat -rn

# Hiding interface lo:1,will not arp
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/lo/rp_filter

我用LoadRunner(测试工具)测试,模拟4000个用户/每秒去取存储中的文件,每个真实服务器平均分担近1000个用户访问.开始时是100个用户,然后每秒递增10个用户,最终达到每秒4000个用户每秒的访问速度.达到4000个用户每秒的速度后能够运行20分钟左右,然后就出现连接不上的错误和Type failed错误,且一直增长下去.连续几个实验都是相同的问题.我们怀疑是操作系统未优化出现错误,于是对vsftp,内核进程数等做了相应的优化.结果还是同样的问题.
我们不用调度器直接对单台真实服务器进行测试,发现每个真实服务器能够提供2000个用户的访问且能长时间稳定运行。
最后加上调度器后对一台真实服务器做DR调度,模拟1000个用户访问发现出现以前出现的错误。是不是在LVS的调度算法中的参数与调度的服务的设置有关系,如persistent等.

Forums:

你现在是用LVS/DR方式做的集群,不知道在真实服务器上让它们不对VIP地址(174.19.200.1在你的系统中)作ARP响应?

在你的LoadRunner测试中,有多少台测试客户机器?

章博士,你好!我对这句话还是没有理解清楚:"不知道在真实服务器上让它们不对VIP地址(174.19.200.1在你的系统中)作ARP响应?"。
我对ARP问题的理解是:
在2.6.5的内核中有2个设备标志(arp_announce和arp_ignore),用于调整ARP堆栈。应该可以利用这2个标志来解决ARP问题,方法是对设置了VIP的设备设置arp_ignore=1,arp_announce=2。此外,应将rp_filter=0。
arp_ignore=1,系统只回答目的IP为是本地IP的包。也就是对广播包不做响应。
arp_announce=2,系统忽略IP包的源地址(source address),而根据目标主机(target host),选择本地地址。
rp_filter=0,则是不作源地址检测。
我在真实服务器上的设置就是这样的,没有去打hidden补丁。

我在LoadRunner测试中,用了8台客户机器(双至强、4G内存和千兆网络,应该不是瓶颈)做测试,每台发送500个用户每秒的请求,每台上面利用了LoadRunner的IP欺骗功能,相当于是每台每秒发送的IP地址是不同的。调度器中IP Virtual Server version 为1.2.0 。

arp_announce和arp_ignore应该可以解决ARP的问题(上次是我没有注意到)。大概还需要对以太网口作arp_announce和arp_ignore设置,例如:
echo "1" > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/eth0/arp_announce

在LVS/DR的调度器上,应该考虑将send_redirects关掉。

其他的,我没有更多的想法。

我想在“最后加上调度器后对一台真实服务器做DR调度,模拟1000个用户访问发现出现以前出现的错误。”情形下,可以找一个正常的客户端连接一下,看能否进行高校的FTP下载?然后用“ipvsadm -Ln”来看看连接数的情况,用“ipvsadm -Lcn”来看看连接的状态?

在真实服务器上也可考虑抓报文,确保它不作来自外面的VIP ARP响应,请求报文是来自调度器的。

我对这句:“在LVS/DR的调度器上,应该考虑将send_redirects关掉”理解得不够好。

我开始的想法是:在LVS-DR 模式下,如果集群的网关是外部网关,而不是负载均衡器的话,所以要打开 icmp 包的重定向设置 send_redirects 置为 1。您认为我这样理解正确吗?

失去响应的时候ipvsadm输出是如何的。
每台real server上面的分到的连接数如何?

我也碰到过类似问题
在压力测试LVS DR分发给tomcat时负载虽然均衡
但是实际效果甚至不如单台服务器的压力测试结果
(返回比较多的error并且响应时间迟缓)
后来发现是ARP的关系
不过看你的描述恐怕不是这个关系了。

我想应该是ARP关系。:)

在实验中使用的是电信架构的ATCA服务器板,每块服务板有八个网口对外连接.用它作后台真实服务器我只启用了每块板的两个网口,一个网口用作LVS相关服务,另一个做为取数据通道(DR模式下,本网口地址不在做LVS相关服务的同一网段).
是否要将两个网口都要做arp_announce和arp_ignore设置?
还是只要对做LVS服务的网口做arp_announce和arp_ignore设置.

我去实验了一下:在真实服务器上抓报文,确保它不作来自外面的VIP ARP响应,请求报文是来自调度器的.我用TCPDUMP抓的报文有点看不懂.
能否指点一下怎样确定报文的响应

两个网口都需要做arp_announce和arp_ignore设置。

凡是能收到对VIP ARP广播报文的网口,如果我们用arp_announce和arp_ignore,都需要设置。

经过这几次的实验,负载均衡已经用起来了.

下一步准备研究一下真实服务器负载的监控方式(CPU负载、内存利用情况、磁盘利用率和当前进程数目Pi),想能够动态地调整真实服务器的权值.达到真正的负载均衡.

现在是否也有相关的工具来完成这项工作.

我们还是不懂你怎么搞定的,能否写个详细的配置和测试过程。谢谢!

在一般路由状态下,一个报文比一个网卡进来,又从同一块网卡路由出去,当send_redirects 置为1,会发ICMP REDIRECT报文。

在LVS/DR下, 访问VIP的报文是走INPUT路径,而不是FORWARD路径。所以无论send_redirects是否设置,应该不受影响。前面的大概是我没有仔细想。

Now we know who the sebilnse one is here. Great post!

Grazi for maknig it nice and EZ.

A wonderful job. Super helpful intrmoafion.

不知你是如何解决问题的,希望你能写个详细的过程.谢谢!