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模式特点小结:
- NAT技术将请求的报文(DNAT)和响应的报文(SNAT),通过调度器地址重写然后在转发发给内部的服务器,报文返回时在改写成原来的用户请求的地址。
- 只需要在调度器LB上配置WAN公网IP即可,调度器也要有私有LAN IP和内部RS节点通信。
- 每台内部RS节点的网关地址,必须要配成调度器LB的私有LAN内物理网卡地址(LDIP),这样才能确保数据报文返回时仍然经过调度器LB。
- 由于请求与响应的数据报文都经过调度器LB,因此,网站访问量大时调度器LB有较大瓶颈,一般要求最多10-20台节点。
- NAT模式支持对IP及端口的转换,即用户请求10.0.0.1:80,可以通过调度器转换到RS节点的10.0.0.2:8080(DR和TUN模式不具备的)
- 所有NAT内部RS节点只需要配置私有LAN IP即可。
- 由于数据包来回都需要经过调度器,因此,要开启内核转发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模式特点小结:
- 负载均衡器通过把请求的报文通过IP隧道的方式转发至真实服务器,而真实服务器将响应处理后直接返回给客户端用户。
- 由于真实服务器将响应处理后的报文直接返回给客户端用户,因此,最好RS有一个外网IP地址,这样效率才会更高。理论上:只要能出网即可,无需外网IP地址。
- 由于调度器LB只处理入站请求的报文。因此,此集群系统的吞吐量可以提高10倍以上,但隧道模式也会带来一定得系统开销。TUN模式适合LAN/WAN。
- TUN模式的LAN环境转发不如DR模式效率高,而且还要考虑系统对IP隧道的支持问题。
- 所有的RS服务器都要绑定VIP,抑制ARP,配置复杂。
- LAN环境一般多采用DR模式,WAN环境可以用TUN模式,但是当前在WAN环境下,请求转发更多的被haproxy/nginx/DNS调度等代理取代。因此,TUN模式在国内公司实际应用的已经很少。跨机房应用要么拉光纤成局域网,要么DNS调度,底层数据还得同步。
- 直接对外的访问业务,例如: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模式时的基本属性和要求:
- RealServer的RIP和director的DIP必须处于同一网段中,以便使用MAC地址进行通信。
- realserver上必须配置VIP地址,以便接收director转发过来的数据包,以及作为响应报文的源IP。
- realsever响应给客户端的数据包的源和目标IP为VIP-->CIP。
- 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.