虚拟化容器,大数据,DBA,中间件,监控。

LVS 负载均衡之DR模式 原理与实践

21 12月
作者:admin|分类:应用管理

 

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 

 

浏览461 评论0
返回
目录
返回
首页
Shell 四剑客之 sed s替换内容以及n p LVS 负载均衡之NAT模式 原理与实践