LVS搭建负载均衡集群(二)——DR模式

时间:2021-01-20 03:04:50

(1).DR模式和TUN模式介绍

  Direct Routing(直接路由):director分配请求到不同的real server。real server处理请求后直接回应给用户,这样director负载均衡器仅处理客户机与服务器的一半连接。负载均衡器仅处理一半的连接,避免了新的性能瓶颈,同样增加了系统的可伸缩性。Direct Routing由于采用物理层(修改MAC地址)技术,因此所有服务器都必须在一个网段中

  IP Tunneling(IP隧道):director分配请求到不同的real server。real server处理请求后直接回应给用户,这样director负载均衡器仅处理客户机与服务器的一半连接。IP Tunneling技术极大地提高了director的调度处理能力,同时也极大地提高了系统能容纳的最大节点数,可以超过100个节点。real server可以在任何LAN或WAN上运行,这意味着允许地理上的分布,这在灾难恢复中有重要意义。服务器必须拥有正式的公网IP地址用于与客户机直接通信,并且所有服务器必须支持IP隧道协议

  两者间的最大区别就在于IP地址是否在同一物理网段中,也是导致DR模式只需要服务器能够上网即可,但TUN模式必须拥有正式的公网IP。

(2).DR模式工作原理

LVS搭建负载均衡集群(二)——DR模式

  扣了一张大佬的图,比较详细。原地址为:https://blog.csdn.net/gui951753/article/details/80316565#LVS_29

  我用文字说明一下:

    DR模式全程流向不变则目标地址、源地址不变,因为DR模式工作于2层。

    第一步、请求报文从客户端发出,源地址:CIP,目标地址:VIP,源MAC:CMAC,目标MAC:VMAC;

    第二步、请求到达负载均衡器,分配真实服务器(修改MAC),源地址:CIP,目标地址:VIP,源MAC:DMAC,目标MAC:RMAC;

    第三步、真实服务器接收报文,处理并响应(回头了),源地址:RIP,目标地址:CIP,源MAC:RMAC,目标MAC:CMAC。

  说明:1)基于MAC的数据报文转发是效率最好的,但是是根据交换机的MAC地址表来实现的;

     2)2层设备不具有路由功能, 那么广播也就不具有跨路由的功能, 所有要实现mac地址广播, 必须在同一物理网段;

     3)vlan具有隔离广播的功能, 所有要能处理mac地址广播, 就应该在同一个VLAN中

  总来说就是,所有的设备应该在同一个物理网段,所有的设备都应该在同一个广播域中。

(3).实验

youxi1  192.168.5.100(DIP),192.168.5.100(VIP)   负载均衡器

youxi2  192.168.5.102                 真实服务器1

youxi3  192.168.5.103                 真实服务器2

 1)在负载均衡器youxi1上生成ens33:1的配置文件,配置成192.168.5.101,作为VIP

[root@youxi1 ~]# cp /etc/sysconfig/network-scripts/ifcfg-ens33{,:1}
[root@youxi1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33:1  //修改以下参数
NAME="ens33:1"
DEVICE="ens33:1"
IPADDR="192.168.5.101"
GATEWAY="192.168.5.2"  //指向路由IP
//如果存在HWADDR,那么ens33和ens33:1两者不必须一致。
[root@youxi1 ~]# systemctl restart network  //重启
[root@youxi1 ~]# ip a sh  //查看
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host 
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e6:d6:27 brd ff:ff:ff:ff:ff:ff
inet 192.168.5.100/24 brd 192.168.5.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.5.101/24 brd 192.168.5.255 scope global secondary noprefixroute ens33:1
valid_lft forever preferred_lft forever
inet6 fe80::201:7257:85b:7dc8/64 scope link noprefixroute 
valid_lft forever preferred_lft forever

 2)在负载均衡器youxi1上安装ipvsadm,并设置开机自启

[root@youxi1 ~]# yum -y install ipvsadm
[root@youxi1 ~]# systemctl enable ipvsadm.service
Created symlink from /etc/systemd/system/multi-user.target.wants/ipvsadm.service to /usr/lib/systemd/system/ipvsadm.service.

  暂时不启动ipvsadm,是因为启动需要/etc/sysconfig/ipvsadm配置文件。

 3)在负载均衡器youxi1上使用ipvsadm命令设置规则

[root@youxi1 ~]# ipvsadm -A -t 192.168.5.101:80 -s rr  //设置虚拟服务器的IP地址(VIP)和端口,使用轮询模式
[root@youxi1 ~]# ipvsadm -a -t 192.168.5.101:80 -r 192.168.5.102:80 -g
[root@youxi1 ~]# ipvsadm -a -t 192.168.5.101:80 -r 192.168.5.103:80 -g 
[root@youxi1 ~]# 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.5.101:80 rr
  -> 192.168.5.102:80             Route   1      0          0         
  -> 192.168.5.103:80             Route   1      0          0         
[root@youxi1 ~]# ipvsadm -S > /etc/sysconfig/ipvsadm
-A -t youxi1.cn:http -s rr
-a -t youxi1.cn:http -r youxi2.cn:http -g -w 1
-a -t youxi1.cn:http -r 192.168.5.103:http -g -w 1
[root@youxi1 ~]# systemctl start ipvsadm

  -g选项表示DR模式,-m选项表示TUN模式。

  注意:LVS的三种模式中,只有NAT模式需要开启路由转发功能,DR和TUN都不需要。

  如果开启了防火墙记得添加端口号

[root@youxi1 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload
success
success

 4)在真实服务器youxi2和youxi3上安装httpd用于测试

[root@youxi2 ~]# yum -y install httpd
[root@youxi2 ~]# systemctl start httpd
[root@youxi2 ~]# echo youxi2 > /var/www/html/index.html

[root@youxi3 ~]# yum -y install httpd
[root@youxi3 ~]# systemctl start httpd
[root@youxi3 ~]# echo youxi3 > /var/www/html/index.html

  如果开启了防火墙记得开放端口

[root@youxi2 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload
success
success

[root@youxi3 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload
success
success

 5)在真实服务器youxi2和youxi3上配置回环接口

[root@youxi2 ~]# cp /etc/sysconfig/network-scripts/ifcfg-lo{,:1}
[root@youxi2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:1  //修改
DEVICE=lo:1
IPADDR=192.168.5.101  //指向VIP
NETMASK=255.255.255.255
#NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
#BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback

[root@youxi3 ~]# cp /etc/sysconfig/network-scripts/ifcfg-lo{,:1}
[root@youxi3 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:1  //修改
DEVICE=lo:1
IPADDR=192.168.5.101  //指向VIP
NETMASK=255.255.255.255
#NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
#BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback

  为什么要在会还口上配置VIP:1.因为DR模式只改变MAC地址而不改变IP地址,为了真实服务器能够接收到报文,所以需要配置一个和VIP一样的IP地址;2.但是VIP不能配置在出口网卡上,否则会响应客户端的ARP请求,造成client/gateway arp table混乱,导致整个集群不能正常工作。

  另外VIP可以不和RIP、DIP同网段,lo回环接口依然这样配置。

 6)关闭真实服务器youxi2和youixi3上的ARP转发

[root@youxi2 ~]# vim /etc/sysctl.conf  //添加或修改
net.ipv4.conf.ens33.arp_ignore = 1
net.ipv4.conf.ens33.arp_announce = 2
[root@youxi2 ~]# sysctl -p    //刷新
net.ipv4.conf.ens33.arp_ignore = 1
net.ipv4.conf.ens33.arp_announce = 2

[root@youxi3 ~]# vim /etc/sysctl.conf  //添加或修改
net.ipv4.conf.ens33.arp_ignore = 1
net.ipv4.conf.ens33.arp_announce = 2
[root@youxi2 ~]# sysctl -p    //刷新
net.ipv4.conf.ens33.arp_ignore = 1
net.ipv4.conf.ens33.arp_announce = 2

//或者添加或修改如下参数
net.ipv4.conf.ens33.arp_ignore = 1
net.ipv4.conf.ens33.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

参数说明:

  arp_ignore参数的作用是控制系统在收到外部的arp请求时,是否要返回arp响应。参数常用的取值主要有0,1,2,3~8较少用到:

    0:响应任意网卡上接收到的对本机IP地址的arp请求(包括环回网卡上的地址),而不管该目的IP是否在接收网卡上;
    1:只响应目的IP地址为接收网卡上的本地地址的arp请求;
    2:只响应目的IP地址为接收网卡上的本地地址的arp请求,并且arp请求的源IP必须和接收网卡同网段;
    3:如果ARP请求数据包所请求的IP地址对应的本地地址其作用域(scope)为主机(host),则不回应ARP响应数据包,如果作用域为全局(global)或链路(link),则回应ARP响应数据包;
    4~7:保留未使用;
    8:不回应所有的arp请求。
  sysctl.conf中包含all和eth/lo(具体网卡)的arp_ignore参数,取其中较大的值生效。
 
  arp_announce的作用是控制系统在对外发送arp请求时,如何选择arp请求数据包的源IP地址。(比如系统准备通过网卡发送一个数据包a,这时数据包a的源IP和目的IP一般都是知道的,而根据目的IP查询路由表,发送网卡也是确定的,故源MAC地址也是知道的,这时就差确定目的MAC地址了。而想要获取目的IP对应的目的MAC地址,就需要发送arp请求。arp请求的目的IP自然就是想要获取其MAC地址的IP,而arp请求的源IP是什么呢? 可能第一反应会以为肯定是数据包a的源IP地址,但是这个也不是一定的,arp请求的源IP是可以选择的,控制这个地址如何选择就是arp_announce的作用)  arp_announce参数常用的取值有0,1,2:
    0:允许使用任意网卡上的IP地址作为arp请求的源IP,通常就是使用数据包a的源IP。
    1:尽量避免使用不属于该发送网卡子网的本地地址作为发送arp请求的源IP地址。
    2:忽略IP数据包的源IP地址,选择该发送网卡上最合适的本地地址作为arp请求的源IP地址。
  sysctl.conf中包含all和eth/lo(具体网卡)的arp_ignore参数,取其中较大的值生效。

    

 7)测试

LVS搭建负载均衡集群(二)——DR模式

LVS搭建负载均衡集群(二)——DR模式

  连续刷新好像是不会更换真实服务器RS的,这点和NAT的轮询不一样。