写点什么

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

  • 2022 年 3 月 16 日
  • 本文字数:3663 字

    阅读完需:约 12 分钟

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

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

在开源的软件负载均衡中,应用最为广泛的有 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 点。

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

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

LVS 原理架构

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

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

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

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

LVS 三种工作模式

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

LVS 二层 DR 模式原理

LVS DR 模式数据包流向

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

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

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

LVS 三层 IPTunnel 模式原理

LVS IPTunnel 模式数据包流向


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

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

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

LVS 四层 NAT 模式原理


LVS NAT 模式数据包流向

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

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

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

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


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

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 四层模式原理

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

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

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

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

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

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

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

Nginx/HAProxy 七层模式原理

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

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

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

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

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

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 进行配置,这样可以保证性能。

发布于: 刚刚阅读数: 2
用户头像

InfoQ签约作者 2018.11.30 加入

热爱生活,收藏美好,专注技术,持续成长

评论

发布
暂无评论
一文剖析:LVS/Nginx/HAProxy原理及应用场景_3月月更_穿过生命散发芬芳_InfoQ写作平台