负载均衡-四层负载均衡:LVS

之前也写过相关的文章,但是写的太烂了。。。自己都不也敢直视。。。

现在有空决定重新全面学习了下LVS.总结出本博客。好了,其他的不多说了,我们开始吧。


一、负载均衡

  负载均衡包括如下:

    1、硬件负载均衡:

    F5,BIG IP

    Citrix,Netscaler

    A10

   2、软件负载均衡:

四层:

  LVS

七层:反向代理

  Nginx 

    代理的协议有:http smtp pop3 imap

  HAProxy

代理的协议有:http,tcp(mysql,smtp)


二、LVS的介绍

 1、简介:

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

                                -----------百度百科。

  LVS是一个四层的负载均衡软件,工作在内核空间。性能非常强大,而所支持的特性很少。工作在INPUT链上,所以lvs与iptables在INPUT链不能同时使用。

 2、组成:

  有两部分:

    ipvsadm lvs规则管理

    ipvs 是内核程序

  ipvs在linux 2.6内核所有版本中已存在。只需要安装ipvsadm就可以了。

  安装命令:yum -y install ipvsadm


三、LVS的三种模型

  NAT:地址转换

  DR:直接路由

  TUN:隧道


  三种模型的特性:

  1、NAT

    后端的集群节点也就是real server 必须与LVS所在的服务器在同一个IP网络中;

    后端的real server所使用的ip通常是私有地址,仅用于各集群节点间的通信;

    LVS服务器位于client和real server之间,并负责处理进出的所有通信;

    real server必须将网关指向DIP;

    支持端口映射;

    real server可以使用任意OS;

    较大规模应该场景中,director易成为系统瓶颈;

  2、DR

    集群节点real server 跟LVS必须在同一个物理网络中;

    real server 可以使用公网地址,实现便捷的远程管理和监控;

    LVS仅负责处理入站请求,响应报文则由real server直接发往客户端;

    real server不能将网关指向DIP;

    不支持端口映射;

    在这个模型下vip和real server所对应的端口要一样才行。

  3、TUN

    集群节点可以跨越Internet;

    real server必须是公网地址;

    LVS仅负责处理入站请求,响应报文则由real server直接发往客户端;

    real server网关不能指向LVS;

    只有支持隧道功能的OS才能用于real server;

    不支持端口映射;

  LVS默认使用的模型为DR模型


四、LVS的调度算法

  1、静态调度算法

    rr: 轮叫,轮询

    wrr: 加权轮叫

    sh: sourch hash,源地址hash session 绑定到同一主机上

    dh: destination hash 目的地址hash session 通过目的地址来绑定到同一主机上。

  2、动态调度算法

    lc: least-connect 最少连接 active * 256 + inactive 谁的小,挑谁

    wlc: 加权最少连接,( active * 256 + inactive ) / weight 

    sed: 最少期望延迟 (active + 1 ) * 256 / weight 

    nq: never queue 永不排队,改进的sed

    LBLC: 基于本地的最少连接

    LBLCR: 基于本地的带复制功能的最少连接

  LVS默认的调度算法是wlc


五、LVS的ipvadm命令的使用

  安装:

    在redhat/centos 6系统中:yum install ipvsadm -y 

  ipvsadm命令的使用:

    1、管理集群服务

      添加或修改:

    ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask]

        -A: 添加

        -E:修改

        -t: tcp

        -u: udp

        -f: FirewallMark FWM 防火墙标记。service-address: Mark Number

        service-address:VIP:PORT 使用VIP和端口号

        -s: 调度算法

        -p: 后跟超时时间,在支持链接时使用,默认300s 单位是:秒

        -M: 指定子网掩码,默认是255.255.255.255

      删除:

        ipvsadm -D -t|u|f service-address

        -D:删除

        -t: tcp

        -u: udp

        -f: FirewallMark FWM 防火墙标记。service-address: Mark Number

        service-address:VIP:PORT 使用VIP和端口号

      保存规则:

        ipvsadm -S > /path/to/somefile 

      重载规则:

        ipvadm -R < /path/to/somefile

      清除规则:

        ipvsadm -C


      示例如下:

        ipvadm -A -t 192.168.1.10:80 -s rr 

        #添加一个规则,指定的-t tcp协议,使用192.168.1.10 为VIP 端口为80 -s指定为rr 也就是轮询。


    2、管理集群服务中后端的real server

      添加或修改:

        ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

        -a: 添加

        -e: 修改

        -t: tcp

        -u: udp

        -f: FirewallMark FWM 防火墙标记。service-address: Mark Number

        service-address: 此前添加的的service-address: VIP:PORT

        -r: 指定后端real server 

        server-address: RIP:PORT

        -g: DR模型

        -i: TUN模型

        -m: NAT模型

        -w: 指定权重

      删除:

        ipvsadm -d -t|u|f service-address -r server-address

        -d:删除 

      示例如下:

        ipvsadm -a -t 192.168.1.10:80 -r 192.168.1.9:80 -g -w 3

        ipvsadm -a -t 192.168.1.10:80 -r 192.168.1.8:80 -g -w 5

        #定义了两个后端server 并指定为DR模型和各个服务器的权重

    3、查看规则

        ipvsadm -L -n

        ipvsadm -L -n -c 查看当前连接信息


六、LVS的持久连接

  无论使用什么算法,LVS持久都能实现在一定时间内,将来自同一个客户端请求派发至此前选定的后端服务器即RS。Real Server。

  LVS 持久连接模板(内存缓冲区):每一个客户端分配给它的RS的映射关系;

    ipvsadm -A|E ... -p timeout:

        timeout: 持久连接时长,默认300秒;单位是秒;

  应用场景如:在基于SSL,需要用到持久连接;后端服务器有session应用时,比较用户登录,这时多个后端服务器session共享问题无法解决时,需要持久连接到同一个后端服务器。

  三种持久连接:

    1、PPC:将来自于同一个客户端对同一个集群服务的请求,始终定向至此前选定的RS;     持久端口连接

      ipvsadm -A -t 192.168.1.10:23 -s rr -p 600 

      ipvsadm -a -t 192.168.1.10:23 -r 192.168.1.9:23 -g -w 2

      ipvsadm -a -t 192.168.1.10:23 -r 192.168.1.8:23 -g -w 5

        #注:此时的权重没有作用了。

    2、PCC:将来自于同一个客户端对所有端口的请求,始终定向至此前选定的RS;           持久客户端连接

    把所有端口统统定义为集群服务,一律向RS转发;

      ipvsadm -C

      ipvsadm -A -t 192.168.1.10:0 -s rr -p 600

      ipvsadm -a -t 192.168.1.10:0 -r 192.168.1.9 -g -w 2

      ipvsadm -a -t 192.168.1.10:0 -r 192.168.1.8 -g -w 5

      此时后端服务器的所有端口都可以转发了,并绑定到同一个后端服务器上。


    3、PNMPP:持久防火墙标记连接

      把多个端口持久连接到后端同一台服务器上,此前两种方法都无法做到。

      防火墙标记,可以做到把多个端口定义为同一个标记数(1-99) 把标记号进行转发到后端即可。

      方法如下:

        如把80和23端口标记为8

        在PREROUTING链上标记:

        操作如下:

            iptables规则:

                iptables -t mangle -A PREROUTING -d 192.168.1.10 -i eth0 -p tcp --dport 80 -j MARK --set-mark 8

                iptables -t mangle -A PREROUTING -d 192.168.1.10 -i eth0 -p tcp --dport 23 -j MARK --set-mark 8

                #使用的-d 后面是VIP地址

            添加LVS规则:

                ipvsadm -A -f 8 -s rr -p 600

                ipvsadm -a -f 8 -r 192.168.1.9 -g -w 2

                ipvsadm -a -f 8 -r 192.168.1.8 -g -w 5

        此时应当实现了之前的把多个端口定位到此前所选定的后端同一台服务器上。



以上就是LVS的基于概念和ipvsadm命令基本使用详情。如有批漏请各位指出,多谢关注。

下一篇会有三个脚本来实现LVS在负载均衡端和Real Server的设置,其中有一个脚本来提供后端Real Server健康状态检测,并自动添加恢复后的Real Server服务器。