zoukankan      html  css  js  c++  java
  • LVS搭建负载均衡集群(二)——DR模式

    (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模式工作原理

      扣了一张大佬的图,比较详细。原地址为: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)测试

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

  • 相关阅读:
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    软件工程实践总结
  • 原文地址:https://www.cnblogs.com/diantong/p/11196038.html
Copyright © 2011-2022 走看看