一文剖析:LVS/Nginx/HAProxy原理及应用场景

时间:2022-08-24 01:03:07

负载均衡已经发展成为网络架构中的基础核心组件,消除了服务器单点故障,可以进行请求流量分流,提升冗余,保证服务器的稳定性。

在开源的软件负载均衡中,应用最为广泛的有LVS、Nginx、HAProxy,甚至阿里云的SLB也是基于LVS及Nginx的。本文就来阐述下LVS、Nginx、HAProxy的工作原理及应用场景。

LVS介绍

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。LVS工作在二层/三层/四层最底层,仅作分发之用,对CPU和内存消耗极低,抗负载能力极强。所以它几乎可以对所有应用做负载均衡,包括HTTP、数据库、在线聊天室等,并且LVS的3种工作模式、10种调度算法使其在负载均衡端有更灵活的策略选择.

LVS主要由IPVS和Ipvsadm实现

IPVS:是LVS集群系统的核心部分,是基于Linux Netfilter框架实现的一个内核模块,主要工作于内核空间的INPUT链上。其钩子函数分别HOOK在LOCAL_IN和FORWARD两个HOOK点。

一文剖析:LVS/Nginx/HAProxy原理及应用场景

IPVS是直接作用在内核空间进行数据包的修改及转发的。而Nginx/HAProxy作用在用户空间,这使得LVS的性能更强。

Ipvsadm:工作在用户空间,主要用于用户定义和管理集群服务的工具。所以实际在安装配置LVS时,主要是安装配置Ipvsadm。

LVS原理架构

一文剖析:LVS/Nginx/HAProxy原理及应用场景

①访问请求首先经过VIP到达负载调度器的内核空间。

②PREROUTING链在接收到用户请求后,会判断目标IP,确定是本机IP,将数据包发往INPUT链。

③当用户请求到达INPUT时,IPVS会将用户请求和Ipvsadm定义好的规则进行对比。如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包,并将新的数据包发往POSTROUTING链。

④POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,最终将数据包发送给后端的服务器。

LVS三种工作模式

一文剖析:LVS/Nginx/HAProxy原理及应用场景

下面使用的缩写示意:CIP-客户端IP地址;VIP-负载均衡发布供用户请求的IP;DIP-负载均衡IP主要与后端服务器呼吸通信;RIP-后端服务器的IP地址。

LVS二层DR模式原理

一文剖析:LVS/Nginx/HAProxy原理及应用场景

LVS DR模式数据包流向

①客户端请求数据包报文的源地址是CIP,目标地址是VIP。

②负载均衡会将客户端请求数据包报文的源MAC地址改为自己DIP的MAC地址,目标MAC改为了RIP的MAC地址,并将此包发送给后端服务器。这里要求所有后端服务器和负载均衡所在服务器只能在一个VLAN(局域网)里面,即不能跨VLAN

③后端服务器发现请求数据包报文中的目的MAC是自己,会将数据包报文接收下来。由于数据包的MAC地址被修改,因此后端服务器需要在lo网口绑定VIP。处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给客户端。

LVS三层IPTunnel模式原理

一文剖析:LVS/Nginx/HAProxy原理及应用场景

LVS IPTunnel模式数据包流向

①客户端请求数据包报文的源地址是CIP,目标地址是VIP。

②负载均衡将客户端请求数据包报文首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此数据包发送给后端服务器。与二层负载均衡不同的是,能跨VLAN。但三层负载均衡原理导致在后端服务器中不能直接获取客户端的源IP地址。

③后端服务器收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口发送给eth0网卡直接发送给客户端。

LVS四层NAT模式原理

一文剖析:LVS/Nginx/HAProxy原理及应用场景

LVS NAT模式数据包流向

①客户端请求数据包报文的源地址是CIP,目标地址是VIP。

②负载均衡将客户端请求数据包报文的目标地址改为RIP地址,并将此数据包发送给后端服务器。同样要求所有的后端服务器和负载均衡所在服务器只能在一个VLAN(局域网)里面,即不能跨VLAN。

③报文送到后端服务器后,目标服务器会响应该请求,并将响应数据包报文返还给负载均衡。每台内部的后端服务器的网关地址必须是负载均衡所在服务器的内网地址,即要配置SNAT,这样数据包才能经过LVS返回给客户端。

④然后负载均衡将此数据包报文的源地址修改为本机并发送给客户端。

LVS的DR模式、NAT模式对数据包的处理都仅做“一次连接”,即负载均衡对数据包仅做转发。

一文剖析:LVS/Nginx/HAProxy原理及应用场景

LVS能够做到“一次连接”的本质原因是LVS工作在内核空间LVS3种模式都是工作在内核空间,数据包的处理也仅在内核空间,这也是LVS轻量高效、高性能的最为本质的原因。

LVS应用场景
  • LVS适合应用在中大型应用中,不适合中小型应用,特别是中小型网站的应用。这是因为我们部署的网站一般都会有虚拟主机、动静分离、正则分发的需求。一般使用Nginx就能直接实现。
  • 云端ECS不支持LVS的部署,所以对二层/三层/四层负载均衡需求,只能使用云产品SLB的四层负载均衡功能替代,或者自行部署Nginx/HAProxy。
  • LVS不支持七层的虚拟主机、Rewrite正则表达式处理、动静分离等功能。而现在许多Web网站在这方面已有较强的需求,这是Nginx/HAPrxoy的优势所在。

Nginx/HAProxy介绍

Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占用内存少、并发能力强,加上丰富的插件功能模块,当前是云端Web类应用中首选的一款软件。

HAProxy是一个使用C语言编写的*及开放源代码软件,是一款主要作用在七层HTTP和四层TCP上的负载均衡软件。和LVS一样,主要是一个专业级的负载均衡。

Nginx/HAProxy四层模式原理

一文剖析:LVS/Nginx/HAProxy原理及应用场景

四层负载均衡Nginx/HAProxy数据包走向原理

①客户端请求数据包报文的源地址是CIP,访问目标地址是DIP+IP端口。

②负载均衡和后端服务器发起新的TCP三次握手,建立新的TCP连接。报文的源地址是DIP,目标地址是RIP。

③报文发送到后端服务器后,服务器响应该请求,并将响应数据包报文返还给负载均衡。

④然后负载均衡将此数据包报文的响应内容进行重新打包并返回给客户端。

一文剖析:LVS/Nginx/HAProxy原理及应用场景

Nginx/HAProxy四层三次握手数据包走向

客户端在向负载均衡进行TCP三次握手后,负载均衡会马上发起新的TCP连接,即为“二次连接”。

Nginx/HAProxy七层模式原理

一文剖析:LVS/Nginx/HAProxy原理及应用场景

七层负载均衡Nginx/HAProxy数据包走向原理

①客户端请求数据包报文的源地址是CIP,访问目标地址是DIP+IP端口+URL。

②负载均衡和后端服务器发起新的TCP三次握手,建立新的TCP连接。报文的源地址是DIP,目标地址是RIP,并且还有客户端请求的目标URL。

③报文发送到后端服务器后,服务器响应该请求,并将响应数据包报文返还给负载均衡。

④然后负载均衡将此数据包报文的响应内容进行重新打包并返回给客户端。

一文剖析:LVS/Nginx/HAProxy原理及应用场景

Nginx/HAProxy七层的二次连接,在客户端和负载均衡进行TCP三次握手后,还需要等客户端Pushdata传输数据,之后负载均衡和后端服务器才会建立新的TCP三次握手。

Nginx应用场景
  • 可以做七层HTTP的负载均衡,可以针对HTTP应用做一些分流的策略,比如针对域名、请求的URL、目录结构、请求的浏览器类型,它的正则规则比HAProxy更为强大和灵活。
  • Nginx相比于HAProxy,Nginx在七层对会话保持的功能就弱了些,Nginx默认只支持通过配置ip_hash。可以通过nginx-sticky-module模块来增强。对后端服务器的健康检查,只支持通过端口来监测,不支持通过URL来监测。
  • Nginx从1.9.0版本开始,Nginx支持对四层TCP的负载均衡功能。
  • Nginx也是功能强大的Web应用服务器。LNMP也是近几年非常流行的Web架构,在高流量的环境中稳定性也很好。
  • Nginx现在作为Web反向加速静态缓存越来越成熟,Nginx也可作为静态网页和图片服务器。其速度比传统的Squid服务器更快,基本上CDN在底层静态缓存服务器的选择。
HAProxy应用场景
  • HAProxy是一款专注在七层/四层的软负载均衡软件,但相比于Nginx少了相应的Web服务器、静态缓存、丰富的第三方插件等功能。
  • HAProxy支持源地址HASH、Cookie识别、基于Session不同策略方式来满足会话保持。同时在健康检查中,支持通过获取指定的URL来检测后端服务器的状态。
  • 在云端实践中,基本很少使用,七层/四层负载均衡都可以用云产品SLB和Nginx来完成。

云端负载均衡选择

阿里云SLB(Server Load Balancer)当前提供四层(TCP协议和UDP协议)和七层(HTTP和HTTPS协议)的负载均衡服务。

四层采用开源软件LVS(Linux Virtual Server)+Keepalived的方式实现负载均衡,并根据云计算需求对其进行了个性化定制。

七层采用Tengine实现负载均衡。Tengine是由淘宝网发起的Web服务器项目,在Nginx的基础上,针对有大访问量的网站需求添加了很多高级功能和特性。

在云端实践中,对负载均衡的选择肯定优先采用云厂商提供的SLB或者主流硬件负载均衡厂商在云中提供的软负载均衡产品(性能会更出色功能更丰富)。

在具体实际应用中,若对七层有Rewrite的需求,或者对四层有更多调度算法等的需求,这时候SLB的功能暂时达不到要求,可能需要在ECS上搭建Nginx/HAProxy四层/七层负载均衡。

在云端实践中,SLB的四层/七层基本上满足日常80%的需求。所以云端负载均衡的选型,基本上也就是云端负载均衡SLB的选型

  • 在TCP类服务中,对于负载均衡,我们只能选择四层负载均衡。
  • 在HTTP类的Web服务中,既能选择四层也能选择七层。这事实上,在80%的企业级HTTP负载均衡应用中,只有单纯转发的功能,没有对虚拟主机的转发需求。这里优先选四层因为四层在性能方面更加强悍,在应用入口采用四层负载均衡进行分流是标准且成熟的企业级架构。
  • 如果需要前端SLB挂证书SSL,也就是HTTPS,那么只能选择七层负载均衡。若有高流量高并发的场景还是建议前端采用四层负载均衡,证书放在后端ECS中的Nginx进行配置,这样可以保证性能。