LVS 负载均衡之DR模式 原理与实践
LVS DR
LVS DR原理:用户请求LVS VIP到达director(LB均衡器),director将请求的报文的目标MAC地址改成后端的realserver MAC地址,目标IP为VIP(不变),源IP为用户IP地址(保持不变),然后Director将报文发送到realserver,realserver检测到目标为自己本地VIP,如果在同一个网段,然后将请求直接返给用户。如果用户跟realserver不在一个网段,则通过网关返回用户,如图23-6所示:
DR模式 改的是MAC地址,目标IP的报文没有修改,这个时候将数据包发给后端,后端收到以后会根据TCP/IP协议,收到检查目标地址是不是我,如果是我就处理,如目标地址不是我就丢弃。因为数据包的的目标IP是LVS的VIP(地址MAC修改为后端MAC地址),那么必然在后端机器有VIP。(客户端有VIP地址,然后前端也有VIP,那么这样才可以将包发给后端机器,后端机器才可以处理这个包,否则会丢弃这个包)
直接路由模式,请求一次经过LVS,第二次出去不再经过,直接丢给路由。
用户第一次请求的目标IP和MAC都是LVS,第二次LVS转发就变了,LVS会将报文的目标MAC修改为后端Real Server的Mac,但是目标IP不会修改即VIP,只修改MAC。这个VIP需要在客户端上配置,LVS为什么知道客户端的MAC呢,因为LVS发出了ARP广播(因为会配置LVS均衡池)
NAT和DR的区别:一个改的是IP地址和端口,一个改的是目标MAC地址。NAT两次请求都经过LVS,DR只有地址请求经过LVS,第二次直接通过路由器出去了,即不再通过LVS,那么性能相对来说比较高。LVS DR模式访问的是什么端口,后端转过去就是什么端口。
DR模式就是要求后端的VIP不变,如果变了就不是DR模式了,如果后端的Real Server不配置VIP会将数据包给丢弃了,为了让其能够处理就要在Real Server上配置VIP,这样目标IP和Real Server VIP一样。如何避免IP一样的冲突呢?就是将VIP配置在lo网卡上面,将IP配置在lo网卡上不会发生冲突,这个是用来做本地测试的。lo网卡最大的好处就是防止冲突,比如你两台机器的lo网卡都可以配置127.0.0.1这并不冲突。(必须要保证LVS和和后端服务器在同一个物理网段,简单理解就是要在一个交换机上面)
LVS DR模式要点&注意事项
(1)LVS服务器和后端Realserver必须在同网段(内网、公网)
(2)LVS修改请求报文的目标MAC,目标IP(VIP)不修改的
(3)目标IP(VIP)保持不变,在RS客户端配置VIP,lo网卡上面配置(不冲突)
(4)RS客户端服务器的网关指向路由器下一跳(默认网关),保证数据能够出去(访问外网)
(5)所有的RS客户端服务器,抑制VIP ARP广播,禁止VIP响应解析,而且保证真实网卡不能抑制ARP广播。
如果VIP是内网,那么通过路由器将公网IP映射到内网做NAT映射,LVS的VIP配置在LVS服务器物理网卡上。
LVS DR模式实践
Server1 |
192.168.179.102 |
LVS |
Server2 |
192.168.179.103 |
Server1 Nginx |
后端 Real-Server 192.168.179.103 lo网卡配置VIP 避免丢掉LVS转发的包
#全部255表示独立的主机,并不是广播,即独立的IP地址,因为网卡是lo网卡,不是真实的网卡
[root@real-server1 ~]# cd /etc/sysconfig/network-scripts/
[root@real-server1 network-scripts]# cp ifcfg-lo ifcfg-lo:1
[root@real-server1 network-scripts]# vim ifcfg-lo:1
[root@real-server1 network-scripts]# cat ifcfg-lo:1
DEVICE=lo
IPADDR=192.168.179.199
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback
抑制后端Real-Server 192.168.179.103对客户端ARP响应,防止穿透LVS
[root@real-server1 ~]# cd /etc/sysconfig/network-scripts/
[root@real-server1 network-scripts]# cp ifcfg-lo ifcfg-lo:1
[root@real-server1 network-scripts]# vim ifcfg-lo:1
[root@real-server1 network-scripts]# ifup ifcfg-lo:1
[root@real-server1 network-scripts]# ifconfig
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.179.103 netmask 255.255.255.0 broadcast 192.168.179.255
inet6 fe80::f54d:5639:6237:2d0e prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:61:90:c1 txqueuelen 1000 (Ethernet)
RX packets 288952 bytes 181510388 (173.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 144347 bytes 15138174 (14.4 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 74143 bytes 6240731 (5.9 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 74143 bytes 6240731 (5.9 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo:1: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.179.199 netmask 255.255.255.255
loop txqueuelen 1 (Local Loopback)
这个时候虽然VIP配置在lo网卡上,但是提供浏览器访问VIP会直接访问到real-server !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ARP的请求lo en33网卡都会收到,通过en33传进来,会去检查本地的所有网卡,只要有一个是配置了192.168.179.199的都会通过en33回复出去。(因为lo网卡和外界是不通的,请求通过en33网卡转发)
接收请求是ens33的,要抑制lo网卡对ARP响应,防止穿透LVS直接访问Real Server抑制lo回ARP包(如果VIP配置在en33真实网卡,真实网卡会冲突)
为了让我们后端不响应VIP的广播,需要在后端上抑制VIP的广播,这样只有LVS会回答,因为LVS的物理网卡配置了VIP,没用抑制ARP广播
所有的RS客户端服务器,抑制VIP ARP广播,禁止VIP响应解析,而且保证真实网卡不能抑制ARP广播。
#Arp_ignore 参数1:只响应目标IP是配置在真实网卡上的(后端不响应客户端ARP请求,因为后端的VIP不是配置在真实网卡上,真实网卡就是接网线的网卡,所以VIP只能配置在lo上,防止IP冲突)
#Arp_announce 参数2只忽略报文的源IP,使用主机上能够跟用户通信的真实网卡发数据
[root@real-server1 ~]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@real-server1 ~]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
可以看到抑制了后端Real-Server对客户端的ARP请求
配置LVS物理机的网卡,即配置VIP
[root@localhost network-scripts]# cp ifcfg-ens32 ifcfg-ens32:1
[root@localhost network-scripts]# vim ifcfg-ens32:1
[root@localhost network-scripts]# cat ifcfg-ens32:1
TYPE=Ethernet
BOOTPROTO=static
NAME=ens32
DEVICE=ens32:1
ONBOOT=yes
IPADDR=192.168.179.199
NETMASK=255.255.255.0
#这个子接口也是物理网卡,该网卡绑定了VIP和后端的Real-Server 192.168.179.103 lo:1网卡地址不冲突
[root@localhost network-scripts]# ifup ifcfg-ens32:1
[root@localhost network-scripts]# ifconfig
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.179.102 netmask 255.255.255.0 broadcast 192.168.179.255
inet6 fe80::2d42:a0b1:1cdc:74c0 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:0e:1a:bf txqueuelen 1000 (Ethernet)
RX packets 7821 bytes 574095 (560.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6987 bytes 444035 (433.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens32:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.179.199 netmask 255.255.255.0 broadcast 192.168.179.255
ether 00:0c:29:0e:1a:bf txqueuelen 1000 (Ethernet)
[root@localhost ~]# ipvsadm -A -t 192.168.179.199:80 -s rr
[root@localhost ~]# ipvsadm -a -t 192.168.179.199:80 -r 192.168.179.103 -g -w 100
[root@localhost ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.179.199:80 rr
-> 192.168.179.103:80 Route 100 0 0
可以看到DR模式配置成功
[root@localhost network-scripts]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.179.199:80 rr
-> 192.168.179.103:80 Route 100 1 1
目录 返回
首页