Layer 4 vs Layer 7 Load Balancing - tenji/ks GitHub Wiki

四层、七层负载均衡的区别

OSI 参考模型描述了可以执行 Load Balance 的各个层,表面上看,它们是第七层(应用层)和第四层(传输层),如下图所示。

第四层负载平衡器在传输层上运行,例如传输控制协议(TCP)和用户数据报协议(UDP)。通常,第四层的路由决策基于源/目标 IP 或端口,而无需进一步的数据包检查。

如 OSI 模型中所示,应用层(第七层)的负载平衡是适用的最高级别,并在应用程序层协议(如HTTP)上提供了更深的上下文。第七层 Load Balance 在应用层上运行,可以利用此附加的应用程序感知,根据消息的内容做出更复杂,更明智的 Load Balance 决策,对内容进行优化和更改(例如HTTP标头操作,压缩和加密),并通过监视应用程序的运行状况来确保可靠性和可用性。

第七层 Load Balance 也称为反向代理(reverse proxy)

  • 二层:基于 MAC 地址的负载均衡
  • 三层:基于 IP 地址的三层负载均衡
  • 四层:基于 IP + 端口的负载均衡
  • 七层:基于 URL 等应用层信息的负载均衡

一、四层 Load Balance 特性

二、七层 Load Balance 特性

2.1 持久化(Persistence)

持久性使来自单个客户端的所有请求都可以发送到同一服务器,以便可以维护该应用程序上下文。 持久性也称为“亲和性”,“服务器亲和性”或“服务器粘性”。

2.2 上下文切换(Context Switching)

上下文切换允许负载均衡器根据来自客户端的请求中信息的内容和上下文来引导流量。

2.3 内容改写(Content Rewriting)

内容重写允许 Load Balance 重写客户端请求和答复,以支持隐藏内部 URL 的用例,并支持具有硬编码 URL 的应用程序。

2.4 Secure Socket Layer (SSL)

第七层负载平衡器提供了终止 SSL 流量的功能。 为网络数据包处理 SSL/TLS 加密是一项资源密集型任务。在用于服务于客户端请求的 Web 服务器和应用程序服务器上执行此操作会增加服务器上的额外开销,这些开销应针对内容交付进行优化。

2.5 健康检查(Health Checking)

运行状况检查已发展为 Load Balance 查询应用程序服务器和应用程序以确定其是否正常运行并可以接收流量的一种方法。Load Balance 算法尊重运行状况检查的结果,并且仅将请求发送到可用的且可以及时响应的应用程序服务器和应用程序。

2.6 日志和监控(Logging & Monitoring)

由于其在网络上的逻辑位置,第七层 Load Balance 会检查流入和流出网站和应用程序服务器的所有第四层和第七层流量。所有这些活动都记录在日志中,以帮助监视和跟踪网络信息。这些可以传递给专用的监视工具进行分析,并且可以识别任何可疑活动。最佳做法是,应从收集日志并进行远程分析的网络设备发送日志。

三、LVS(四层)

3.1 优点

  1. 抗负载能力强、是工作在网络4层之上仅作分发之用,通过 vrrp 协议转发(仅做分发之用),没有流量的产生(具体的流量由linux内核处理,因此没有流量的产生),这个特点也决定了它在负载均衡软件里的性能最强的,对内存和 CPU 资源消耗比较低;
  2. 配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率;
  3. 工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案,如 LVS + Keepalived;
  4. 无流量,LVS 只分发请求,而流量并不从它本身出去,这点保证了均衡器 IO 的性能不会受到大流量的影响;
  5. 应用范围比较广,因为 LVS 工作在4层,所以它几乎可以对所有应用做负载均衡,包括 HTTP、数据库、在线聊天室等等。

3.2 缺点

  1. 软件本身不支持正则表达式处理,不能做动静分离;而现在许多网站在这方面都有较强的需求,这个是 Nginx/HAProxy + Keepalived 的优势所在;
  2. 如果是网站应用比较庞大的话,LVS/DR + Keepalived 实施起来就比较复杂了,特别后面有 Windows Server的机器的话,如果实施及配置还有维护过程就比较复杂了,相对而言,Nginx/HAProxy + Keepalived 就简单多了。

四、Nginx(七层)

4.1 优点

  1. 工作在网络的7层之上,可以针对 HTTP 应用做一些分流的策略,比如针对域名、目录结构,它的正则规则比 HAProxy 更为强大和灵活,这也是它目前广泛流行的主要原因之一,Nginx 单凭这点可利用的场合就远多于 LVS 了;
  2. Nginx 对网络稳定性的依赖非常小,理论上能 Ping 通就就能进行负载功能,这个也是它的优势之一,相反 LVS 对网络稳定性依赖比较大;
  3. Nginx 安装和配置比较简单,测试起来比较方便,它基本能把错误用日志打印出来。LVS 的配置、测试就要花比较长的时间了;
  4. 可以承担高负载压力且稳定,在硬件不差的情况下一般能支撑几万次的并发量,负载度比 LVS 相对小些;
  5. Nginx 可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点,不过其中缺点就是不支持 URL 来检测。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,Nginx 会把上传切到另一台服务器重新处理,而 LVS 就直接断掉了,如果是上传一个很大的文件或者很重要的文件的话,用户可能会因此而不满;
  6. Nginx 不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的 Web 应用服务器。LNMP 也是近几年非常流行的 WEB 架构,在高流量的环境中稳定性也很好;
  7. Nginx 现在作为 Web 反向加速缓存越来越成熟了,速度比传统的 Squid 服务器更快,可以考虑用其作为反向代理加速器;
  8. Nginx 可作为中层反向代理使用,这一层面 Nginx 基本上无对手,唯一可以对比 Nginx 的就只有 lighttpd 了,不过 lighttpd 目前还没有做到 Nginx 完全的功能,配置也不那么清晰易读,社区资料也远远没 Nginx 活跃;
  9. Nginx 也可作为静态网页和图片服务器,这方面的性能也无对手。还有 Nginx 社区非常活跃,第三方模块也很多。

4.2 缺点

  1. Nginx 仅能支持 HTTP、HTTPS 和 EMAIL 协议,这样就在适用范围上面小些;
  2. 对后端服务器的健康检查,只支持通过端口来检测,不支持通过 URL 来检测。不支持 Session 的直接保持,但能通过 ip_hash 来解决,对 Big Request Header 的支持不是很好。

五、HAProxy(支持四层和七层,主要做七层)

5.1 特点

  1. 支持两种代理模式:TCP(四层)和 HTTP(七层),支持虚拟主机;
  2. 能够补充 Nginx 的一些缺点比如 Session 的保持,Cookie 的引导等工作;
  3. 支持通过获取指定的 URL 来检测后端服务器的状态;
  4. 更多的负载均衡策略比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权 URL 哈希和加权参数哈希(Weighted Parameter Hash)已经实现;
  5. 单纯从效率上来讲 HAProxy 更会比 Nginx 有更出色的负载均衡速度;
  6. HAProxy 可以对 Mysql 进行负载均衡,对后端的 DB 节点进行检测和负载均衡;
  7. 支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie);
  8. 不能做 Web 服务器即 Cache。

5.2 优点

  1. 免费开源,稳定性也是非常好,这个可通过我做的一些小项目可以看出来,单 HAProxy 也跑得不错,稳定性可以与 LVS 相媲美;
  2. 根据官方文档,HAProxy可以跑满 10Gbps(New benchmark of HAProxy at 10 Gbps using Myricom's 10GbE NICs (Myri-10G PCI-Express)),这个作为软件级负载均衡,也是比较惊人的;
  3. HAProxy 可以作为 MySQL、邮件或其它的非 web 的负载均衡,我们常用于它作为 MySQL(读)负载均衡;
  4. 自带强大的监控服务器状态的页面,实际环境中我们结合 Nagios 进行邮件或短信报警,这个也是我非常喜欢它的原因之一;
  5. HAProxy 支持虚拟主机。

六、适用业务场景

  1. 网站建设初期,可以选用 Nigix/HAproxy 作为反向代理负载均衡(或者流量不大都可以不选用负载均衡),因为其配置简单,性能也能满足一般的业务场景。如果考虑到负载均衡器是有单点问题,可以采用 Nginx/HAproxy + Keepalived 避免负载均衡器自身的单点问题;
  2. 网站并发达到一定程度之后,为了提高稳定性和转发效率,可以使用 LVS、毕竟 LVS 比 Nginx/HAproxy 要更稳定,转发效率也更高。不过维护 LVS 对维护人员的要求也会更高,投入成本也更大。

注:Niginx 与 HAProxy 比较:Niginx 支持七层、用户量最大,稳定性比较可靠。HAProxy 支持四层和七层,支持更多的负载均衡算法,支持 session 保存等。具体选型看使用场景,目前来说 HAProxy 由于弥补了一些 Niginx 的缺点用户量也不断在提升。

七、Load Balance 性能度量因子

  1. 会话率:单位时间内的处理的请求数
  2. 会话并发能力:并发处理能力
  3. 数据率:处理数据能力

经过官方测试统计,HAProxy 单位时间处理的最大请求数为 20000 个,可以同时维护 40000~50000 个并发连接,最大数据处理能力为 10Gbps。综合上述,HAProxy 是性能优越的负载均衡、反向代理服务器。

参考链接