一、实验原理:

过程如下:
1)client 向目标 vip 发出请求,LB(调度器) 接收。
2)VS 根据负载均衡算法选择一台 active 的 real server,将此 RIP 所在网卡的 mac 地址作为目标 mac 地址,发送到局域网里。
3)real server在局域网中收到这个帧,拆开后发现目标 IP(VIP)与本地匹配,于是
处理这个报文;随后重新封装报文,发送到局域网。
4)客户访问的是VIP,那么如果服务器端没有这个VIP,发还给客户的包肯定不被信任,所以给服务器集群都加VIP,然后让后端服务器使用VIP将包发还给客户。

注意

  • VIP为调度器与服务器共享,此时VIP是对外可见的,用户访问的就是VIP,用来接受用户请求报文。
  • 它是通过在调度器LB上修改数据包的目的MAC地址实现转发,注意源地址仍然是CIP,目的地址仍然是VIP地址;
  • 请求的报文经过调度器,而服务器响应处理后的报文无需经过调度器LB,因此并发访问量大时使用效率很高(和NAT模式比)
  • 因为DR模式是通过MAC地址改写机制实现转发,因此所有RS节点和调度器LB只能在一个局域网里面;由于DR模式的调度器仅做MAC地址的改写,所以调度器LB就不能改写目标端口,那么服务器就得使用和VIP相同的端口提供服务(即RS和LB必须拥有相同的IP,处于一个vlan下)。
  • 服务器主机需要绑定VIP地址在LO接口上,并且需要配置ARP抑制。(如果不做arp抑制,那么访问100这个VIP并不能始终指向调度器、而是具有随机性)

注: DR模式工作在数据链路层,不支持端口转发;

二、部署

(1)实验环境:
本次实验所有主机均为rhel7.3,并且selinux为disabled、防火墙为关闭状态;

主机名           角色                 IP 
server1       LB(调度器)           172.25.40.1
server2       RS(真实后端服务器)   172.25.40.2
server3       RS(真实后端服务器)   172.25.40.3

(2)实验过程
server1:(调度器)
关闭http服务

yum install ipvsadm        #安装ipvsadm调度器
 ipvsadm -l					#查看ipvsadm策略
 ipvsadm -C                 #清除ipvsadm策略
 ipvsadm -A -t 172.25.40.100:80 -s rr    
 							#添加VIP以及端口80,-t 协议为tcp,rr算法轮询模式的策略。

 ipvsadm -a -t 172.25.40.100:80 -r 172.25.40.2:80 -g   
 							#给真实服务机添加VIP,-g 指定DR模式
 ipvsadm -a -t 172.25.40.100:80 -r 172.25.40.3:80 -g
 ipvsadm -l
 ip addr add 172.25.40.100/24 dev eth0  
 							#将VIP加入本机server1。
 ip addr show

vpp 负载均衡_arptabled

Real Server:

yum install httpd 						#安装apache	
vim  /var/www/html/index.html           #编写初始化网页
systemctl restart httpd		   			 #重启apache
ip addr add 172.25.40.100/24 dev eth0    #将VIP加入本机
ip addr show

测试:

curl 172.25.40.100

vpp 负载均衡_arptabled_02

此时看似已经达到了轮询效果,其实并没有。因为调度器其实并没有实现调度,而是后端服务器自己抢占的包,,所以我们需要删除已经绑定的MAC地址:

arp -an | grep 172.25.40.100			#查看绑定的MAC地址
arp -d 172.25.40.100				    #清除访问的MAC地址

对后端Real Server均进行配置:

server2:

yum install arptables				#安装网络控制进程
arptables -A INPUT -d 172.25.40.100 -j DROP		
									#将此IP下的请求忽略,只遵从调度器的调配
arptables -A OUTPUT -s 172.25.40.100 -j mangle --mangle-ip-s 172.25.40.2
									#将发出去的数据包时伪装成VIP发送
arptables -L						#查看加入的策略
ip addr add 172.25.40.100/24 dev eth0		##server2 加入VIP
ip addr show

vpp 负载均衡_lvs_03

server 3:

yum install arptables			     	#安装网络控制进程
arptables -A INPUT -d 172.25.40.100 -j DROP		
									    #将此IP下的请求忽略,只遵从调度器的调配
arptables -A OUTPUT -s 172.25.40.100 -j mangle --mangle-ip-s 172.25.40.3
									     #将发出去的数据包时伪装成VIP发送
arptables -L					       	#查看加入的策略
ip addr add 172.25.40.100/24 dev eth0		#server3 加入VIP

测试:

curl 172.25.40.100

vpp 负载均衡_ipvsadm_04

若采用加权轮询算法:

vpp 负载均衡_负载均衡_05

vpp 负载均衡_arptabled_06

但是当其中一台 real server 宕机后,仍会采用负载均衡机制,且显示该真实服务器主页内容为报错,并不会自动屏蔽出错的服务器,没有健康检机制,这就用到下一篇的内容 lvs+ldirectord

vpp 负载均衡_ipvsadm_07