LVS的认识和使用

此文摘自http://www.cnblogs.com/f-ck-need-u/p/7576137.html

1.LVS简介

1.负载均衡概念的理解

网站架构中,负载均衡技术是实现网站架构伸缩性的主要手段之一。所谓"伸缩性",是指可以不断向集群中添加新的服务器来提升性能、缓解不断增加的并发用户访问压力。通俗地讲,就是一头牛拉不动时,就用两头、三头、更多头牛来拉。

负载均衡有好几种方式:http URL重定向、DNS的A记录负载均衡、反向代理负载均衡、IP负载均衡和链路层负载。本文所述为LVS,它的VS/NAT和VS/TUN模式是IP负载均衡的优秀代表,而它的VS/DR模式则是链路层负载均衡的优秀代表。

2.lvs简介

LVS中文官方手册:http://www.linuxvirtualserver.org/zh/index.html。这个手册对于了解lvs的背景知识很有帮助。

LVS英文官方手册:http://www.linuxvirtualserver.org/Documents.html。这个手册比较全面,对于了解和学习lvs的原理、配置很有帮助。

LVS是章文嵩开发的一个国产开源负载均衡软件。LVS最初是他在大学期间的玩具,随着后来使用的用户越来越多,LVS也越来越完善,最终集成到了Linux的内核中。有不少开源牛人都为LVS开发过辅助工具和辅助组件,最出名的就是Alexandre为LVS编写的Keepalived,它最初专门用于监控LVS,后来加入了通过VRRP实现高可用的功能。

LVS的全称是Linux virtual server,即Linux虚拟服务器。之所以是虚拟服务器,是因为LVS自身是个负载均衡器(director),不直接处理请求,而是将请求转发至位于它后端真正的服务器realserver上。

LVS是四层(传输层tcp/udp)、七层(应用层)的负载均衡工具,只不过大众一般都使用它的四层负载均衡功能ipvs,而七层的内容分发负载工具ktcpvs(kernel tcp virtual server)不怎么完善,使用的人并不多。

ipvs是集成在内核中的框架,可以通过用户空间的程序ipvsadm工具来管理,该工具可以定义一些规则来管理内核中的ipvs。就像iptables和netfilter的关系一样

 

2.LVS集群的3种常见工作模式介绍对比与原理讲解

为了方便大家探讨LVS技术,LVS社区提供了一个命名的约定,内容如下表:

 

 LVS的三种工作模式:通过网络地址转换(NAT)将一组服务器构成一个高性能的、高可用的虚拟服务器,是VS/NAT技术。在分析VS/NAT的缺点和网络服务的非对称性的基础上,提出了通过IP隧道实现虚拟服务器的方法VS/TUN(Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性。

1.VS/NAT模式-网络地址转换<==收费站模式(了解即可)

Virtual Server via Network Address Translation(VS/NAT)

调度时:目的IP改成RIP(DNAT)
返回时:源IP改成VIP(SNAT)

原理图如下:

 

 

NAT模式特点小结:

  1. NAT技术将请求的报文(DNAT)和响应的报文(SNAT),通过调度器地址重写然后在转发发给内部的服务器,报文返回时在改写成原来的用户请求的地址。
  2. 只需要在调度器LB上配置WAN公网IP即可,调度器也要有私有LAN IP和内部RS节点通信。
  3. 每台内部RS节点的网关地址,必须要配成调度器LB的私有LAN内物理网卡地址(LDIP),这样才能确保数据报文返回时仍然经过调度器LB。
  4. 由于请求与响应的数据报文都经过调度器LB,因此,网站访问量大时调度器LB有较大瓶颈,一般要求最多10-20台节点。
  5. NAT模式支持对IP及端口的转换,即用户请求10.0.0.1:80,可以通过调度器转换到RS节点的10.0.0.2:8080(DR和TUN模式不具备的
  6. 所有NAT内部RS节点只需要配置私有LAN IP即可。
  7. 由于数据包来回都需要经过调度器,因此,要开启内核转发net.ipv4.ip_forward=1,当然也包括iptables防火墙的forward功能DR和TUN模式不需要)。

 2.VS/TUN模式-(了解即可)

采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求报文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务响应报文比请求报文大许多,采用VS/TUN技术后,调度器得到极大的解放,集群系统的最大吞吐量可以提高10倍。

 

 

VS/TUN模式的工作原理:

  • (1)IP隧道技术又称为IP封装技术,它可以将带有源和目标IP地址的数据报文使用新的源和目标IP进行第二次封装,这样这个报文就可以发送到一个指定的目标主机上;
  • (2)VS/TUN模式下,调度器和后端服务器组之间使用IP隧道技术。当客户端发送的请求(CIP-->VIP)被director接收后,director修改该报文,加上IP隧道两端的IP地址作为新的源和目标地址,并将请求转发给后端被选中的一个目标;
  • (3)当后端服务器接收到报文后,首先解封报文得到原有的CIP-->VIP,该后端服务器发现自身的tun接口上配置了VIP,因此接受该数据包。
  • (4)当请求处理完成后,结果将不会重新交给director,而是直接返回给客户端。此时响应数据包的源IP为VIP,目标IP为CIP。

 

TUN模式特点小结:

  1. 负载均衡器通过把请求的报文通过IP隧道的方式转发至真实服务器,而真实服务器将响应处理后直接返回给客户端用户。
  2. 由于真实服务器将响应处理后的报文直接返回给客户端用户,因此,最好RS有一个外网IP地址,这样效率才会更高。理论上:只要能出网即可,无需外网IP地址。
  3. 由于调度器LB只处理入站请求的报文。因此,此集群系统的吞吐量可以提高10倍以上,但隧道模式也会带来一定得系统开销。TUN模式适合LAN/WAN。
  4. TUN模式的LAN环境转发不如DR模式效率高,而且还要考虑系统对IP隧道的支持问题。
  5. 所有的RS服务器都要绑定VIP,抑制ARP,配置复杂。
  6. LAN环境一般多采用DR模式,WAN环境可以用TUN模式,但是当前在WAN环境下,请求转发更多的被haproxy/nginx/DNS调度等代理取代。因此,TUN模式在国内公司实际应用的已经很少。跨机房应用要么拉光纤成局域网,要么DNS调度,底层数据还得同步。
  7. 直接对外的访问业务,例如:Web服务做RS节点,最好用公网IP地址。不直接对外的业务,例如:MySQL,存储系统RS节点,最好用内部IP地址。

3.DR模式-直接路由模式(重点)

VS/DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器将响应后的处理结果直接返回给客户端用户。同VS/TUN技术一样,VS/DR技术可极大地提高集群系统的伸缩性。而且,这种DR模式没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器LB与正式服务器RS节点都有一块网卡连在同一物理网段上,即必须在同一个局域网环境。

 

 

VS/DR模式的工作原理:

  • (1)客户端发送的请求被director接收后,director根据负载均衡算法,改写数据帧的目标MAC地址为后端某RS的MAC地址,并将该数据包转发给该RS(实际上是往整个局域网发送,但只有该MAC地址的RS才不会丢弃)。
  • (2)RS接收到数据包后,发现数据包的目标IP地址为VIP,而RS本身已经将VIP配置在了某个接口上,因此RS会接收下这个数据包并进行处理。
  • (3)处理完毕后,RS直接将响应报文响应给客户端。此时数据包源IP为VIP,目标IP为CIP。

采用VS/DR模式时的基本属性和要求:

  1. RealServer的RIP和director的DIP必须处于同一网段中,以便使用MAC地址进行通信。
  2. realserver上必须配置VIP地址,以便接收director转发过来的数据包,以及作为响应报文的源IP。
  3. realsever响应给客户端的数据包的源和目标IP为VIP-->CIP。
  4. director只处理入站请求,响应请求由realserver完成。

 

4.lvs-ipvs的三种模式比较

三种模式的比较如图所示:

在性能上,VS/DR和VS/TUN远高于VS/NAT,因为调度器只处于从客户到服务器的半连接中,按照半连接的TCP有限状态机进行状态迁移,极大程度上减轻了调度器的压力(真正建立TCP连接的是RS和Client)。VS/DR性能又稍高于VS/TUN,因为少了隧道的开销。但是,VS/DR和VS/TUN的主要区别是VS/TUN可以跨网络实现后端服务器负载均衡(也可以局域网内),而VS/DR只能和director在局域网内进行负载均衡。

3.LVS负载均衡的调度算法

    • LVS的调度算法决定了如何在集群节点之间分布工作负荷。
    • 当Director调度器收到来自客户端计算机访问它的VIP上的集群服务的入站请求时,Director调度器必须决定哪个集群节点应该处理请求。Director调度器可用于做出该决定的调度方法分成两个基本类别:
      静态调度方法:rr,wrr,dh,sh
      动态调度算法:wlc,lc,lblc,lblcr,SED,NQ

10种调度算法见如下表格(rr,wrr,wlc重点):

算法说明
rr 轮循调度,它将请求依次分配不同的RS节点,也就是在RS节点中均摊请求。这种算法简单,但是只适合于RS节点处理性能相差不大的情况
wrr 权重轮循,它将依据不同RS节点的权值分配任务。权值较高的RS将优先获得任务,并且分配到的连接数将比权值较低的RS节点更多。相同权值的RS得到相同数目的连接数
dh 目标地址哈希,对于同一目标IP的请求总是发往同一服务器
sh 源地址哈希,在一定时间内,只要是来自同一个客户端的请求,就发送至同一个realserver
wlc 加权最小连接数调度,实际连接数除以权值,最小的RS作为分配的RS
lc 调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某服务器,其连接数加1;当连接中止或超时,其连接数减1。当各个服务器的处理能力不同时,该算法不理想。
lblc 基于地址的最小连接数调度,将来自同一目的地址的请求分配给同一台RS节点,目前该算法主要用于cache(缓存)集群系统。
lblcr 基于地址带重复最小连接数调度。(略)
SED 最短的期望的延迟(不成熟)
NQ 最小队列调度(不成熟)

 

4.LVS安装和简单管理(ipvsadm)

LVS全称为Linux Virtual Server,工作在ISO模型中的第四层,由于其工作在第四层因此与iptables类似,必须工作在内核空间上。因此lvs与iptables一样,是直接工作在内核中的,叫ipvs,主流linux发行版默认都已经集成了ipvs,因此用户只需安装一个管理工具ipvsadm即可, ipvsadm是LVS在应用层的管理命令,可以通过这个命令去管理LVS的配置。

1.安装LVS命令

#先安装依赖
[root@centos7 ~]# yum install -y libnl* popt*
#开始执行安装
[root@centos7 ~]# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz -P /tmp
[root@centos7 ~]# cd /tmp/
[root@centos7 tmp]# tar -zxvf ipvsadm-1.26.tar.gz
[root@centos7 ipvsadm-1.26]# make && make install
#编译安装完之后,会在/etc/init.d/ (CentOS6)或/usr/lib/systemd/system/ (CentOS7)目录下自动生成ipvsadm服务管理脚本,这和一般的编译不一样,比较人性化。
也可以不通过上面的方法,直接通过yum install ipvsadm -y直接进行安装。
[root@centos7 ipvsadm
-1.26]# ipvsadm IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn #出现这个内容就表示LVS已经安装好,并加载到了内核 [root@centos7 ipvsadm-1.26]# lsmod | grep ip_vs ip_vs 145497 0 nf_conntrack 133095 7 ip_vs,nf_nat,nf_nat_ipv4,nf_nat_ipv6,xt_conntrack,nf_conntrack_ipv4,nf_conntrack_ipv6 libcrc32c 12644 4 xfs,ip_vs,nf_nat,nf_conntrack

 

2.ipvsadm语法

使用ipvsadm --help可以查看使用方法。ipvs的更多功能以及ipvsadm的更详细用法,请man ipvsadm

ipvsadm的选项中,大写选项管理虚拟服务virtual service小写选项管理关联了虚拟服务的真实服务器RealServer"-L""-l"除外,它们同义。
(1).管理virtual services(虚拟服务器):
    添加:-A  -t|u|f service-address [-s scheduler]
            -t:tcp协议的集群
            -u:udp协议的集群
                service-address格式为IP:PORT
            -f:firewall-mark防火墙标记
                service-address:a num for mark
            -s:调度算法
    修改:-E -t|u|f service-address [-s scheduler]     和-A使用方法一样
    删除:-D -t|u|f service-address
示例:
下面示例表示,通过-A选项,在内核的虚拟服务器表中添加一条新的虚拟服务器记录,也就是添加一个需要被负载均衡的虚拟地址,这里的虚拟地址是172.16.10.20,然后通过-s选项指定调度算法是轮询rr。(通俗就是以后访问172.16.10.20的80端口的请求都会被轮询到后端真实服务器上)
# ipvsadm -A -t 172.16.10.20:80 -s rr   (对外的地址,也就是VIP)

(2).管理virtual service中的RealServer(真实服务器):
    添加:-a  -t|u|f service-address -r server-address [-g|i|m] [-w weight]
        -t|u|f service-address:指定Real server所绑定的virtual service
        -r server-address:某RS地址,在NAT模型中,可IP:PORT实现端口映射,即端口无需等于VIP对应的port
        -g|i|m:指定lvs的类型,有三种:
            -g:gataway即DR类型(默认的模型)
            -i:--ipip,即TUN类型
            -m:masquerade地址伪装即NAT
        -w:指定权重(需要调度算法支持权重)
    修改:-e和-a用法一样
    删除:-d  -t|u|f service-address -r server-address表示从哪个virtual service中删除哪个realserver
示例:
下面示例的意思表示通过-a选项为虚拟服务添加真实的后端服务器记录,通过-t参数表示为哪个虚拟服务器添加记录,-r参数表示指定真实的后端服务器,-m指定lvs的类型为NAT模式。
# ipvsadm -a -t 172.16.10.20:80 -r 192.168.100.9 -m
# ipvsadm -a -t 172.16.10.20:80 -r 192.168.100.10 -m 

(3).查看-L或者-l:列出状态信息,配合以下选项用于显示更精确数据
        -n:只显示数字格式,不反解IP地址和端口
        --stats:显示统计信息
        --rate:显示速率信息(每秒的值)
        --timeout:显示tcp/tcpfin/udp的会话超时时间长度
        --daemon:显示进程状态和多播端口(不太用)
        --sort:对-n列出来的进行排序(按协议、IP、端口号升序排序)
        -c:显示当前ipvs的连接状况(不能和stats选项同用)

(4).其他项-Z:清空统计数据
-C:删除一个或所有virtual service,连同与之绑定的real server也删除
-S:保存规则  ipvsadm -S > /path/to/somefile 或者使用ipvsadm-save > /path/to/somefile
-R:载入规则  ipvsadm -R < /path/to/somefile 或者使用ipvsadm-restore < /path/to/somefile
    service ipvsadm save
    service ipvsadm restore

具体可以参考下图

 

 

3.

 

4.实现VS/NAT模式的负载均衡

实验环境结构图如下

 

 其中:
CIP:192.168.146.62
VIP:192.168.146.128
DIP:192.168.100.17
RIP1:192.168.100.39
RIP2:192.168.100.23

在开始操作前,先回顾下VS/NAT模式的相关内容:

请求过程:CIP-->VIP--ip_forward-->DIP-->RIP
响应过程:RIP-->DIP--ip_forward-->VIP-->CIP

由于director(调度器)接收到CIP发送的数据包后,需要转发给Real Server进行处理,但Real Server的RIP和DIP是同一网段的,因此Director必须将VIP接口上收到的数据包转发给DIP,也就是说Director需要开启ip_forward功能

当RS处理完成后,响应数据需要先转发给Director,但因为响应数据的目标地址为CIP,因此需要将RS的网关指向Director的DIP,这样CIP目的的数据包才能保证交给director进行处理并返回给客户端。

因此,如下操作Director(调度器):假设该实验中的VS/NAT采用wrr调度算法。

#首先我们需要在调度器上安装好lvs的管理命令,安装过程这里就不演示了
[root@centos7 ~]# echo 1 >/proc/sys/net/ipv4/ip_forward
[root@centos7 ~]# ipvsadm -A -t 192.168.146.128:80 -s wrr
[root@centos7 ~]# ipvsadm -a -t 192.168.146.128:80 -r 172.168.66.64 -m -w 2
[root@centos7 ~]# ipvsadm -a -t 192.168.146.128:80 -r 172.168.66.65 -m -w 3

如下操作各RS

#下面操作所有后端真实节点都操作
[root@centos7 ~]# yum -y install httpd
#下面的在RS1上操作
[root@centos7 ~]# echo "from RS1:172.168.66.64" >/var/www/html/index.html
#下面的在RS2上操作
[root@centos7 ~]# echo "from RS2:172.168.66.65" >/var/www/html/index.html
#下面操作所有后端真实节点都操作
[root@centos7 ~]# service httpd start
#下面的地址是DIP的地址
[root@centos7 ~]# route add default gw 172.168.66.63

然后在客户端的浏览器上输入http://192.168.146.128进行测试,同时测试调度算法的比例。可以使用下面的命令查看统计数据:

[root@centos7 ~]# 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.146.128:80 wrr
  -> 172.168.66.64:80             Masq    2      1          11        
  -> 172.168.66.65:80             Masq    3      0          17
[root@centos7 ~]# ipvsadm -ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  192.168.146.128:80                 43      282      192    35681    24724
  -> 172.168.66.64:80                   17      111       76    13789     9462
  -> 172.168.66.65:80                   26      171      116    21892    15262
  
注意点:
(1).建议不要使用win7/win8/win10作为客户端进行测试,而是使用win server类系统或直接使用unix系统测试。
(2).调度算法是对连接进行调度而不是对数据包、字节等调度,因此查看统计数据时,应该比较的是Conns列的比例。另外,
如果连接数大致满足比例,但数据包或者字节数却远不符合比例(高的多或低的多),那么可能对应的那台RS主机性能比其它RS的性能要好或差。

实验完成后,可以通过下面的命令,删除Director上的virtual service,并重新设置RS上的默认路由。

#这个命令在调度器上执行,清除所有ipvs规则
[root@centos7 ~]# ipvsadm -C
#下面命令在后端所有真实节点执行
[root@centos7 ~]# route del default gw 172.168.66.63

 5.

 

posted @ 2021-03-15 22:22  清白之年980410  阅读(484)  评论(0编辑  收藏  举报