LVS负载均衡(LVS简介、三种工作模式、持久化连接)

一、LVS简介及原理
1、LVS概述
LVS(Linux Virtual Server)即Linux虚拟服务器,在Linux平台运行。LVS被集成到Linux内核模块中被分为2个部分,用户态(ipvsadm)和内核态(ipvs),内核态就是内核的核心代码,用户态就是用户空间的管理工具,它们工作在各自的层级里,一个在用户空间,一个在内核空间。LVS在Linux内核中实现了基于IP的数据请求负载均衡调度方案,其体系结构如图1所示,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。最后根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户,LVS工作模式分为NAT模式、TUN模式、以及DR模式。
在这里插入图片描述

2、IPVS原理
钩子函数,Linux内核的一种机制,优先获取数据报文的使用权。在IPVS开启时,IPVS会强行获取客户端发送过来的报文的使用权。
提示:生产环境中,人们称作IPVS或LVS均可,也有叫做IPVS模块或LVS调度,一个是内核态,一个是软件包名称,基本没什么区别,类似于Apache和httpd关系一样。

二、工作模式解析
1、基于NAT的LVS负载均衡
NAT(Network Address Translation)即网络地址转换,其作用是通过数据报头的修改,使得位于企业内部的私有IP地址可以访问外网,以及外部用户可以访问位于公司内部的私有IP主机。LVS/NAT工作模式拓扑结构如图2所示,LVS负载调度器使用两块网卡配置不同的IP地址,eth1与内部网络通过交换设备相互连接,eth0(VIP)与外部网络联通。
在这里插入图片描述

第一步,用户192.168.45.10通过互联网DNS服务器解析到公司负载调度器上面的外网地址,相对于真实服务器IP,LVS外网IP又称VIP(Virtual IP Address),是整个负载均衡集群对外接收访问的IP,用户通过访问VIP,即可连接后端的真实服务器(Real Server),而这一切对用户而言都是透明的,用户以为自己访问的就是真实服务器,但他并不知道自己访问的VIP仅仅是一个调度器,也不清楚后端的真实服务器到底在哪里、有多少真实服务器。

第二步,用户将请求发送至负载调度器eth0(192.168.66.10),此时在LVS中我们要写上集群的调度规则,包括VIP外网地址,真实服务器的IP及对应的端口,LVS将根据预设的算法(如rr轮询)选择后端的一台真实服务器(192.168.88.11~192.168.88.13),然后LVS将对数据请求包进行DNAT转换(目标地址转换),源地址保持不变,修改目标地址为算法选出的真实服务器IP及端口,通过eth1(192.168.88.10)将数据请求包被转发给真实服务器。

第三步,真实服务器接收到数据包后,将响应数据包返回给LVS调度器,指定真实服务器的网关为负载调度器的eth1,负载调度器在得到响应的数据包后会完成SNAT转换,将源地址(负载调度器eth1的IP),修改为负载调度器的VIP(eth0)。修改完成后,由负载调度器将返回数据包发送给客户端。另外,由于LVS调度器有一个连接Hash表,该表中会记录连接请求及转发信息,当同一个连接的下一个数据包发送给调度器时,从该Hash表中可以直接找到之前的连接记录,并根据记录信息选出相同的真实服务器及端口信息。
提示:关于DNAT/SNAT转换,发送请求报文经过LVS时,完成目标地址转换,公网IP转换为局域网IP(DNAT);真实服务器返回数据报文经过LVS时,完成的是源地址转换,局域网IP转换为公网IP(SNAT)。总结就是,报文传过去的时候若是目标地址转换,返回来一定是源地址转换;传过去是源地址转换,返回来一定是目标地址转换。

1.1 NAT模式特点
1)负载调度器工作在真实服务器与客户端之间;
2)负载调度器必须是Linux操作系统,真实服务器可以是任意操作系统;
3)出入站数据报文均由负载调度器完成;
4)支持端口映射。
LVS的NAT模式与Nginx7层负载调度中集群并发量的区别:
NAT模式中,集群并发量和当前系统的吞吐量有关,因为此时的LVS只负责获取了数据报文的使用权限,在LVS中虽然实现了DNAT/SNAT转换,但完成者是linux内核,即防火墙的功能,整个过程LVS并没有处理这个流量,它相当于大门中坐班值守的保安,不会帮两边送信,这时门两边的通信效率取决于门的吞吐量(不是门的大小),其实就是完成地址转换后,Linux使用了路由转发的功能。而在Nginx7层负载调度中,集群的并发量和Nginx调度器的并发量有关,此时的Nginx会亲自参与接收转发数据报文,类似于大门中站班工作的信件搬运工,搬运工搬运信件的速度直接决定了门两边的通信效率。
吞吐量:每秒钟能处理的数据流量

2、基于DR模式的LVS负载均衡
DR模式也叫直接路由模式,其体系结构如图所示,该模式中LVS依然仅承担数据的入站请求以及根据算法选出合理的真实服务器,最终由后端真实服务器负责将响应数据包发送返回给客户端。调度器根据算法在选出真实服务器后,在不修改数据报文的情况下,将数据帧的MAC地址修改为选出的真实服务器的MAC地址,通过交换机将该数据帧发给真实服务器。整个过程中,真实服务器的VIP不需要对外界可见。
在这里插入图片描述

第一步:用户端192.168.45.10将请求数据包发送给路由器eth0(192.168.50.10),路由器对数据包完成DNAT目标地址转换,具体内容是:如果数据报文目标IP为192.168.50.10:80,那么将目标地址修改为192.168.88.10:80。

第二步:路由器通过eth1(192.168.50.11)将完成DNAT转换后的请求数据包发送到负载调度器的192.168.88.10:80,由于负载调度器与真实服务器都在二层网络,同一个广播域中,此时负载调度器网卡一般会开启2个接口,一个作为VIP接收公网访问,另一个子接口作为局域网通信用。DR模式中,负载调度器不会更改数据包的目标IP和端口,而是根据算法更改数据包的目标MAC地址为某台真实服务器的MAC地址,更改完成后,数据包会被发送到局域网内拥有该MAC地址的某台真实服务器的物理端口。

第三步:显然,由于此数据包的目标IP不是该真实服务器的IP,而是负载调度器的VIP,故真实服务器并不会接收已经送到自家物理端口门前的数据包,为了能正常接收数据包,真实服务器会在自身的回环网卡上再开启一个子接口,这个子接口IP与负载调度器VIP一致。我们知道,网卡的基本属性是通告和响应,所谓通告就是网卡默认会将自己所有合法、标准的地址向当前广播域中广播,这也是为什么同一个广播域中的Windows主机上线后,我们可以在其他主机的工作组中查看到这台主机的地址和名称。因而,真实服务器的网卡也会通过eth0默认将eth0的IP以及回环接口上新增的合法标准IP广播给局域网中的其他主机。这样,当前广播域中会出现2个相同的IP,即负载调度器的VIP与真实服务器回环接口的子接口IP一致而冲突。为避免此问题,我们使用一种叫做ARP通信行为控制的技术来隐藏真实服务器回环网卡子接口的IP,目的是使这个子接口IP只有在目标IP和自己IP一致时才响应,且它不能被局域网其他主机识别。ARP通信行为控制也包含通告行为和响应行为,我们通过它限制回环网卡子接口IP对外通告和响应,这样回环网卡子接口IP即使与局域网其他IP冲突,由于它永远不会响应其他主机,也就不会造成IP地址冲突(文章末尾介绍详细规则)。其实,在更老的版本里,我们是通过将负载调度器VIP地址与网卡自身MAC地址绑定在交换机上的方式,使真实服务器回环网卡子接口IP在局域网广播而不会有其他主机响应它。笔者不建议使用这种方式,因为生产环境复杂,需要与网络工程师协商,不易掌控。有了与VIP一样的子接口IP以后,我们拥有了处理请求数据报文的身份,但还需要使用路由转发功能,因为此时的回环网卡子接口只能内部通信,所以让eth0帮忙将数据报文转发给回环网卡子接口IP。至此,真实服务器才能处理请求数据报文。
提示:回环网卡上的127.0.0.1是一个回送地址,也叫测试IP,默认只在当前主机内部生效。当我们在回环网卡上另外配置一个合法标准IP时,它是可以对外通信的,为了不造成局域网地址冲突,所以我们需要对它隐藏。

第三步较为复杂,为了便于理解笔者类比为现实生活中的例子:某小区收到一份防疫通知(请求数据报文),但发信员只知道红头文件要送到小区大门(集群VIP),并不清楚具体给谁处理,实际通知一般由门卫(负载调度器)负责传达。但门卫不清楚红头文件政策,就随便(用算法非常认真地计算后)告诉发信员要交给社区党支部(真实服务器)处理(更改数据包MAC地址),于是文件被送到了社区党支部门口(局域网主机间通过MAC地址通信),此时的社区党支部只有文员(真实服务器eth0)和李四(回环网卡子接口)。李四是一名党员(回环网卡),他是一个单纯善良的孩子,开门后不禁有很多问号,他确认党支部没有被赋予这项任务(数据包目标IP与真实服务器IP不一致),他也就没有解读文件的权利。眼下其他党员不在,在问清事情的来龙去脉后,李四毅然决定代替党支部接收完成门卫移交的重任(通过ARP通信控制行为获得查看数据包的身份)。党支部集体决定以后由李四负载处理此类事件(真实服务器开启路由转发,获取数据包),整个党支部协同完成文件中布置的任务(真实服务器返回数据包给路由器)。

第四步:真实服务器将返回数据包发送给路由器的eth1,路由器完成SNAT源地址转换,将返回数据报文的源地址改为路由器eth0的IP(用户端发送请求数据包时的公网目标IP),至此返回数据包被发送给用户端。

2.1 DR模式特点
1)负载调度器与真实服务器处在同一个广播域中;
2)负载调度器必须是Linux系统,真实服务器也必须是Linux系统(因为要使用ARP通信行为控制);
3)数据入站由负载调度器完成,出站由真实服务器完成;
4)不支持端口映射。

3、基于TUN的LVS负载均衡
在LVS(NAT)模式的集群环境中,由于所有的数据请求及响应的数据包都需要经过LVS调度器转发,如果后端服务器的数量大于10台,则调度器就会成为整个集群环境的瓶颈。我们知道,数据请求包往往远小于响应数据包的大小。因为响应数据包中包含有客户需要的具体数据,所以LVS(TUN)的思路就是将请求与响应数据分离,让调度器仅处理数据请求,而让真实服务器响应数据包直接返回给客户端。LVS/TUN工作模式拓扑结构如图4所示。其中,IP隧道(IP tunning)是一种数据包封装技术,它可以将原始数据包封装并添加新的包头(内容包括新的源地址及端口、目标地址及端口),从而实现将一个目标为调度器的VIP地址的数据包封装,通过隧道转发给后端的真实服务器(Real Server),通过将客户端发往调度器的原始数据包封装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务器的IP地址及对应端口),LVS(TUN)模式要求真实服务器可以直接与外部网络连接,真实服务器在收到请求数据包后直接给客户端主机响应数据。
在这里插入图片描述

第一步:客户端向负载调度器发送请求数据包,负载调度器接收到请求数据包后对请求数据包进行二次封装,第二次封装时目标地址为真实服务器的IP,通过这种方式,请求数据包将被发送到真实服务器上。

第二步:真实服务器接收到数据包后拆掉外层封装(第二层),根据原始请求数据包的源地址将返回数据包发送给客户端。

3.1 TUN模式的特点
1)负载调度器与真实服务器必须有公网地址,或者通过公网地址能够路由(生产环境中各个服务器通常在不同地域);
2)负载调度器必须是Linux系统,真实服务器也必须是Linux系统(数据包要封装)
3)数据入站由负载调度器完成,出站由真实服务器完成;
4)不支持端口映射。
提示:由于这种模式主要过程都是公网之间的访问,延时无法确保,而且这种方式服务器一般配置在不同地区,维护成本也高,因此很少使用。

三、三种模式对比
1、并发能力
DR > TUN > NAT > 七层负载的Nginx
提示:延时跟压力无关,故TUN优于NAT模式。

2、生产环境中使用面积(频率)
NAT/DR > TUN
提示:如果集群需要更大的并发量,选择DR模式;
如果集群需要更高的灵活性,选择NAT模式(支持端口映射,前后端口可以不一致)。

四、持久化连接和ARP通信行为控制
1、HTTPS存在的问题
以NAT模式为例,用户若使用HTTPS协议访问服务器,在首次访问时,中间会有大量HTTPS会话过程。同一个用户第二次连接时的请求可能被分配到第二台真实服务器,同样也需要大量的HTTPS会话过程才能建立通信,整个过程无疑会耗用大量资源。HTTPS本身就是一个资源消耗型的服务体系,甚至我们有一种硬件叫SSL加速器专门用来提高HTTPS握手的速度,它与HTTPS会话卸载层比较类似,结构图如下:
用户与SSL加速器通信时使用HTTPS协议,数据报文经过SSL时被卸载成HTTP协议。
在这里插入图片描述

2、持久化连接的原理及作用
把同一个 client 的请求信息记录到 lvs 的 hash 表里,保存时间使用 persistence_timeout 控制,单位为秒。如果用户配置了持久化时间 persistence_timeout,当客户端的请求到达 LB(负载调度器) 后,IPVS 会在记录表里添加一条 state 为 NONE 的连接记录。该连接记录的源 IP 为客户端 IP,端口为 0,超时时间为上面所说的持久化时间 persistence_timeout ,会逐步减小。当 NONE 的超时时间减到 0 时,如果 IPVS 记录中还存在 ESTABLISHED 或 FIN_WAIT 状态的连接,则 persistence_timeout 值会刷新为初始值。在该 NONE 状态的连接记录存在的期间,同一客户端IP的消息都会被调度到同一个 RS 节点。
提示:
1)算法类似于 SH,将同一个IP的用户请求,发送给同一个服务器,但是又有时间限制;(关于算法,笔者后续更新,这里大家理解成计算机的一种条件选择方案即可)
2)持久化连接不属于调度算法,但是会应用与算法,并且比算法优先级更高。

3、持久化连接的分类
首先明确一下,持久化连接最常用的应用场景是HTTPS。
3.1 PCC(持久客户端连接)
将来自于同一个客户端的所有请求统统定向至此前选定的RS。也就是只要IP相同,分配的服务器始终相同。换句话说,我们还可以同时调度多个集群,如2个不同的集群VIP都是10.10.10.10,可映射为不同端口,一个为443,一个为80。当用户访问443端口时,访问请求被分配到443端口所在集群的真实服务器RS1,同理80端口也一样,这里只看用户的访问IP,不管端口,这样就能调度2个集群。总结就是,只要负载调度器VIP(集群IP)一样,不管访问集群的端口是谁,同一个用户在持久化连接时间内,会被分配到同一个真实服务器。
ipvsadm -A -t 172.16.0.8:0 -s wlc -p 120
ipvsadm:命令行管理工具
-A:添加一个新的集群
-t:TCP集群
192.168.88.10:0 :集群地址,:0代表任意端口
-s wlc:指定算法为wlc算法
-p :指定持久化时间为120S

3.2 PPC(持久端口连接)
将来自于同一个客户端对同一个服务(端口)的请求,始终定向至此前选定的RS。这种类型相当于是在第一种的基础上指定了端口。换句话说,要同时匹配负载调度器VIP(集群IP)和访问端口,在这两者都保持不变的前提下,同一个用户在持久化连接时间内,会被分配到同一个真实服务器。
ipvsadm -A -t 172.16.0.8:80 -s rr -p 120

3.3 PFMC(持久防火墙标记连接)
将来自于同一客户端对指定服务(端口)的请求,始终定向至此选定的RS,不过它可以将两个毫不相干的端口定义为一个集群服务,这种方式使用较少。
原理:使用防火墙工具给用户分类,分完类后打上标签,集群根据标签值来进行负载调度。
iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 80 -j MARK --set-mark 10
#在防火墙中写入规则,规则匹配成功后执行ipvsadm命令声明的算法来控制
iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 443 -j MARK --set-mark 10
service iptables save
ipvsadm -A -f 10 -s wlc -p 120

3、ARP通信行为控制
3.1 ARP 响应行为
arp-ignore
0 表示只要本机配置有相应 IP 地址就响应。
1 表示仅在请求的目标地址配置在请求到达的网络接口上时,才给予响应。换句话说,除了发给当前网卡当前接口地址以外的响应信息,它都不会接收,只有报文的目标IP和自己IP一样时才响应。

3.2 ARP 通告行为
arp-announce
0 表示将本机任何网络接口上的任何地址都向外通告。
1 表示尽可能避免像目标网络通告与其网络不匹配的地址信息表。
#尽量代表可能会出错
2 表示仅向目标网络通告与其网络相匹配的地址信息。换句话说,除了当前网卡当前接口的地址以外的IP,它都不会广播,只广播自己的IP。


LVS原理性和流程性的知识比较多,需要实际操作才能更好理解,笔者后续将和大家一起搭建实验加深理解。

猜你喜欢

转载自blog.csdn.net/weixin_43455673/article/details/112385732