lvs简介

*爱你&永不变心* 提交于 2020-01-10 19:41:32
lvs基础

lvs基础原理及实现

Linux Cluster:

  1. Cluster:计算机集合,为解决某个特定问题组合起来形成的单个系统

    • LB:Load Balancing,负载均衡

    • HA: High Availiablity,高可用

    • HP:High Performance,高性能

  2. lvs集群的类型:

    • lvs-nat(network address translation)

      多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和port实现转发

      1. RIP和DIP必须在同一个IP网络,且应该使用私网地址;
      2. 请求报文和响应报文都必须经过由Director转发,Director易于成为系统瓶颈
      3. 支持端口映射,可修改请求报文的目标port
      4. vs必须是linxu系统,rs可以是任意系统
      5. 发送的包 cip/vip --> vs cip/rip 返回的包 rip/cip --> vs vip/cip 支持端口映射
    • lvs-dr(direcrot routing直接路由)

      Director Routing:直接路由: //后端主机,改IP后不做通告,也不arp请求响应

      通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变

      1. 确保前端路由器将目标IP为VIP的请求报文发往Director
      2. 在RS上修改内核参数以限制arp通告及应答级别
        • arp_announce 限制通告级别
        • arp_ignore 限制应答级别
      3. RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director
      4. RS跟Director要在同一个物理网络
      5. 请求报文要经由Director,但响应报文不能经由Director,而是由RS直接发往Client
      6. 不支持端口映射
    • lvs-tun

      转发方式 :不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)

      [CIP/VIP] ---> director ---> [DIP/RIP[CIP/VIP]] ---> RIP ---> [VIP|CIP]

      1. DIP,VIP,RIP都应该是公网地址
      2. RS的网关不能,也不可能指向DIP
      3. 请求报文要经由Director,但响应不能经由Director
      4. 不支持端口映射
      5. RS的OS得支持隧道功能
      6. 有可能会出现世型针,超过MTU1500,同时RIP主机得要支持隧道技术,RIP在接收到请求报文的时候会拆开包看到里面还有一个IP首部(CIP-->VIP),但是一看vip在自己主机上,就接收报文发往用户进程处理,并从vip地址上发送给CIP,也就不用经由Director
  3. lvs-tun

    通过同时修改请求报文的源IP地址和目标IP地址进行转发

    1. VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络,因此,RIP的网关一般不会指向DIP
    2. RS收到的请求报文源地址是DIP,因此,只能响应给DIP,但是Director不宁将其发往Client
    3. 请求和响应报文都经由Director
    4. 支持端口映射

      此类开型默认不支持,需要手动编译安装

  4. LVS的调试算法 Scheduler

        静态方法:仅根据算法本身进行调度,不考虑RS负载状态

      1. rr: Round Robin 轮询,按照顺序依次重复轮询

        缺陷:

        每台服务器工作性能可能有差异,应该能者多劳,轮询没法达到此效。

        session无法保持,用户第一次请求时发往A服务器,第二次请求发往B服务器,这两个不同的会话,客户端第一次请求操作是在购物车添加商品,第二次请求轮询至另一台,则第一次添加的商品会丢失,这是客户不可忍受的(此时需要依赖于session保持机制)

      2. wrr: Weighted RR 按照服务器权重轮询

        通过给RS设定权重,一般性能高的RS权重设置大,按照权重的算法依次轮询转发

      3. sh: Source Hashing 源地址哈希

        客户端的首次请求按照其他算法选择RS,后续请求只要是源地址相同都发往同一台RS,这样一定程度上解决了session保持问题。但是又引出情人眼里出西施下问题:

        缺陷:

        现今多数用户都通过snat方式访问互联网,如一个上百台主机的局域网环境,都指向同一个网关,所以对DR而言,源地址都是同一个,实际上是来自不同的客户端的请求,这些请求都将被 发往同一台RS处理,严重损害了负载均衡的效果

      4. dh: Destination Hashing 目标地址哈希

        此算法一般在有多个防火墙时的场景下应用,在防火墙基于状态追踪的机制下,保证响应报文能够通过同一防火墙发送出去

        动态算法: 根据算法及各RS当前负载状态进行调度

      5. LC:least connect 最少连接 //当计算结果相同时,就按照“自上而下”的轮询方式进行选择
      6. WLC: Weight LC 加权最少连接数(少者胜出)

        当计算结果相同时,自上而下选择,一般首次所有RS都先轮询一遍,每个都处理一个请求,以免权重小的术轻松了。第二轮开始权重才开始发挥效果,但是第一次响应的有可能是性能最差的服务器

      7. SED:shortest Expections Delay (Overhead=(activeconns+1)*256/weight)最短期望延迟

        改进版的WLC,这种算法保证了是有权重最高的RS首先响应服务,而非初始计算值都是相同的造成轮询,但是会造成权重大的RS过多的负载,而权重小的RS过于空闲

      8. NQ: SED 的增强版,避免了,权重过大的服务器过于繁忙,而权重过小的过于空闲,也就是一开始全都轮询一遍,然后在开启SED算法来选择。

      9. LBLC: Locality-based Least Connection

        相当于DH+LC,基于局部性的最少连接算法是针对请求报文的目标IP地址的负载均衡调度,主要用于Cache集群系统,因为Cache集群中客户请求报文的布标IP地址是变化的,这里假设任何后端服务器都可以处理任何请求,算法的设计目标在服务器的负载基本平衡的情况下,将相同的目标IP地址的请求调度到同一个台服务器,来提高个太服务器的访问局部性和主存Cache命中率,从而调整整个集群系统的处理能力。 基于局部性的最少连接调度算法根据请求的目标IP地址找出该目标IP地址最近使用的RealServer,若该Real Server是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。

      10. LBLCR:Replicated adn Locality-based Connection

        带复制的基于局部性最少链接调度算法也是针对目标IP地址的负载均衡,该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度

    • 如今centos6/7的版本上已经自动的编译了ipvs,但是可以确定一下://如果没有显示的话,就要自己重新编译内核

      [root@localhost ~]# grep -i -C 10 'ipvs' /boot/config-3.10.0-327.el7.x86_64
      # IPVS transport protocol load balancing support
      #
      CONFIG_IP_VS_PROTO_TCP=y
      CONFIG_IP_VS_PROTO_UDP=y
      # IPVS scheduler //lvs支持的10种算法
      CONFIG_IP_VS_RR=m
      CONFIG_IP_VS_WRR=m
      CONFIG_IP_VS_LC=m
      CONFIG_IP_VS_WLC=m
      CONFIG_IP_VS_LBLC=m
      CONFIG_IP_VS_LBLCR=m
      CONFIG_IP_VS_DH=m
      CONFIG_IP_VS_SH=m
      CONFIG_IP_VS_SED=m
      CONFIG_IP_VS_NQ=m
      
      
    • ipvsadm是一款用于操控内核的应用软件,在base源好像就有:
      管理集群服务
      ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]
      A:添加 E:修改 t:tcp u:udp f:firewall server-address:VIP -s:调试算法 -p:持久连接功能
      ipvsadm -D -t|u|f service-address       //删除
      ipvsadm -C                              //清空
      ipvsadm -R 
      
      
      
    • lvs-nat配置实例:

       
       Director CR1 CR2 
       VIP:172.168.254.35 CIP:192.168.153.143CIP:192.168.153.144 
       DIP:192.168.153.139 
      
      Director
      ~]# yum install ipvsadm
      ~]# ipvsadm -A -t 172.16.254.35:80 -s rr
      ~]# ipvsadm -a -t 172.16.254.35:80 -r 192.168.153.143 -g
      ~]# ipvsadm -a -t 172.16.254.35:80 -r 192.168.153.143 -g
      ~]# sysctl -w net.ipv4.ip_forward=1
      ~]# sysctl -p
      CR1
      ~]# yum install httpd
      ~]# echo 143 > /var/www/html/index.html
      ~]# systemctl start httpd
      ~]# ip route add default via 192.168.153.139
      CR2
      ~]# yum install httpd
      ~]# echo 144 > /var/www/html/index.html
      ~]# systemctl start httpd
      ~]# ip route add default via 192.168.153.139
      

      打开一个客户端,访问一下,试试,可不可以轮询

      [root@localhost ~]# for((i=1;i
    • lvs-dr配置实例:

       
       Director CR1 CR2 
       VIP:172.168.254.36 CIP:172.16.252.113CIP:172.16.250.84 
       DIP:172.16.254.35 
      
      #!/bin/bash
      #
      IPADDR=172.16.254.36
      case $1 in
      start)
              echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore   
              echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
              echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
              echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
              ip addr add $IPADDR  dev lo:0       //给lo口添加VIP
              ip route add 172.16.254.36 dev lo:0  //让去往VIP
              ;;
      stop)
              echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
              echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
              echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
              echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
              ip addr del $IPADDR dev lo:0 > /dev/null
              ;;
      *)
              echo "start|stop"
      esac
      

      arp_ignore:定义响应级别,响应时忽略方式,1表示只从本接口进入的请求响应,且本接口地址是个网络地址

      arp_annouce:定义通告级别,2表示仅使用定义的网卡接口在同网络内通信

      Director:
      ~]# ip addr add 172.16.254.36 dev eth0:0
      ~]# yum install ipvsadm
      ~]# ipvsadm -A -t 172.16.254.36:80 -s rr
      ~]# ipvsadm -a -t 172.16.254.36:80 -r 172.16.252.113 -g
      ~]# ipvsadm -a -t 172.16.254.36:80 -r 172.16.250.84 -g
      ~]# for((i=1;i

    • FWM防火墙标记功能

      功能:防火墙标记可以实现多个集群服务绑定为同一个,实现统一调度;将共享一组RS的集群服务统一进行定义。

      在PREROUTING链上打标,在INPUT链上把打标记的请求来做成集群

      ~]#  iptables -t mangle -A PREROUTING -d 172.16.254.36 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 2
      ~]# ipvsadm -A -f 2 -s rr -p 60     //在一定时间内,将同一个ip地址的请求发往同一个RS
      ~]# ipvsadm -a -f 2 -r 172.16.252.113 -g -w 1
      ~]# ipvsadm -a -f 2 -r 172.16.250.84 -g -w 3
      ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
      ~]# iptables-save > /etc/sysconfig/iptable
      

      ~]# ipvsadm -A -t 172.16.254.36:0 -s rr //默认所有的服务全都调度给后端服务器,所以不常用
    易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
    该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!