共计 3758 个字符,预计需要花费 10 分钟才能阅读完成。
Nginx/LVS/HAProxy 简单介绍:
Nginx:专为性能优化而开发,性能是其最重要的考量, 实现上非常注重效率。它支持内核 Poll 模型,能经受高负载的考验, 有报告表明能支持高达 50,000 个并发连接数。
LVS:使用 Linux 内核集群实现一个高性能、高可用的负载均衡服务器,具有很好的可伸缩性(Scalability)、可靠性(Reliablity)和可管理性(Manageability)
HAProxy:提供高可用性、负载均衡以及基于 TCP 和 HTTP 应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy 特别适用于那些负载特大的 web 站点,这些站点通常又需要会话保持或七层处理。HAProxy 运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的 web 服务器不被暴露到网络上。
Nginx、LVS、HAProxy 是目前使用最为广泛的负载均衡软件一般对负载均衡的使用是随着网站规模的提升,根据不同阶段使用不同技术,如果是中小型 Web 应用,日 PV 小于 1000 万,Nginx 足以,大型网站以及重要的服务,且服务器较多时,可考虑用 LVS。
一种是通过硬件来进行进行,常见的硬件有比较昂贵的 F5 和 Array 等商用的负载均衡器(F5 的负载均衡业界占用率最高,ARRAY 的 VPN 比 F5 强)它的优点就是有专业的维护团队来对这些服务进行维护、缺点就是花销太大,所以对于规模较小的网络服务来说暂时还没有需要使用。另外一种就是类似于 Nginx/LVS/HAProxy 的基于 Linux 的开源免费的负载均衡软件,这些都是通过软件级别来实现,所以费用非常低廉。
目前关于网站架构一般比较合理流行的架构方案:Web 前端采用 Nginx/HAProxy+Keepalived 作负载均衡器;后端采用 MySQL 数据库一主多从和读写分离,采用 LVS+Keepalived 的架构。(具体根据项目需求制定方案)
一、Nginx 优点:
1、工作在网络 7 层之上,可针对 http 应用做一些分流的策略,如针对域名、目录结构,它的正规规则比 HAProxy 更为强大和灵活,所以,目前为止广泛流行。
2、Nginx 对网络稳定性的依赖非常小,理论上能 ping 通就能进行负载功能。
3、Nginx 安装与配置比较简单,测试也比较方便,基本能把错误日志打印出来。
4、可以承担高负载压力且稳定,硬件不差的情况下一般能支撑几万次的并发量,负载度比 LVS 小。
5、Nginx 可以通过端口检测到服务器内部的故障,如根据服务器处理网页返回的状态码、超时等,并会把返回错误的请求重新提交到另一个节点。
6、不仅仅是优秀的负载均衡器 / 反向代理软件,同时也是强大的 Web 应用服务器。LNMP 也是近些年非常流行的 Web 架构,在高流量环境中稳定性也很好。
7、可作为中层反向代理使用。
8、可作为静态网页和图片服务器。
9、Nginx 社区活跃,第三方模块非常多,相关的资料在网上比比皆是。
Nginx 常规的和 HTTP 请求和相应流程图:
Nginx 缺点:
1、适应范围较小,仅能支持 http、https、Email 协议。
2、对后端服务器的健康检查,只支持通过端口检测,不支持 url 来检测。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,Nginx 会把上传切到另一台服务器重新处理,而 LVS 就直接断掉了,如果是上传一个很大的文件或者很重要的文件的话,用户可能会因此而不满。
二、LVS 优点:
1、抗负载能力强、是工作在网络 4 层之上仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的,对内存和 cpu 资源消耗比较低。
2、配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率。
3、工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案,如 LVS+Keepalived,不过我们在项目实施中用得最多的还是 LVS/DR+Keepalived。
4、无流量,LVS 只分发请求,而流量并不从它本身出去,这点保证了均衡器 IO 的性能不会收到大流量的影响。
5、应用范围比较广,因为 LVS 工作在 4 层,所以它几乎可以对所有应用做负载均衡,包括 http、数据库、在线聊天室等等。
LVS DR(Direct Routing) 模式的网络流程图:
LVS 的缺点:
1、软件本身不支持正则表达式处理,不能做动静分离;而现在许多网站在这方面都有较强的需求,这个是 Nginx/HAProxy+Keepalived 的优势所在。
2、如果是网站应用比较庞大的话,LVS/DR+Keepalived 实施起来就比较复杂了,特别后面有 Windows Server 的机器的话,如果实施及配置还有维护过程就比较复杂了,相对而言,Nginx/HAProxy+Keepalived 就简单多了。
三、HAProxy 优点:
1、HAProxy 是支持虚拟主机的,可以工作在 4、7 层 (支持多网段)
2、HAProxy 的优点能够补充 Nginx 的一些缺点,比如支持 Session 的保持,Cookie 的引导;同时支持通过获取指定的 url 来检测后端服务器的状态。
3、HAProxy 跟 LVS 类似,本身就只是一款负载均衡软件;单纯从效率上来讲 HAProxy 会比 Nginx 有更出色的负载均衡速度,在并发处理上也是优于 Nginx 的。
4、HAProxy 支持 TCP 协议的负载均衡转发,可以对 MySQL 读进行负载均衡,对后端的 MySQL 节点进行检测和负载均衡,大家可以用 LVS+Keepalived 对 MySQL 主从做负载均衡。
5、HAProxy 负载均衡策略非常多,HAProxy 的负载均衡算法现在具体有如下 8 种
① roundrobin
表示简单的轮询,每个服务器根据权重轮流使用,在服务器的处理时间平均分配的情况下这是最流畅和公平的算法。该算法是动态的,对于实例启动慢的服务器权重会在运行中调整。最大支持 4095 个后端主机;
② leastconn
连接数最少的服务器优先接收连接。leastconn 建议用于长会话服务,例如 LDAP、SQL、TSE 等,而不适合短会话协议。如 HTTP. 该算法是动态的,对于实例启动慢的服务器权重会在运行中调整。
③ static-rr
每个服务器根据权重轮流使用,类似 roundrobin,但它是静态的,意味着运行时修改权限是无效的。另外,它对服务器的数量没有限制。该算法一般不用;
④ source
对请求源 IP 地址进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个客户端 IP 地址总是访问同一个服务器。如果哈希的结果随可用服务器数量而变化,那么客户端会定向到不同的服务器;该算法一般用于不能插入 cookie 的 Tcp 模式。它还可以用于广域网上为拒绝使用会话 cookie 的客户端提供最有效的粘连;该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。
⑤ uri
表示根据请求的 URI 左端(问号之前)进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个 URI 地址总是访问同一个服务器。一般用于代理缓存和反病毒代理,以最大限度的提高缓存的命中率。该算法只能用于 HTTP 后端;该算法一般用于后端是缓存服务器;该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。
⑥ url_param
在 HTTP GET 请求的查询串中查找 <param> 中指定的 URL 参数,基本上可以锁定使用特制的 URL 到特定的负载均衡器节点的要求;该算法一般用于将同一个用户的信息发送到同一个后端服务器;该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。
⑦ hdr(name)
在每个 HTTP 请求中查找 HTTP 头 <name>,HTTP 头 <name> 将被看作在每个 HTTP 请求,并针对特定的节点;如果缺少头或者头没有任何值,则用 roundrobin 代替;该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。
⑧ rdp-cookie(name)
为每个进来的 TCP 请求查询并哈希 RDP cookie<name>;该机制用于退化的持久模式,可以使同一个用户或者同一个会话 ID 总是发送给同一台服务器。如果没有 cookie,则使用 roundrobin 算法代替;该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。
haproxy 的工作模型图:
HAPorxy 缺点:
- 不支持 POP/SMTP 协议
- 不支持 SPDY 协议
- 不支持 HTTP cache 功能。现在不少开源的 lb 项目,都或多或少具备 HTTP cache 功能。
- 重载配置的功能需要重启进程,虽然也是 soft restart,但没有 Nginx 的 reaload 更为平滑和友好。
- 多进程模式支持不够好。
参考链接: