LVS理论知识

LVS全称Linux Virtual Server(Linux虚拟服务器),它是章文嵩博士(前淘宝基础核心软件研发负责人,现任滴滴高级副总裁)主持的开源软件项目,LVS的发展过程其实对整个Linux的发展有很大的影响,x86架构的Linux之所以能取代Unix小型机,很大一部分原因就是Linux Cluster和x86PC组合起来就是所谓的既便宜又稳定,外加强大的代名词。而作为Linux Cluster核心组件之一的LVS(当然软件前端负载均衡器还有HAproxy,Nginx),对Linux的发展的有着不可磨灭的作用。是企业架构从Unix高端机走向Linux Cluster+x86PC的强有力的推动者

LVS里面有两个组件:

结合了Netfilter的代码,是input链上面一个能根据用户定义转发数据报文的一种应用。

编写调度规则的应用,相当于iptables,它书写的规则都会由ipvs实现

ipvs和ipvsadm,它们的关系相当于netfilter和iptables 的关系一样,一个负责书写命令,一个负责实现命令。

LVS工作在ISO网络模型中的第四层,报文的IP:port来决定是否转发,因为其工作在第四层,而且是在Netfilter的input链上,所以报文未进入用户空间之前就会被转发,所以其吞吐量极大,一般实力不弱的公司会选择前端使用LVS进行调度,LVS后面再跟7层调度器HAproxy或者Nginx再进行二次调度。

LVS的工作模式 先上架构图:

主要组成部分:

Load balancer是整个集群的重中之重,所以Load balancer必须不能出问题,那这需要就是冗余来实现了,也就是所谓的高可用,保证服务的高可用,前端Load balancer会由一主一备或者一主多备组成,它们之间由heartbeat连接,平时都是主的工作,向外展示的都是一台Director。当从的感觉不到主的心跳信息之后,就会自动转换成主的(把VIP和DIP抢过来)。当然真正的实现机制不是这么简单,这里只是初略的谈一下。

工作原理:

Director会根据请求报文的目标IP和目标端口来判断是否转发,现实这个功能的是ipvs,它运行在Netfilter的INPUT链上(至于为什么不运行在PROROUTEING链上面,我也不知),根据算法将需要转发的请求发往不同Real Server。

工作模式:

LVS-NAT 通过NAT实现LVS

整个集群的所有请求都会先到达VIP,由Director根据指定的算法进行调度。报文从DIP转发给Real Server,Real Server就会进行处理,然后构建响应报文,返回给Client。报文经过Director,Director就会进行NAT转换,将源IP转换成VIP,这样一来。Client就会以为自己是在和VIP进行通信,上面的架构图就是典型的LVS-NAT

  • 优点: Real Server可以是任何支持TCP/IP协议的OS
  • 缺点: 请求和响应的数据报文都经过Director,一般Internet服务请求报文都很小,而响应报文都会比较大。这样一来集群稍微大一点,Director就会成为集群瓶颈。一般说来后端有10台-20台Real Server,Director就会调度不过来。

LVS-FULLNET

借助NAT实现跨网段LVS,请求到达Director,Director会将其转发给在公网上面的Real Server,然后Real Server会将响应报文返回给Director,由Director转发给Client,将上面架构图中Switch

跨网段

Director和Real Server在不同网络,至少我是想不到应用场景

LVS-TUN 使用IP隧道实现LVS

既然LVS-NAT中响应报文由Director转发是个问题,LVS-TUN就解决了这个问题,请求报文由Director调度,响应报文不经过Director。Director通过IP隧道将请求报文封装并转发给Real Server,后端Real Server会自己转发出去

响应报文无需经过Director,开销大大降低,可用用来构建超高性能集群

必须要OS支持IP Tunneling或者IP Encapsulation 对公网IP需求比较大,RIP、DIP、VIP都得是公网地址

LVS-DR 通过直接路由实现LVS

和LVS—TUN不同的是,LVS-DR不需要IP-Tunneling的支持和开销,Client向VIP发起服务请求,数据包到达VIP所在网段,因为Real Server中VIP不会响应ARP广播,所以Switch只会知道Director的MAC地址和VIP对应,所以报文就会发给Director,Director会通过算法算出这个请求包应该转发给哪个Real Server。当算出来之后,Director就会将目标MAC地址改成Real Server的MAC地址,然后交给交换机转发,交换机发给Real Server。由Real Server中的VIP接收,构建响应报文之后,也是由VIP作为源IP。直接发给网关。这一来Client就会接收到源地址为VIP的响应报文

支持大多数操作系统

拓展型极佳,几乎没有瓶颈,如果有,也基本上是出现在网络上面,很多超大型集群都是用LVS-DR作为总负载调度器,HAproxy和Nginx作为分业务负载调度器。

物理设备要有一张网卡位于同一网络(其实也算不上缺点)

主要在使用的基本就是LVS-NAT和LVS-DR,具体点就是基本上都是LVS-DR模型

调度算法:Schequling Method

LVS的性能不仅仅由模式决定,还由算法决定,采用哪种算法将决定整个系统负载均衡的表现,不同的算法有不同的应用场景,根据自己的需求进行选择

静态算法:仅根据算法本身进行调度,不考虑Real Server的即时状态

rr:Round Robin 轮询

方法:每一次把来自用户的请求轮流分配给内部中的服务器
优缺点:服务器性能可能不同,有的Real Server可能已经支撑不住了,有的Real Server性能还很充裕

wrr:Weighted RR 权重轮询

方法:根据Real Server的性能不同,可以设置其权重,这样调度到不同的Real Server上面的请求比例基本就是其权重之比了
优缺点:解决了服务器性能不同的问题,性能好的话权重可以设置的时候设置高一点,虽说解决了服务器性能不同问题,但是不同的请求其请求的资源也不同,
可能有的机器上面都是一些文本请求,有的机器上面来了很多图片请求。这样一来还是不会平静,而且还有Session问题  

sh:source hashing   源地址hash

方法:在这种算法下每一次请求到达Director都会将ClientIP RealServerIP纪录下来,这样下次这个ClinetIP的请求到达了,
且对应的Real Server是可用且为超负荷的,那么就会将这个请求转发到对应Real Server,否则返回空
优缺点:主要用来实现实现session持久机制,还是没有考虑到Real Server本身负载

dh:destination hashing 目标地址hash

方法:和sh基本相同。只是把ClientIP和RealServerIP换了一下位置。
优缺点:用来实现前端有多个防火墙的时候。同一连接永远只经过同一防火墙,还是没有考虑到后端负载

动态算法:根据算法及RS当前的复制状态

lc:Least Connection 最少连接

计算当前的负载Overhead=Active\*256+Inactive来实现
Active:TCP活动连接
Inactive:TCP非活动连接                   

wlc:Weighted LC

Overhead=(Active\*256+Inactive)/weight
有的时候服务器性能差距很大,但是是刚开始运行,所以没有连接数,Active为0
这样一来其负载都为0,导致算法被临时改成轮询。

sed:Shortest Expect Delay  最短期望延迟(改进版的wlc)

Overhead=(Active+1)\*256/weight 
当Active=0的时候也会是性能好的服务器多承担请求

aq:Nerver Queus: 永不排队 (改进的sed)

sed算出负载,然后按负载由小到大rr(轮询),第一遍过完
sed算出负载。。。。
sed。。
。。。    

后端为chche的时候。

lblc:Locality-based least connection 基于本地的最少连接相当于dh+lc

针对目标IP的算法,请求到达的时候,根据ClinetIP将其调度到其最近使用的服务器上面。要是对应服务器超载,就会用“最少连接”算法再找出一台服务器  

lblcr: Replicated and Locality-based least connection 基于复制的基于本地的最少连接

与lblc不同的是,它要维护的是一个ClientIP到一组Real Server的映射。该算法根据ClientIP找出其最近使用的Real Server组,然后在Real Server组中使用"最少连接"挑选出一台服务器

ipvsadm

修改集群

-A:添加一个集群服务
    -t:tcp
    -u:udp
    -f: firewall make 通常应用于将两个或以上的服务绑定为一个服务进行处理时使用
    service-address
      -t IP:port
      -u ip:port
      -f firewall_mark
    -s 调度算法,默认为wlc
    -p: timeout persistent connection 持久连接
-E:修改定义过的集群服务
-D -t|u|f service-address:删除指定的集群服务

修改Real Server

    -a:向指定的CS中添加RS
        -t|-u|-f service-address:指明将RS添加至那个Cluster Service 中
        -r:指定RS,可以包含{IP[:port]},只有支持端口映射的LVS类型才允许此处使用跟集群服务中不同的端口
        lvs类型:
            -g:Gateway,DR
            -i:ipip,TUN
            -m:masquerade(地址伪装),NAT
            默认为DR
        指定RS权重
            -w
        上限下限:
         -x:下限
         -y:上限
    -e:修改指定的RS属性
    -d  -t|u|f  service-address  -r  server-address:在指定的集群服务中删除一个指定的RS情况所有的集群服务:
    -C

保存规则(使用输出重定向):

    ipvsadm-save
    ipvaadm -S

载入指定的规则:(使用输入重定向)

     ipvsadmin-restore
     ipvasdm -R

查看ipvs规则等

    -L [options]
        -n 使用数字格式显示IP地址,不反解
        -c:查看连接数相关信息
        --stats:显示统计数据
        --rate:数据传输速率
        --timeout:显示tcp会话时长
        --daemon:守护进程的信息
        --sort:对虚拟服务进行排序,默认为升序
        --exact:精确显示,不做单位换算
-Z:计数器清零