DR模式全称为Direct Routing,即为直连路由模式,故名思义,NAT模式用于与外网相连的场景,而DR模式用于一个局域网内的场景。
一、工作流程图解:
工作流程详述:用户请求LVS服务器的VIP,请求到达LVS服务器时,LVS将请求的报文的目标IP(即VIP)保持不变,目标MAC修改为后端Realserver服务器的MAC地址,转发给后端服务器;然后后端RealServer服务器收到报文,若目标MAC不是本地则丢弃报文,目标MAC是本地则处理请求。后端处理请求的服务器最终将数据直接返回给用户,不再经过LVS服务器。
二、DR模式特点&配置要点
1)LVS服务器单网卡即可配置负载均衡;
2)要求LVS必须和后端Realserver服务器在一个局域网;
3)LVS和Realserver要么统一配置公网IP,要么统一配置内网IP,比较浪费公网IP地址,所以一般在局域网中使用。
4)LVS和后端Realserver服务器上均配置VIP地址,故上述流程详述中识别后端服务器是靠MAC地址;LVS的VIP直接配置在真实物理网卡上,后端Realver机器的VIP配置在lo网卡上,避免冲突。
5)LVS服务器不需要开启路由转发功能;
6)Realserver上的VIP地址必须要抑制VIP的ARP响应。
三、LVS负载均衡之DR模式配置详解
1、配置ip_vs模块
ipvsadm -A -t 172.16.193.100:80 -s wrr
ipvsadm -a -t 172.16.193.100:80 -r 172.16.193.201:80 -g -w 2
ipvsadm -a -t 172.16.193.100:80 -r 172.16.193.202:80 -g -w 1
2、LVS服务器添加子网卡(VIP)
注:此处是给LVS服务器添加VIP,所以需要选择物理网卡的子网卡
cp ifcfg-ens33 ifcfg-ens33:1
vim ifcfg-ens33:1
#写入以下内容
TYPE="Ethernet"
BOOTPROTO="static"
DEFROUTE="yes"
DEVICE="ens33:1"
ONBOOT="yes"
IPADDR=172.16.193.100
NETMASK=255.255.255.0
systemctl restart network
添加子网卡成功!
注:我使用的苹果电脑的终端,添加了子网卡的网卡不能用ssh连接!
3、后端服务器添加子网卡并抑制ARP的响应
把下面的脚本放到各个后端服务器,执行一下即可!
#!/bin/sh
#LVS Client Server
VIP=172.16.193.100
case $1 in
start)
ifconfig lo:0 $VIP netmask 255.255.255.0 broadcast $VIP
/sbin/route add -host $VIP dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
exit 0
;;
stop)
ifconfig lo:0 down
route del $VIP >/dev/null 2>&1
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped OK"
exit 1
;;
*)
echo "Usage: $0 {start|stop}"
;;
esac
脚本重点释疑:
arp_ignore参数(1)含义:只响应目标IP是本地真实网卡上配置的IP
arp_announce参数(2)含义:忽略报文的源IP地址,使用主机上能够跟用户通信的真实网卡发送数据
自己的理解:
arp_ignore参数,因为Nginx上的三台机器我们都需要配置抑制arp响应这个脚本,所以就是当用户访问VIP这个IP地址时,只会是LVS的VIP去响应,后端三个服务器因为被抑制而无法响应
arp_announce参数,当LVS将报文送到后端服务器,让其处理后,将处理后的数据返回给用户时,按理来说应该使用被请求IP(VIP)作为源IP,返回处理后的数据,但是配置了这个参数便使用真实网卡的IP作为源IP,返回处理后的数据。