试用IPVS来做负载均衡,使用了1台双网卡服务器和2台单网卡服务器,2个网段。服务器信息如下:
IP配置信息如下:
服务器 | 操作系统 | 网卡 | IP |
调度服务器 | Centos | eth0 | 192.168.18.58 |
eth1 | 192.168.2.90 |
实际服务器 | Centos | eth0 | 192.168.2.71 |
Centos | eth0 | 192.168.2.72 |
1. 首先配置调度服务器:
a) IPVS模块已经内置到linux2.6.x内核中,可以通过下面的命令查看是否已安装:
modprobe -l | grep ipvs
看到类似下面的输出,表示已经安装了
kernel/net/netfilter/ipvs/ip_vs.ko
kernel/net/netfilter/ipvs/ip_vs_rr.ko
kernel/net/netfilter/ipvs/ip_vs_wrr.ko
kernel/net/netfilter/ipvs/ip_vs_lc.ko
kernel/net/netfilter/ipvs/ip_vs_wlc.ko
kernel/net/netfilter/ipvs/ip_vs_lblc.ko
kernel/net/netfilter/ipvs/ip_vs_lblcr.ko
kernel/net/netfilter/ipvs/ip_vs_dh.ko
kernel/net/netfilter/ipvs/ip_vs_sh.ko
kernel/net/netfilter/ipvs/ip_vs_sed.ko
kernel/net/netfilter/ipvs/ip_vs_nq.ko
kernel/net/netfilter/ipvs/ip_vs_ftp.ko
kernel/net/netfilter/ipvs/ip_vs_pe_sip.ko
b) 安装IPVS的管理工具ipvsadm:
yum install -y ipvsadm
c) 清除表中所有记录:
ipvsadm -C
使用下面的命令增加虚拟服务器,采用轮询调度策略:
ipvsadm -A -t 192.168.18.58:8888 -s rr
使用下面的命令添加实际服务器,并采用NAT方式转发数据包:
ipvsadm -a -t 192.168.18.58:8888 -r 192.168.2.71:9999 -m
ipvsadm -a -t 192.168.18.58:8888 -r 192.168.2.72:9999 -m
d) 打开数据包转发:
echo 1 > /proc/sys/net/ipv4/ip_forward
2. 接下来配置2台实际服务器,分别做以下工作:
a) 在9999端口上启动一个web服务:
配置好web服务后,当访问http://192.168.2.71:9999时,页面返回:This is 192.168.2.71.;当访问http://192.168.2.72:9999时,页面返回:This is 192.168.2.72.
b) 设置默认网关指向调度服务器
route del default
route add default gw 192.168.2.90
3. 测试
访问192.168.18.58:8888,会显示This is 192.168.2.71或This is 192.168.2.72,多次刷新应该要交替出现71和72,但实际上并没有这样,浏览器只显示与第一次相同的内容,也就是ipvsadm每次都选择了同一台服务器。这是因为当一个TCP连接的初始SYN报文到达时,IPVS就选择了一台服务器,后继报文会被转发到相同的服务器。这个TCP连接在ipvsadm中默认有效时间为15分钟,可以通过下面的命令查看:
ipvsadm -L --timeout
Timeout (tcp tcpfin udp): 900 120 300
现在将有效时间改为1秒来测试,使用下面的命令:
ipvsadm --set 1 120 300
再到浏览器中每隔1秒多点击刷新,就会交替出现71和72,说明轮询调度正在正常工作。