2 负载均衡工具
使用 nginx, lightttp, fastcgi 提升性能和构造分布式服务。
表格 主流负载均衡工具(nginx/haproxy/lvs) 比较
简介 | 备注 | |
---|---|---|
nginx | 高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器,可替换 Apache。 1、工作在网络的 7 层之上,可以针对 http 应用做一些分流的策略,比如针对域名、目录结构; 2、Nginx 对网络的依赖比较小,理论上能 ping 通就就能进行负载功能; 3、Nginx 安装和配置比较简单,测试起来比较方便; 4、也可以承担高的负载压力且稳定,一般能支撑超过 1 万次的并发; 5、对后端服务器的健康检查,只支持通过端口来检测,不支持通过 url 来检测。 6、Nginx 对请求的异步处理可以帮助节点服务器减轻负载; 7、Nginx 仅能支持 http、https 和 Email 协议,这样就在适用范围较小。 8、不支持 Session 的直接保持,但能通过 ip_hash 来解决。、对 Big request header 的支持不是很好, 9、支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、Ip-hash(Ip 哈希) 10、Nginx 还能做 Web 服务器即 Cache 功能。 | 七层 HTTP |
LVS | LVS(Linux Virtual Server)即 Linux 虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前 LVS 已经被集成到 Linux 内核模块中。LVS 工作模式分为 NAT、TUN 和 DR 模式。 1、抗负载能力强。抗负载能力强、性能高,能达到 F5 硬件的 60%;对内存和 cpu 资源消耗比较低 2、工作在网络 4 层,通过 vrrp 协议转发(仅作分发之用),具体的流量由 linux 内核处理,因此没有流量的产生。 3、应用范围比较广,可以对所有应用做负载均衡; 4、不支持正则处理,不能做动静分离。 5、支持负载均衡算法:rr(轮循)、wrr(带权轮循)、lc(最小连接)、wlc(权重最小连接) 6、稳定性、可靠性好,自身有完美的热备方案;(如:LVS+Keepalived) 7、配置复杂,对网络依赖比较大,稳定性很高。 | 四层 TCP/IP |
HAProxy | 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 节点进行检测和负载均衡。 9、支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求 URL)、rdp-cookie(根据 cookie) 10、不能做 Web 服务器即 Cache。 | 四层+七层 |
备注: nginx 的 http 会话的直接保持,可通过 ip_hash 解决,但这样就不能自动剔除后端服务器故障(轮询)。
三大主流软件负载均衡器适用业务场景:
1、网站建设初期,可以选用 Nigix/HAproxy 作为反向代理负载均衡(或者流量不大都可以不选用负载均衡),因为其配置简单,性能也能满足一般的 业务场景。如果考虑到负载均衡器是有单点问题,可以采用 Nginx+Keepalived/HAproxy+Keepalived 避免负载均衡器自身的单 点问题。
2、网站并发达到一定程度之后,为了提高稳定性和转发效率,可以使用 LVS。毕竟 LVS 比 Nginx/HAproxy 要更稳定,转发效率也更高。不过维护 LVS 对维护人员的要求也会更高,投入成本也更大。
HAProxy
HAProxy 是一个使用 C 语言编写的自由及开放源代码软件。
(1)HAProxy 是一款提供高可用性、负载均衡以及基于 TCP(第四层)和 HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。 HAProxy 特别适用于那些负载特大的 web 站点,这些站点通常又需要会话保持或七层处理。HAProxy 运行在当前的硬件上,完全可以支持数以万计的 并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的 web 服务器不被暴露到网络上。
(2)HAProxy 实现了一种 事件驱动 , 单一进程 模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。 事件驱动模型 因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个 CPU 时间片(Cycle) 做更多的工作。
(3)HAProxy 支持连接拒绝 : 因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。 这个已经为一个陷于小型 DDoS 攻击的网站开发了而且已经拯救了很多站点,这个优点也是其它负载均衡器没有的。
(4)HAProxy 支持全透明代理(已具备硬件防火墙的典型特点): 可以用客户端 IP 地址或者任何其他地址来连接后端服务器. 这个特性仅在 Linux 2.4/2.6 内核打了 cttproxy 补丁后才可以使用. 这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。
性能
HAProxy 借助于 OS 上几种常见的技术来实现性能的最大化。
- 单进程、事件驱动模型显著降低了上下文切换的开销及内存占用。
- O(1) 事件检查器(event checker) 允许其在高并发连接中对任何连接的任何事件实现即时探测。
- 在任何可用的情况下,单缓冲(single buffering) 机制能以不复制任何数据的方式完成读写操作,这会节约大量的 CPU 时钟周期及内存带宽;
- 借助于 Linux 2.6 (>= 2.6.27.19) 上的 splice() 系统调用,HAProxy 可以实现零复制转发(Zero-copy forwarding),在 Linux 3.5 及以上的 OS 中还可以实现零复制启动(zero-starting);
- 内存分配器在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长;
- 树型存储:侧重于使用作者多年前开发的弹性二叉树,实现了以 O(log(N)) 的低开销来保持计时器命令、保持运行队列命令及管理轮询及最少连接队列;
- 优化的 HTTP 首部分析:优化的首部分析功能避免了在 HTTP 首部分析过程中重读任何内存区域;
- 精心地降低了昂贵的系统调用,大部分工作都在用户空间完成,如时间读取、缓冲聚合及文件描述符的启用和禁用等;
所有的这些细微之处的优化实现了在中等规模负载之上依然有着相当低的 CPU 负载,甚至于在非常高的负载场景中,5%的用户空间占用率和 95%的系统 空间占用率也是非常普遍的现象,这意味着 HAProxy 进程消耗比系统空间消耗低 20 倍以上。因此,对 OS 进行性能调优是非常重要的。即使用户空间的占用 率提高一倍,其 CPU 占用率也仅为 10%,这也解释了为何 7 层处理对性能影响有限这一现象。由此,在高端系统上 HAProxy 的 7 层性能可轻易超过硬件负 载均衡设备。
在生产环境中,在 7 层处理上使用 HAProxy 作为昂贵的高端硬件负载均衡设备故障故障时的紧急解决方案也时长可见。硬件负载均衡设备在“报文”级 别处理请求,这在支持跨报文请求(request across multiple packets) 有着较高的难度,并且它们不缓冲任何数据,因此有着较长的响应时间。对应地,软件负载均衡设备使用 TCP 缓冲,可建立极长的请求,且有着 较大的响应时间。
HAProxy 目前主要有三个版本: 1.3 , 1.4, 1.5,CentOS6.6 自带的 RPM 包为 1.5 的。
配置 HAProxy Session 亲缘性的三种方式
haproxy 负载均衡保持客户端和服务器 Session 亲缘性的三种方式:
1. 用户 IP 识别
haproxy 将用户 IP 经过 hash 计算后 指定到固定的真实服务器上(类似于 nginx 的 IP hash 指令)
配置指令 balance source
2. cookie 识别
haproxy 将 WEB 服务端发送给客户端的 cookie 中插入(或添加前缀)haproxy 定义的后端的服务器 COOKIE ID。
配置指令例举 cookie SESSION_COOKIE insert indirect nocache
用 firebug 可以观察到用户的请求头的 cookie 里 有类似" Cookie jsessionid=0bc588656ca05ecf7588c65f9be214f5; SESSION_COOKIE=app1" SESSION_COOKIE=app1 就是 haproxy 添加的内容
3. session 识别
haproxy 将后端服务器产生的 session 和后端服务器标识存在 haproxy 中的一张表里。客户端请求时先查询这张表。
配置指令例举 appsession JSESSIONID len 64 timeout 5h request-learn
配置 Haproxy~haproxy.cfg
Haproxy 配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择作为配置。
- global:参数是进程级的,通常和操作系统(OS) 相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改;
- default:配置默认参数的,这些参数可以被利用配置到 frontend,backend,listen 组件;
- frontend:接收请求的前端虚拟节点,Frontend 可以根据规则直接指定具体使用后端的 backend(可动态选择);
- backend:后端服务集群的配置,是真实的服务器,一个 Backend 对应一个或者多个实体服务器;
- listen:Frontend 和 Backend 的组合体。
LVS
LVS 是 Linux Virtual Server 的简写,意即 Linux 虚拟服务器,是一个虚拟的服务器集群系统。本项目在 1998 年 5 月由章文嵩博士成立,是中国国内最早出现的自由软件项 目之一。章文嵩博士目前工作于中国国家并行与分布式处理重点实验室,主要从事集群技术、操作系统、对象存储与数据库的研究。
本章参考
- 三大主流软件负载均衡器对比(LVS VS Nginx VS Haproxy) https://www.cnblogs.com/zjoch/p/6409411.html
- HAProxy 用法详解 www.ttlsa.com/linux/haproxy-study-tutorial/
- shuming. LVS 工作模式以及工作原理
- LVS 负载均衡(LVS 简介、三种工作模式、十种调度算法) https://blog.csdn.net/weixin_40470303/article/details/80541639
- LVS wiki. Load balancing
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论