LVS功能详解
-
LVS(Linux Virtual Server)介绍
LVS是Linux Virtual Server 的简写(也叫做IPVS),意即Linux虚拟服务器,是一个虚拟的服务器集群系统,可以在UNIX/LINUX平台下实现负载均衡集群功能。
LVS四层负载均衡,在传输层和网络层(IP)实现,因此不能实现nginx反向代理location功能。
LVS最大支持并发达30万左右,nginx最大并发大1万左右。
LVS四层负载均衡比nginx七层反向代理更有效率,但无法做到细致的划分。 -
企业网站LVS集群架构图
CDN是什么?
谈到CDN的作用,可以用8年买火车票的经历来形象比喻:
8年前,还没有火车票代售点一说,12306.cn更是无从说起。那时候火车票还只能在火车站的售票大厅购买,而我所住的小县城并不通火车,火车票都要去市里的火车站购买,而从县城到市里,来回就是4个小时车程,简直就是浪费生命。后来就好了,小县城里出现了火车票代售点,可以直接在代售点购买火车,方便了不少,全市人民再也不用在一个点苦逼的排队买票了。
CDN就可以理解为分布在每个县城的火车票代售点,用户在浏览网站的时候,CDN会选择一个离用户最近的CDN边缘节点来响应用户的请求,这样海南移动用户的请求就不会千里迢迢跑到北京电信机房的服务器(假设源站部署在北京电信机房)上了。
CDN的优势很明显:
(1)CDN节点解决了跨运营商和跨地域访问的问题,访问延时大大降低;
(2)大部分请求在CDN边缘节点完成,CDN起到了分流作用,减轻了源站的负载。
交换机连接同一网段,用户通过网关DNAT连接到外网交换机,外网交换机连接LVS负载均衡组的外网网卡;
LVS负载均衡组有两个网卡,处于不同网段;
LVS负载均衡组的内网网卡与内网交换机处于相同网段,内网交换机连接MySQL服务器组等。
-
IPVS软件工作层次图
从上图我们看出,LVS负载均衡调度技术是在Linux内核中实现的,因此,被称之为Linux虚拟服务器(Linux Virtual Server)。我们使用该软件配置LVS时候,不能直接配置内核中的ipbs,而需要使用ipvs管理工具ipvsadm进行管理,或者通过Keepalived软件直接管理ipvs。
-
LVS体系结构与工作原理简单描述
LVS集群负载均衡器接受服务的所有入站客户端计算机请求,并根据调度算法决定哪个集群节点应该处理回复请求。负载均衡器(简称LB)有时也被称为LVS Director(简称Director)。 LVS虚拟服务器的体系结构如下图所示,一组服务器通过高速的局域网或者地理分布的广域网相互连接,在他们的前端有一个负载调度器(Load Balancer)。 负载调度器能无缝地将网络请求调度到真实服务器上,从而使得服务器集群的结构对客户是透明的,客户访问集群系统提供的网络服务就像访问一台高性能,高可用的服务器一样。客户程序不受服务器集群的影响不需要作任何修改。系统的伸缩性通过在服务集群中透明地加入和删除一个节点来达到,通过检测节点或服务进程故障和正确地重置系统达到高可用性。由于我们的负载调度技术是在Linux内核中实现的,我们称之为Linux虚拟服务器(Linux Virtual Server)。
-
LVS 基本工作过程图
防火墙直接DNAT到LVS,不是Web服务器
LVS基本工作过程如下图所示:
为了方便大家探讨LVS技术,LVS社区提供了一个命名的约定,内容如下表:
名称 | 缩写 | 说明 |
---|---|---|
虚拟IP | VIP | VIP为Director用于向客户端计算机提供服务的IP地址。比如:www.yunjisuan.com域名就要解析到vip上提供服务 |
真实IP地址 | RIP | 在集群下面节点上使用的IP地址,物理IP地址 |
Dirctor的IP地址 | DIP | Director用于连接内外网络的IP地址,物理网卡上的IP地址。是负载均衡器上的IP |
客户端主机IP地址 | CIP | 客户端用户计算机请求集群服务器的IP地址,该地址用 |
LVS集群内部的节点称为真实服务器(Real Server),也叫做集群节点。请求集群服务的计算机称为客户端计算机。 与计算机通常在网上交换数据包的方式相同,客户端计算机,Director和真实服务器使用IP地址彼此进行通信。
不同架构角色命名情况如下图:
6. LVS集群的3种常见工作模式介绍与原理讲解
IP虚拟服务器软件IPVS
在调度器的实现技术中,IP负载均衡技术是效率最高的。在已有的IP负载均衡技术中有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的,高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network Address Translation),大多数商业化的IP负载均衡调度器产品都是使用NAT的方法,如Cisco的额LocalDirector,F5,Netscaler的Big/IP和Alteon的ACEDirector。
在分析VS/NAT 的缺点和网络服务的非对称性的基础上,我们提出通过IP隧道实现虚拟服务器的方法VS/TUN(Virtual Server via IP Tunneling)和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),他们可以极大地提高系统的伸缩性。所以,IPVS软件实现了这三种IP负载均衡技术。淘宝开源的模式FULLNAT.
LVS的四种工作模式
NAT(Network Address Translation)
TUN(Tunneling)
DR(Direct Routing)
FULLNAT(Full Network Address Translation)
(1) NAT模式-网络地址转换<==收费站模式(了解即可)
经过LVS时,LVS通过DNAT,对目标IP地址转换成RIP,修改IP地址,找到后方其中一个RS节点;数据包返回时,原路返回,经过LVS用SNAT转换。
NAT模式的核心区别:后方的RS并不能直接把请求返回给用户,而是把请求返回给LVS,再由LVS返回给用户。
NAT模式加重了LVS的负担,支持并发低。
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) TUN模式-(了解即可)
与DR模式的区别:不再是通过修改MAC地址来把数据包发给后方RS,而是变动IP地址,可以跨网段传输、跨机房传输。
IP隧道技术,在IP头部的前边又封装了一个IP头部;目标头部就变成了RIP,(CIP:RIP(CIP:VIP));通过Internet到另一个机房,另一个机房接收到之后,把外边的IP头部去除,再认为源IP是自己,目标IP为用户。
TUN模式的本质:通过IP隧道技术,在LVS转给后方节点时,对IP动手脚;封装一个目标IP为RIP。
增加一个IP头部。通过IP隧道进行通信(可以跨网段找到RS节点)
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模式-直接路由模式(重点)
用户在浏览器中输入域名(www.yunjisuan.com)发送请求,DNS解析域名为IP地址(由于域名绑定的是公网IP,发送的请求先经过网关),该IP地址为公网IP(GIP);用户发送数据包,源IP为CIP,目标IP为GIP。
为了让私网能够访问公网,通过DNAT目标地址转换,于是数据包的源地址没有变化,为CIP,而目标IP变化为VIP到LVS;
由于LVS有高可用,自己是DIP;其中,网关到LVS的过程是同网段数据传输,依靠MAC地址转换;因此,网关先要通过ARP协议已知VIP获取LVS的MAC地址。源MAC为GMAC,目标MAC为VMAC。
假设LVS负载均衡,将数据包发给一台Web服务器(RIP1);同网段传输,源IP地址未发生转换,MAC地址发生转换;源IP为CIP,目标IP为VIP;源MAC为GMAC,目标MAC为RMAC。此时,LVS也需要获取后方RS(Real Server)的MAC地址才能修改目标MAC地址,发送数据包。(已知RIP获取MAC)
其中的一台RS收到数据包之后,发现数据包的目标IP地址找VIP,但自己其实是RIP,就会丢包;因此,要求让RS认为数据包就是给他自己的,因此我们需要在后方的每个RS上绑定VIP地址(绑定在lo回环网卡上),并抑制VIP地址的ARP响应。
于是,完成用户的请求,把用户想要访问的网页经过.jgp压缩(Nginx Web的最主要功能),开始从网卡发送回去,源IP为VIP,目标IP为CIP;经过公网网关,对源地址进行地址转换(无需做SNAT,DNAT负责一去一回);经过转换后,源IP为GIP,目标IP为CIP;用户收到的数据包,源IP为GIP,目标IP为CIP;从而,形成周而复始的轮回,导致用户始终不知道是哪个RS为他提供的服务,却以为是GIP为他提供服务。
Virtual Server via Direct Routing(VS/DR)
VS/DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器将响应后的处理结果直接返回给客户端用户。同VS/TUN技术一样,VS/DR技术可极大地提高集群系统的伸缩性。而且,这种DR模式没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器LB与正式服务器RS节点都有一块网卡连在同一物理网段上,即必须在同一个局域网环境。
只修改目标MAC地址,通过MAC找到RS节点(无法跨网段找到RS节点)
DR模式特点小结:
通过在调度器LB上修改数据包的目的MAC地址实现转发。(源IP地址仍然是CIP,目的IP地址仍然是VIP)
请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此,并发访问量大时使用效率很高(和NAT模式相比)
因DR模式是通过MAC地址的改写机制实现的转发,因此,所有RS节点和调度器LB只能在一个局域网LAN中(缺点)
RS节点的默认网关不需要是调度器LB的DIP,而直接是IDC机房分配的上级路由器的IP(这是RS带有外网IP地址的情况),理论讲:只要RS可以出网即可,不是必须要配置外网IP
由于DR模式的调度器仅进行了目的MAC地址的改写,因此,调度器LB无法改变请求的报文的目的端口(缺点)
当前,调度器LB支持几乎所有的UNIX,LINUX系统,但目前不支持WINDOWS系统。真实服务器RS节点可以是WINDOWS系统。
总的来说DR模式效率很高,但是配置也较麻烦,因此,访问量不是特别大的公司可以用haproxy/nginx取代之。这符合运维的原则:简单,易用,高效。日2000W PV或并发请求1万以下都可以考虑用haproxy/nginx(LVS NAT模式)
直接对外的访问业务,例如:Web服务做RS节点,RS最好用公网IP地址。如果不直接对外的业务,例如:MySQl,存储系统RS节点,最好只用内部IP地址。
(4) FULLNAT模式-(了解即可)
数据包经过公网网卡时,同时进行DNAT和SNAT转换;源IP转换为另一个LVS,目标IP为RIP。
淘宝的LVS应用模式
FULLANT特点:
1,源IP改成不同的VIP和目的IP改成RIP
2,RS处理完毕返回时,返回给不同的LVS调度器
3,所有LVS调度器之间通过session表进行Client Address的共享
- 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 | 目的地址哈希调度,以目的地址为关键字查找一个静态hash表来获得需要的RS |
sh | 源地址哈希调度,以源地址为关键字查找一个静态hash表来获得需要的RS |
wlc | 加权最小连接数调度,实际连接数除以权值,最小的RS作为分配的RS |
lc | 最小连接数调度,连接数最小的RS作为分配的RS |
lblc | 基于地址的最小连接数调度,将来自同一目的地址的请求分配给同一台RS节点 |
lblcr | 基于地址带重复最小连接数调度。(略) |
SED | 最短的期望的延迟(不成熟) |
NQ | 最小队列调度(不成熟) |
- LVS的调度算法的生产环境选型
-
一般的网络服务,如Http,Mail,MySQL等,常用的LVS调度算法为:
基本轮叫调度rr算法
加权最小连接调度wlc
加权轮叫调度wrr算法 -
基于局部性的最少链接LBLC和带复制的基于局部性最少链接LBLCR主要适用于Web Cache和Db Cache集群,但是我们很少这样用。(都是一致性哈希算法)
-
源地址散列调度SH和目标地址散列调度DH可以结合使用在防火墙集群中,它们可以保证整个系统的唯一出入口。
-
最短预期延时调度SED和不排队调度NQ主要是对处理时间相对比较长的网络服务。
实际使用中,这些算法的适用范围不限于这些。我们最好参考内核中的连接调度算法的实现原理,根据具体业务需求合理的选型。
- LVS集群的特点
LVS集群的特点可以归结如下:
(1)功能:
实现三种IP负载均衡技术和10种连接调度算法的IPVS软件。在IPVS内部实现上,采用了高效的Hash函数和垃圾回收机制,能正确处理所调度报文相关的ICMP消息(有些商品化的系统反而不能)。虚拟服务的设置数目没有限制,每个虚拟服务都有自己的服务器集。它支持持久的虚拟服务(如HTTP Cookie 和HTTPS等需要该功能的支持),并提供详尽的统计数据,如连接的处理速率和报文的流量等。针对大规模拒绝服务(Deny of service)攻击,实现了三种防卫策略:有基于内容请求分发的应用层交换软件KTCPVS,它也是在Linux内核中实现。有相关的集群管理软件对资源进行检测,能及时将故障屏蔽,实现系统的高可用性。主,从调度器能周期性地进行状态同步,从而实现更高的可用性。
(2)适用性
1)后端真实服务器可运行任何支持TCP/IP的操作系统,包括Linux,各种Unix(如FreeBSD,Sun Solaris,HP Unix等),Mac/OS和windows NT/2000等。
2)负载均衡调度器LB能够支持绝大多数的TCP和UDP协议:
协议 | 内容 |
---|---|
TCP | HTTP,FTP,PROXY,SMTP,POP3,IMAP4,DNS,LDAP,HTTPS,SSMTP等 |
UDP | DNS,NTP,TCP,视频,音频流播放协议等 |
无需对客户机和服务作任何修改,可适用大多数Internet服务。
3)调度器本身当前不支持windows系统。支持大多数的Linux和UINIX系统。
(3)性能
LVS服务器集群系统具有良好的伸缩性,可支持几百万个并发连接。配置100M网卡,采用VS/TUN或VS/DR调度技术,集群系统的吞吐量可高达1Gbits/s;如配置千兆网卡,则系统的最大吞吐量可接近10Gbits/s
(4)可靠性
LVS服务器集群软件已经在很多大型的,关键性的站点得到很好的应用,所以它的可靠性在真实应用得到很好的证实。
(5)软件许可证
LVS集群软件是按GPL(GNU Public License)许可证发行的自由软件,这意味着你可以得到软件的源代码,有权对其进行修改,但必须保证你的修改也是以GPL方式发行。
- LVS的官方中文阅读资料
|标题 |地址|
|–|--|
|LVS项目介绍| http://www.linuxvirtualserver.org/zh/lvs1.html|
|LVS集群的体系结构| http://www.linuxvirtualserv