一、操作环境部署
准备三台虚拟机,本人所使用虚拟机版本为rhel-server-7.6-x86_64:
- server1: 172.25.254.1
- server2: 172.25.254.2
- server3: 172.25.254.3
1.添加内核策略
yum install -y ipvsadm %安装相关工具
ip addr add 172.25.254.100/24 dev eth0 %添加策略,添加VIP
- 添加VIP,当访问VIP时可以实现负载均衡
- 通过ipvsadm添加策略(在内存里)
注意:此时hashsize为4096,如果在高并发的环境中可以重新编译内核调大此数值,防止丢包
由于映射的端口为标准的80服务,所以另外两台RS上只需要安装httpd服务即可。
设置开机自启。
创建apache的发布目录用来做测试:
echo server2 > /var/www/html/index.html
echo server3 > /var/www/html/index.html
问题1:
此时外部无法访问VIP,但是调度器显示调度正常:
原因分析:调度器显示调度正常说明调度策略没有问题,那么问题一定在后端的服务器RS上。因为调度的工作原理是在数据链路层通过调度算法直接将数据包转发给后端的RS。这样可以保证直接在数据链路层将数据包转发到后端,这就是为什么必须要在一个VLAN里,因为整个过程无法经过路由。而无法正常工作的原因是因为后端两个RS上没有VIP,由于tcp三次握手首先访问的是VIP 254.100,而当数据包到达RS 254.2时,从二层数据链路层往上解析时发现RS上没有254.100,说明数据包走错地方了,此时它直接被Linux内核丢弃。
解决放法:给后端RS添加VIP。
此时调度正常:
在前文中我们介绍了LVS—DR模式下会将IP地址和MAC地址缓存在ARP中,如下所示:
注:此MAC地址为后端RS 254.1的MAC地址
问题2:
我们将arp中的MAC地址删除之后,再对VIP进行访问,发现只对后端的RS 254.2进行访问,且此时再查询arp中的IP和MAC的缓存时发现此MAC地址为RS 254.2的MAC地址
问题分析:
此时我们首先查看调度器,在外部进行压测后,我们查看调度器发现调度器并没有进行调度,说明调度器没有起到作用,而此时同一个VLAN下有三个相同的VIP就会产生冲突。因为在VLAN中访问时,此时请求者的MAC是以广播形式发送请求的,谁先响应先缓存谁。
解决方法:
由于给后端RS加上VIP是为了让数据包完成正常的tcp三次握手,但是由于三个VIP都在一个VLAN中,所以不能对外广播。此时有两种解决方法:
1、直接修改Linux内核,使用sysctl把arp的信息直接屏蔽掉,屏蔽方法自行百度:
2、使用arptables工具:
在所有的RS上安装arptables: 注:此工具只针对arp协议
添加策略:外部无法直接访问本机的VIP,此策略需要加到INPUT链上;本机也不能通过VIP对外广播,此策略需要加到OUTPUT链上;
可以将策略保存起来,防止重启失效:
此时,再删除arp缓存,再进行压测就没问题了。