有关于LVS负载均衡群集的相关概念可以参考博文:LVS负载均衡群集详解

一、案例概述

LVS负载均衡模式—DR模式:lvs负载调度器作为群集的访问入口,但不作为网关使用,服务器池中的所有节点都各自接入internet,发送给客户机(互联网)的web响应数据包不需要经过lvs负载调度器。

LVS负载均衡模式—DR模式:
优点:负载均衡器只负责将请求包分发给物理服务器,而物理服务器将应答包直接发给用户。所以,负载均衡器能处理很巨大的请求量,这种方式,一台负载均衡能为 超过100台的物理服务器服务,负载均衡器不再是系统的瓶颈。使用VS-DR方式,如果你的负载均衡器拥有100M的全双工网卡的话,就能使得整个 Virtual Server能达到1G的吞吐量。甚至更高;
不足:但是,这种方式需要所有的DIR和RIP都在同一广播域;不支持异地容灾。
总结:LVS-DR是三种模式中性能最高的一种模式,比LVS-NAT模式下负载的RS serve更多,通常在100台左右,对网络环境要求更高,也是日常应用的最多的一种工作模式。

二、案例环境

由于实验环境,没有必要弄那么大型的拓补图,2个Web节点服务跟10个Web节点服务器意思是一样的,而且配置方法是一样的,所以实验环境就部署两台Web节点服务器。实验拓补图如下:

LVS负载均衡群集之构建DR模式,可跟做!!!

LVS负载均衡模式—DR模式特点:

  1. 各Web节点服务器必须与 LVS负载调度器在同一个网络中(相同的广播域);
  2. LVS负载调度器的 RIP 可以使用私有地址,也可以使用公网地址,以方便配置;
  3. 不支持支持端口映射;
  4. LVS负载调度器可以使用必须为uninx操作系统(OS);且LVS负载调度器需要仰制arp,需要在loopback配置vip;
  5. LVS负载调度器仅负责处理入站请求,响应报文由 Web节点服务器直接发往客户端;
  6. Web节点服务器不能将网关指向 DIP,而直接使用前端网关响应请求报文;

三、知识点讲解

为什么需要LVS负载调度器的VIP跟Web节点服务器在同一个网段?
答:DR 模式因为LVS负载调度器只修改 package的 MAC地址通过ARP广播的形势找到Web节点服务器,所以 要求LVS负载调度器的VIP 和Web节点服务器的IP 必须在同一个网段内,也就是在挂载VIP 时先确认LVS的工作模式,如果是DR模式需要先确认这个IP 是否能挂在这个LVS下面。

内核重定向:在lvs负载调度器和各节点需要共用VIP地址,并且应该关闭linux内核重定向参数响应。怎么实现?
答:需要路由器向源发送ICMP重定向的情况有两种:

  • 当路由器从某个接口收到数据包后,还要将数据包从同一个接口发往目的地,就是路由器收到数据包的接口正是去往目的地的出口时,则会向源发送ICMP重定向,通告对方直接将数据包发向自己的下一跳即可,不要再发给自己。
  • 数据包的源IP和自己转发时的下一跳IP地址是同网段时,则会向源发送ICMP重定向,通告对方直接将数据包发向自己的下一跳。
    注意:路由器在向数据源发送ICMP重定向的同时,也会正常转发收到的数据包,并不会中断网络。

示意图如下:
LVS负载均衡群集之构建DR模式,可跟做!!!

过程分析如下:
1.server2如果要与internet通讯,首先是要把报文发送给server1的,因为server2的网关指向server1的;
2.server1收到报文并检查它的路由表,发现router是发送改报文的下一跳。当它把报文发送给router时,server1检测到这个报文的发送出去的接口与接收到的接口是相同的,这样ICMP重定向就触发了;
3.server1认为server2应该把默认路由指向router,所以就发送ICMP重定向报文给server2;

在真实的节点服务器上要给lo:0设置vip,并调整内核的arp响应参数以阻止更新VIP的mac地址,避免发生冲突,如何实现?

示意图如下:
LVS负载均衡群集之构建DR模式,可跟做!!!
在配置LVS负载均衡架构的时候需要在Web节点服务器上抑制ARP,
具体是arp_ignore=1,arp_announce=2
arp_ignore: (回应ARP),选项如下:

0:回应任何网口上收到的对任何本机IP地址的ARP查询请求(默认)
1:只回应Target IP是接收网口的IP的ARP查询请求
2:只回应Target IP是接收网口的IP的ARP查询请求,且Sender IP必须与该网口属于同一网段
4-7:保留未使用
8:不回应所有的arp查询

arp_announce: (宣告ARP),选项如下:

0:使用发送(或转发)的数据包的源IP作为发送ARP请求的Sender IP(默认) ;(可使用ping -I 验证)
1:IP数据包的目的IP属于本地某个接口的网段时,Sender IP则使用IP数据包源IP,不属于则按2处理;
2:忽略数据包的源IP,使用能与目标主机会话的最佳地址来作为发送ARP的Sender IP,优先选择对外接口的主IP;(loopback不是对外接口)
注:ARP表没有网关对应的条目时,在发送IP数据包前会触发 arp_announce;
Sender MAC跟系统无关,Sender MAC=源MAC,源MAC由物理地址决定,网络非法进入除外。

关于lvs-dr模式下一些疑问:
LVS负载均衡群集DR模式如何处理请求报文的,会修改IP包内容吗?
答:DR模式的LVS负载均衡群集本身不会关心IP层以上的信息,即使是端口号也是tcp/ip协议栈去判断是否正确,DR模式的LVS负载均衡群集本身主要做这么几个事:
①接收client的请求,根据你设定的负载均衡算法选取一台Web节点服务器的ip;
②以选取的这个ip对应的mac地址作为目标mac,然后重新将IP包封装成帧转发给这台Web节点服务器;
③在hash table中记录连接信息。
DR模式的LVS负载均衡群集做的事情很少,也很简单,所以它的效率很高,不比硬件负载均衡设备差多少,数据包、数据帧的大致流向是这样的:client –> LVS –> Web 节点服务器 –> client

Web节点服务器为什么要在lo接口上配置VIP?在出口网卡上配置VIP可以吗?
答:既然要让Web节点服务器能够处理目标地址为VIP的IP包,首先必须要让Web节点服务器能接收到这个包。在lo网卡上配置VIP能够完成接收包并将结果返回client。不可以将VIP设置在出口网卡上,否则会响应客户端的ARP request,造成ARP紊乱,以至于整个LVS群集环境都不能正常工作。

Web节点服务器为什么要抑制ARP?
答:对所有的物理网卡设置ARP仰制。对仰制所有的物理网卡设置ARP抑制是为了让客户端发送的请求顺利转交给LVS负载调度器以及防止整个LVS环境ARP混乱,不然容易导致整个lvs不能工作。

DR模式的LVS负载调度器与Web节点服务器为什么要在同一网段中?
答:DR模式的LVS负载调度器是在数据链路层来实现的,即VIP必须能够接受LVS负载调度器的arp请求,如果不在同一网段则会隔离arp,这样arp请求就不能转发到指定的Web节点服务器上,所以LVS负载调度器必须和Web节点服务器在同一网段里面。

为什么LVS负载调度器上ens33接口除了VIP另外还要配一个IP(即VIP)?
答:如果是用了keepalived等工具做HA或者LB,则在健康检查时需要用到VIP。 没有健康检查机制的HA或者LB则没有存在的实际意义。

DR模式的LVS负载调度器路由转发功能需要开启吗?
答:不需要。因为LVS负载调度器跟Web节点服务器是同一个网段,无需开启转发。

LVS负载调度器的VIP的子网掩码一定要是255.255.255.255吗?
DR模式的LVS负载调度器里,LVS负载调度器的VIP的子网掩码没必要设置为255.255.255.255,LVS负载调度器的VIP本来就是要像正常的IP地址一样对外通告的,不要搞得这么特殊。

LVS负载均衡群集的DR模式原理非常复杂,但实现过程还是很简单的。

四、案例实施

1.配置LVS负载调度器

(1)配置虚拟IP地址(VIP)

采用虚接口的方式(ens33:0)为ens33网卡绑定VIP地址,以便响应群集访问。配置如下:

[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0
自行修改网卡配置文件
[root@localhost ~]# ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.1  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::a5f4:262:9bbe:d04  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:00:11:89  txqueuelen 1000  (Ethernet)
        RX packets 2  bytes 501 (501.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 35  bytes 4894 (4.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@localhost ~]# ifconfig ens33:0
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.254  netmask 255.255.255.0  broadcast 192.168.1.255
        ether 00:0c:29:00:11:89  txqueuelen 1000  (Ethernet)

(2)调整/proc响应参数

对于DR群集模式来说,由于LVS负载调度器和各节点需要共用VIP地址,应该关闭Linux内核的重定向参数响应。配置如下:

[root@localhost ~]# vim /etc/sysctl.conf
         ………………                  //省略部分内容,添加以下内容
net.ipv4.conf.all.send_redirects  =  0     
net.ipv4.conf.default.send_redirects  =  0
net.ipv4.conf.ens33.send_redirects  = 0     
[root@localhost ~]# sysctl -p
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0

(3)配置负载分配策略

[root@localhost ~]# ipvsadm -C 
[root@localhost ~]# ipvsadm -A -t 192.168.1.254:80 -s rr
[root@localhost ~]# ipvsadm -a -t 192.168.1.254:80 -r 192.168.1.2 -g -w 1
[root@localhost ~]# ipvsadm -a -t 192.168.1.254:80 -r 192.168.1.3 -g -w 1
[root@localhost ~]# ipvsadm-save
-A -t localhost.localdomain:http -s rr
-a -t localhost.localdomain:http -r 192.168.1.2:http -g -w 1
-a -t localhost.localdomain:http -r 192.168.1.3:http -g -w 1

2.配置Web节点服务器

使用DR模式时,节点服务器也需要配置VIP地址,并调整内核的ARP响应参数以阻止更新VIP的MAC地址,避免发生冲突。除此之外,Web节点服务器的配置与NAT模式类似。

两台服务器配置内容一样!这里就拿一台Web节点服务器举例。

(1)配置虚拟IP地址

在每个Web节点服务器,同样需要具有VIP地址192.168.1.254,但此地址仅用作发送Web响应数据包的源地址,并不需要监听客户机的访问请求(改由调度器监听并分发)。因此使用虚接口lo:0来承担VIP地址,并为本机添加一条默认路由记录,将访问VIP的数据限制在本地,以避免通信混乱。

[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@localhost network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.1.254
NETMASK=255.255.255.255                                    //掩码必须全为1
ONBOOT=yes
NAME=loopback:0
[root@localhost network-scripts]# ifdown lo;ifup lo
[root@localhost network-scripts]# ifconfig lo:0
lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.1.254  netmask 255.255.255.255
        loop  txqueuelen 1  (Local Loopback)
[root@localhost ~]# vim /etc/rc.local                                       //永久添加一条路由信息
                      ………………             //省略部分内容,添加以下内容
/sbin/route add -host 192.168.1.254 dev lo:0
[root@localhost ~]# route add -host 192.168.1.254 dev lo:0                //临时添加一条路由信息

(2)调整/proc内核参数

[root@localhost ~]# vim /etc/sysctl.conf
                           ………………                 //省略部分内容,添加以下内容
net.ipv4.conf.all.arp_ignore  =  1
net.ipv4.conf.all.arp_announce  =  2
net.ipv4.conf.default.arp_ignore  =  1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore  =  1
net.ipv4.conf.lo.arp_announce  = 2
[root@localhost ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

(3)安装httpd,创建测试网页

[root@localhost ~]# yum -y install httpd
[root@localhost ~]# mount 192.168.1.4:/var/www/html /var/www/html
[root@localhost ~]# systemctl start httpd

3测试LVS群集

客户机访问192.168.1.254,在LVS群集服务器上查看效果!

[root@localhost ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.254:80 rr
  -> 192.168.1.2:80               Route   1      1          0         
  -> 192.168.1.3:80               Route   1      1          0 

效果实现,实验已完成!!!

———————— 本文至此结束,感谢阅读 ————————