设为首页 收藏本站
查看: 974|回复: 0

[经验分享] LVS的nat模型和DR模型的配置管理

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2019-1-6 09:59:55 | 显示全部楼层 |阅读模式
                                      LVS   

                                                                              lvs

  

  LVSLinux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一;
  

  lvs的几种模型:
      1、NAT模型;
              特性:              
          1、real server中的各服务器rip地址应该使用私有地址,有效隐藏内部服务器;
          2、real server中各服务器的网关必须指向dip。rip和dip必须在同一网段内,保证流量经过Director;
          3、请求和响应的报文都得经过Directory(SNAT+DNAT);
          4、在高负载应用场景中,Directory很可能成为系统性能瓶颈;
          5、支持DNAT的端口映射。将80映射到real server中的8080;
          6、real server中的各服务器可以使用任意支持集群服务的OS(系统);
      注意:该类型适合并发和请求数量不高的场景中;
  

    2、DR模型;
        特性:
          1、real server可以使用私有地址,但也可以使用公网地址,此时可以直接通过互联网连入real server以实现配置、监控等;
          2、real server的网关一定不能指向DIP;
          3、real server跟Directory要在同一物理网络内(不能由路由器分离);
          4、请求报文经过Directory,但响应报文一定不经过Directory;
          5、不支持端口映射;
          6、real server可以使用大多数的操作系统;
  

    3、TUN模型;

        特性:
          1、rip、dip、vip都得是公网地址;
          2、real server的网关不能指向也不可能指向dip;
          3、请求报文经过Directory,但响应报文一定不经过Directory;
          4、不支持端口映射;
          5、real server的系统必须得支持隧道功能;
          

    4、FULLNAT模型;
        特性:
          fullnat:在nat模型的基础上,在Directory上将请求的报文(cip+vip),改成(dip+rip)。这样,当real server收到后,将回包的报文为rip+dip,然后再由Directory将报文再次改变成vip+cip即可。保证回程报文经过Directory。
          主要由Directory将报文实施转换动作;
          优点:Directory和real server可以跨不同的vlan部署。可以不在一个网段;
  

  LVS的10种调度方法:  
      静态调度:

      rr算法:Round Robin,轮询。轮询real server中的服务器。最简单、易实现;
      wrr算法:Weighted RR,加权轮询。根据real server的权重比例去调度不同权重的服务器。高权重的被调度的次数就多;
      sh算法:source hashing,源地址hash。来自同一源ip的请求都发往固定的服务器上去。主要目的是为了实现session绑定的;
      dh算法:destination hashing,目的地址hash。去往同一目标的客户端请求会话被固定在一个响应服务器上;
      缺陷:不会考虑后台real server的负载情况,是不是很忙,只知道根据算法去轮询。比较“傻”;
  

      动态调度:

      lc算法:Least connection,最小连接。根据服务器的链接数来进行判断和执行调度;
          公式:Overhead=Action*256+Inactive 负载=(活动链接数*256+非活动链接数)
          计算结果中,最小者胜出成为被调度者。如果值一样,则执行轮询;
  

      wlc算法:Weighted LC,权重的最小连接。在最小连接的基础上增加权重;
          公式:Overhead=(action*256+非活动链接数)/weight(权重)
          计算结果越小者胜出,被执行调度。如果值一样,则之上而下进行轮询;
          缺点:可能性能差的服务器刚好被轮询了,而性能好的服务器反而没轮询到;
  

      sed算法:Shortest Expect Delay,最短期望延迟。防止挑到性能最差的服务器进行相应。改进版的wlc;     
          计算结果越小者胜出,被执行调度。永远是权重大的服务器排在最前面被轮询到;
          公式:overhead=(active+1)*256/weight ,不考虑非活动连接数;
      nq算法:Nerver Queue,永不排队。改进了的sed。刚开局之后,所有服务器首先根据sed算法轮询一遍,(第一个请求给权重最大的,第二个、第三个...依次排下去,排一遍)。然后再根据sed算法再重新计算调度;
  

      lblc算法:Locality-based least conection,基于本地的最小连接。相当于dh+lc。用的不多;
lblcr算法:Replicated and Locality-based least connection,带复制的基于本地的最小连接。用在后端服务器是cache服务器上。用的不多;



      宗旨:无论使用lvs的哪种调度类型,都可以自由的选择调度方法,将用户请求调度至后端real server。类型和方法可混用;
      缺陷:LVS是无法检测后端real server的健康状况的;
  

  

  LVS的NAT模型的实验:
      拓扑:
     
      环境:

          web1:192.168.12.11
          web2:192.168.12.12
          directory:

              内网ip:192.168.12.1

              外网ip:192.168.57.136

          用户ip:192.168.57.155

          web服务器,基于apache服务器搭建;

          direcotry,基于lvs;

  

      在web1上:
  [root@localhost ~]# ifconfig
  eth1      Link encap:Ethernet  HWaddr 00:0C:29:34:DA:E2  
            inet addr:192.168.12.11  Bcast:192.168.12.255  Mask:255.255.255.0
            inet6 addr: fe80::20c:29ff:fe34:dae2/64 Scope:Link
            UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
            RX packets:4173 errors:0 dropped:0 overruns:0 frame:0
            TX packets:3474 errors:0 dropped:0 overruns:0 carrier:0
            collisions:0 txqueuelen:1000
            RX bytes:380871 (371.9 KiB)  TX bytes:448376 (437.8 KiB)
  

      在web2上:

  [root@localhost ~]# ifconfig
  eth1      Link encap:Ethernet  HWaddr 00:0C:29:03:A5:B7  
            inet addr:192.168.12.12  Bcast:192.168.12.255  Mask:255.255.255.0
            inet6 addr: fe80::20c:29ff:fe03:a5b7/64 Scope:Link
            UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
            RX packets:5181 errors:0 dropped:0 overruns:0 frame:0
            TX packets:2500 errors:0 dropped:0 overruns:0 carrier:0
            collisions:0 txqueuelen:1000
            RX bytes:523926 (511.6 KiB)  TX bytes:268639 (262.3 KiB)
     
      在directory上:
  [root@localhost ~]# ifconfig
  eth0      Link encap:Ethernet  HWaddr 00:0C:29:B2:B7:26  
            inet addr:192.168.57.136  Bcast:192.168.57.255  Mask:255.255.255.128
            inet6 addr: fe80::20c:29ff:feb2:b726/64 Scope:Link
            UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
            RX packets:2928 errors:0 dropped:0 overruns:0 frame:0
            TX packets:451 errors:0 dropped:0 overruns:0 carrier:0
            collisions:0 txqueuelen:1000
            RX bytes:632507 (617.6 KiB)  TX bytes:42962 (41.9 KiB)
  eth1      Link encap:Ethernet  HWaddr 00:0C:29:B2:B7:30  
            inet addr:192.168.12.1  Bcast:192.168.12.255  Mask:255.255.255.0
            inet6 addr: fe80::20c:29ff:feb2:b730/64 Scope:Link
            UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
            RX packets:928 errors:0 dropped:0 overruns:0 frame:0
            TX packets:906 errors:0 dropped:0 overruns:0 carrier:0
            collisions:0 txqueuelen:1000
            RX bytes:79442 (77.5 KiB)  TX bytes:87637 (85.5 KiB)
  

      在web1上:
  [root@localhost ~]# cat /var/www/html/index.html
  192.168.12.11-web1
  [root@localhost ~]#
  

      在web2上:
  [root@localhost ~]# cat /var/www/html/index.html
  192.168.12.12-web2
  [root@localhost ~]#
  

      在directory上:

  [root@localhost ~]# yum -y install ipvsadm
  [root@localhost ~]# ipvsadm -A -t 192.168.57.136:80 -s rr
  [root@localhost ~]# ipvsadm -a -t 192.168.57.136:80 -r 192.168.12.11 -m
  [root@localhost ~]# ipvsadm -a -t 192.168.57.136:80 -r 192.168.12.12 -m
  [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.57.136:80 rr
    -> 192.168.12.11:80             Masq    1      0          0         
    -> 192.168.12.12:80             Masq    1      0          0         
  

  在windwos客户端上:(验证。不断的刷新,会轮训显示web1和web2)
     
     
  

  在web1上:
  [root@localhost ~]# tail -f /var/log/httpd/access_log
  192.168.57.177 - - [08/Jul/2015:19:18:26 +0800] "GET / HTTP/1.1" 200 28 "-" "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko LBBROWSER"
  

  在web2上:
  [root@localhost ~]# tail -f /var/log/httpd/access_log
  192.168.57.177 - - [08/Jul/2015:19:18:25 +0800] "GET / HTTP/1.1" 200 28 "-" "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko LBBROWSER"
  
  ok,rr的负载均衡的轮询模式就这样完成了;
  

  

  LVS的DR模型的实验:
      拓扑:

          
          
    环境:

        web1:192.168.12.11
            虚拟ip:192.168.12.100

        web2:192.168.12.12
            虚拟ip:192.168.12.100

        directory:

            内网ip:192.168.12.1

            虚拟ip:192.168.12.100(用户直接访问的ip)

        用户ip:192.168.12.10

        web服务器:基于apache服务器搭建;

        direcotry:基于lvs;
          实际生产环境中,要求虚拟ip必须是公网ip,且能够被直接路由到用户端的;
          web服务器的ip地址也是公网ip地址,且能被直接路由;
              注意:这里只是为了测试效果,ip地址没有区分内网或者公网;
          
  1、基础配置:
      在directory上:
  [root@localhost ~]# ifconfig
  eth1      Link encap:Ethernet  HWaddr 00:0C:29:B2:B7:30  
            inet addr:192.168.12.1  Bcast:192.168.12.255  Mask:255.255.255.0
            inet6 addr: fe80::20c:29ff:feb2:b730/64 Scope:Link
            UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
            RX packets:5499 errors:0 dropped:0 overruns:0 frame:0
            TX packets:3875 errors:0 dropped:0 overruns:0 carrier:0
            collisions:0 txqueuelen:1000
            RX bytes:486888 (475.4 KiB)  TX bytes:470006 (458.9 KiB)
  

      在web1上:
  [root@localhost ~]# ifconfig
  eth1      Link encap:Ethernet  HWaddr 00:0C:29:34:DA:E2  
            inet addr:192.168.12.11  Bcast:192.168.12.255  Mask:255.255.255.0
            inet6 addr: fe80::20c:29ff:fe34:dae2/64 Scope:Link
            UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
            RX packets:3112 errors:0 dropped:0 overruns:0 frame:0
            TX packets:1949 errors:0 dropped:0 overruns:0 carrier:0
            collisions:0 txqueuelen:1000
            RX bytes:281203 (274.6 KiB)  TX bytes:242480 (236.7 KiB)
  
    在web2上:

  [root@localhost ~]# ifconfig
  eth1      Link encap:Ethernet  HWaddr 00:0C:29:03:A5:B7  
            inet addr:192.168.12.12  Bcast:192.168.12.255  Mask:255.255.255.0
            inet6 addr: fe80::20c:29ff:fe03:a5b7/64 Scope:Link
            UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
            RX packets:2897 errors:0 dropped:0 overruns:0 frame:0
            TX packets:1892 errors:0 dropped:0 overruns:0 carrier:0
            collisions:0 txqueuelen:1000
            RX bytes:265958 (259.7 KiB)  TX bytes:215427 (210.3 KiB)
  

          注意:web服务器在配置ip地址时,网关地址不能指向directory上,不然相应数据包会经过directory进行转发,这是我们不想看到的!!!

  

  2、配置虚拟ip地址和路由:
      在directory上:
  [root@localhost ~]# ifconfig eth1:0 192.168.12.100 netmask 255.255.255.255 broadcast 192.168.12.100
  [root@localhost ~]# route add -host 192.168.12.100 dev eth1:0
  [root@localhost ~]# route -n
  Kernel IP routing table
  Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
  192.168.12.100  0.0.0.0         255.255.255.255 UH    0      0        0 eth1
  192.168.12.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1
  169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1
  

      在web1上:
  [root@localhost ~]# ifconfig lo:0 192.168.12.100 netmask 255.255.255.255 broadcast 192.168.12.100
  [root@localhost ~]# route add -host 192.168.12.100 dev lo:0
  [root@localhost ~]# route -n
  Kernel IP routing table
  Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
  192.168.12.100  0.0.0.0         255.255.255.255 UH    0      0        0 lo
  192.168.12.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1
  169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth1
  

      在web2上:

  [root@localhost ~]# ifconfig lo:0 192.168.12.100 netmask 255.255.255.255 broadcast 192.168.12.100
  [root@localhost ~]# route add -host 192.168.12.100 dev lo:0
  [root@localhost ~]# route -n
  Kernel IP routing table
  Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
  192.168.12.100  0.0.0.0         255.255.255.255 UH    0      0        0 lo
  192.168.12.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1
  169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth1
  

      ok,三个节点上都要配置虚拟ip地址及路由;

      注意:虚拟ip地址的掩码必须是“255.255.255.255”的!!!
  

  3、配置web服务器内核参数。
  (防止虚拟ip地址所在网卡主动外网通告mac地址,防止虚拟ip地址所在网卡主动响应请求。如果不这样做,会导致三个节点上的虚拟ip地址冲突。因此,只能限制web服务器上的虚拟ip地址,而不是directory上的)
      在web1和web2上:
  [root@localhost conf]# pwd
  /proc/sys/net/ipv4/conf
  [root@localhost conf]# echo 1 > all/arp_ignore
  [root@localhost conf]# echo 1 > eth1/arp_ignore
  [root@localhost conf]# echo 2 > eth1/arp_announce
  [root@localhost conf]# echo 2 > all/arp_announce
      注意:这里为了防止出现意外,我们对所有网卡和物理网卡都进行了通告和响应限制;

  

  ipvs规则的创建:
      在direcroty上:

     
  [root@localhost ~]# ipvsadm -A -t 192.168.12.100:80 -s rr
  [root@localhost ~]# ipvsadm -a -t 192.168.12.100:80 -r 192.168.12.11 -g
  [root@localhost ~]# ipvsadm -a -t 192.168.12.100:80 -r 192.168.12.12 -g
  [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.12.100:80 rr
    -> 192.168.12.11:80             Route   1      0          0         
    -> 192.168.12.12:80             Route   1      0          0  
      注意:这里因为是DR模型,所以必须是“-g”选项。任然采用均衡的轮询方式处理请求;

  

      ok,lvs的DR模型的rr算法调度至此配置完毕;

  

  4、测试:
      在windows客户机上:(不断的刷新会出现轮训的现象)
      在direcotry上:

     
  [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.12.100:80 rr
    -> 192.168.12.11:80             Route   1      0          16        
    -> 192.168.12.12:80             Route   1      0          16
          :可以看到两台服务器响应连接是均衡的;

  

  ok,实验成功!
  

  

     

          

  

  


   

  





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-659888-1-1.html 上篇帖子: 关于lvs/nginx负载均衡 session保持的摘录 下篇帖子: LVS三种请求转发方式和八种调度算法简介
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表