实验拓扑图
绿色部分:
- 127.0.0.1:Windows虚拟网卡
- 192.168.145.1:VMware虚拟网卡
- 192.168.1.24:以太网卡,本地连接
浅粉色VIP部分:
- eth0:1 ---- 以太网卡0的1端口
- lo:3 ---- 回环接口3
图中黑色带箭头虚线代表浏览器发起请求后数据包的路径,红色带箭头实线代表服务器返回的数据包路径。
配置三台node的VIP
node3
ifconfig eth0:1 192.168.145.100/24
node4
首先修改协议arp_ignore和arp_announce
cd /proc/sys/net/ipv4/conf/eth0
echo 1 > arp_ignore
echo 2 > arp_announce
现在我们只配了一个接口(eth0)的协议,为了保证今后配置的其他接口也生效,我们可以进行以下配置
cd .. //进入 cd /proc/sys/net/ipv4/conf
cd all
echo 1 > arp_ignore
echo 2 > arp_announce
到此为止,ARP协议配置完毕,接下来我们可以配置隐藏VIP了
ifconfig lo:3 192.168.145.100 netmask 255.255.255.255
这里注意千万不要配成255.255.255.0,因为这里netmask和ip地址要进行一次按位与运算,来生成路由条目,这里如果我们配成了255.255.255.0,那么我们与192.168.145.100做按位与运算的时候会得到192.168.145.0,也就是说我们从回环接口lo:3也可以抵达192.168.145.0这个网络,然后eth0掩码和ip运算后也能得到一个相同的192.168.145.0这个网络,那么现在两个网卡都可以去145.0这个网络,此时我ping 192.168.145.1,**会发生下面的情况:**由于物理网卡eth0和虚拟网卡lo两者中虚拟网卡里内核近,所以ping时会把数据包发给回环接口lo,又因为对于回环接口而言,任何送到该接口的网络数据报文都会被认为是送往设备自身的,因此这个 数据包永远都发不出去!
ps:如果你不小心配成了255.255.255.0,那么不好意思,通信断开,因为发过去的数据包在主机那里死循环回不来了,直接挂了,GG …
node5
与node4相同,不做解释
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
[root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@localhost ~]# ifconfig lo:3 192.168.145.100 netmask 255.255.255.255
到此为止,网络层配置完成
Real Server的服务配置
以下操作node4 && node5全部一样,因此只写一份node4
安装httpd
yum install httpd -y
启动httpd服务
service httpd start
创建主页
vi /var/www/html/index.html
index.html页面内容自定义
验证一下是否生效
到此,应用层和网络层配置结束
LVS服务配置
node3安装调用接口
LVS目前已经在Linux系统中默认安装了,它被封装到了Linux的ipvs内核模块,由于是内核模块,所以我们是不能直接对其进行操作的,因此我们需要一个对其调用的接口,那么我们来安装一下调用接口。
yum install ipvsadm -y
对入包添加规则
ipvsadm -A -t 192.168.145.100:80 -s rr //基于tcp协议,采用轮询算法
对出包添加规则
ipvsadm -a -t 192.168.145.100:80 -r 192.168.145.131 -g -w 1 //采用DR模型,负载均衡设备为node4,权重为1
ipvsadm -a -t 192.168.145.100:80 -r 192.168.145.132 -g -w 1 //采用DR模型,负载均衡设备为node5,权重为1
验证
访问192.168.145.100,然后不断刷新看一下效果,会发现node4和node5不断切换,我们也可通过修改权重设置两台设备的访问频率。
看一下node3的网络状态
netstat -natp
我们发现在node1上并没有socket连接
再看一下node4和node5的网络状态
netstat -natp
我们发现在node4和node5上能看到socket连接
ps:如果在node4和node5上没看到连接,可能是你长时间没有访问192.168.145.100,socket断开了,重新刷新几波就好了
并且我们证明了LVS并不与客户端建立连接
执行下面代码看看LVS偷窥的详细信息,可用来排错
ipvsadm -lnc
我们将node4服务器关闭
ifconfig lo:3 down
刷新页面
SYN_RECV表示tcp建立握手不成功,server端没收到ACK包
由此,我们可以看出,在LVS能够刷出信息的前提下如果state状态为SYN_RECV,那么一定是网络层出问题了,需要检查网络层配置。