背景
随着互联网业务的迅猛发展,大型电商平台和门户网站对系统的可用性和可靠性要求越来越高,高可用集群、负载均衡集群成为一种热门的系统架构解决方案。在众多的负载均衡集群解决方案中,有基于硬件的负载均衡设备,例如F5、Big-IP等,也有基于软件的负载均衡产品,例如HAProxy、LVS、Nginx等,在软件的负载均衡产品中,又分为两种实现方式,分别是基于操作系统的软负载实现和基于第三方应用的软负载实现。LVS就是基于Linux操作系统实现的一种软负载均衡,而Nginx、HAProxy就是基于第三应用实现的软负载均衡,本文将对比一下HAProxy、LVS。
Haproxy
介绍
HAProxy是法国人Willy Tarreau 使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全地整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
特点
- 可靠性和稳定性非常好,可以与硬件级的F5负载均衡设备相媲美;
- 最高可以同时维护40000-50000个并发连接,单位时间内处理的最大请求数为20000个,最大处理能力可达10Git/s;
- 支持多达8种负载均衡算法,同时也支持会话保持;
- 支持虚拟机主机功能,从而实现web负载均衡更加灵活;
- 支持连接拒绝、全透明代理等独特的功能;
- 拥有强大的ACL支持,用于访问控制;
- 其独特的弹性二义树数据结构,使数据结构的复杂性上升到了0(1),即数据的查寻速度不会随着数据条日的增加而速度有所下降;·支持客户端的keepalive功能,减少客户端与haproxy的多次三次握手导致资源浪费,让多个请求在一个tcp连接中完成;
- 支持TCP加速,零复制功能,类似于mmap机制;
- 支持响应池(response buffering) ;
- 支持RDP协议;
- 基于源的粘性,类似nginx的ip hash功能,把来自同一客户端的请求在一定时间内始终调度到上游的同一服务器;·更好统计数据接口,其web接口显示后端集群中各个服务器的接收、发送、拒绝、错误等数据的统计信息;
- 详细的健康状态检测,web接口中有关于对上游服务器的健康检测状态,并提供了一定的管理功能;
- 基于流量的健康评估机制;
- 基于http认证;
- 基于命令行的管理接口;
- 日志分析器,可对日志进行分析。
负载均衡
负载均衡算法
- roundrobin:表示简单的轮询,这个不多说,这个是负载均衡基本都具备的;
- static-rr:表示根据权重
- leastconn:表示最少连接者先处理
- source:表示根据请求源 IP,这个跟 Nginx 的 IP_hash 机制类似
- ri:表示根据请求的 URI;
- rl_param:表示根据请求的 URl 参数’balance url_param’ requires an URLparameter name;
- hdr(name):表示根据 HTTP 请求头来锁定每一次 HTTP 请求;
- rdp-cookie(name):表示根据据 cookie(name)来锁定并哈希每一次 TCP 请求。
架构
HAProxy实现的是一种事件驱动、单一进程的架构模型,此类模型的优点在于能够支撑高并发大规模的连接。反之,多进程或多线程模型受内存和系统调度器的限制以及无处不在的锁限制,很难应对数以万计的高并发连接。HAProxy支持连接拒绝,通过拒绝连接,可以限制某些非法或有意的攻击型连接,从而降低其对网站带来的危害。这一功能已成为目前应对小型 DDOS攻击的主要方法之一,并且其他负载均衡器很难做到这点。此外, HAProxy还支持全透明代理,即可以将客户端地址或者任何指定地址直接连接到后端服务器,通过全透明代理,可以不用修改某些特殊服务器地址而使其直接接收并处理部分特定流量。
工作模式
- tcp模式:该模式下,在客户端和服务器之间将建立一个全双工的连接,且不会对7层的报文做任何处理的简单模式。此模式默认,通常用于SSL、SSH、SMTP应用。
- http模式(一般使用):该模式下,客户端请求在转发给后端服务器之前会被深度分析,所有不与RFC格式兼容的请求都会被拒绝。
- health模式 : 仅做健康检查
LVS
介绍
LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,从 Linux 2.4 内核以后,已经完全内置了 LVS 的各个功能模块,无需给内核打任何补丁,可以直接使用 LVS 提供的各种功能。LVS 自从 1998 年开始,发展到现在已经是一个比较成熟的技术项目了。lvs 负载均衡在高并发的 web 开发中得到了广泛的应用。使用 LVS 可以达到的技术目标是,通过 LVS 达到的负载均衡技术和 Linux 操作系统可以实现一个高性能高可用的Linux 服务器集群,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。LVS 是一个实现负载均衡集群的开源软件项目,LVS 架构从逻辑上可分为调度层、Server 集群层和共享存储。
特点
- 首先它是基于4层的网络协议的,抗负载能力强,对于服务器的硬件要求除了网卡外,其他没有太多要求;
- 配置性比较低,这是一个缺点也是一个优点,因为没有太多配置的东西,大大减少了人为出错的几率;
- 应用范围比较广,不仅仅对web服务做负载均衡,还可以对其他应用(mysql)做负载均衡;
- LVS架构中存在一个虚拟IP的概念,需要向IDC多申请一个IP来做虚拟IP。
负载均衡
负载均衡算法
静态方法,仅依据算法本身进行轮询调度
- 轮询调度:轮询调度(Round Robin 简称'RR')算法就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是实现简单
- 加权轮询调度:加权轮询(Weight Round Robin 简称'WRR')算法主要是对轮询算法的一种优化与补充,LVS会考虑每台服务器的性能,并给每台服务器添加一个权值,权值越高的服务器,处理的请求越多。
- 源地址散列调度:源地址散列调度(Source Hashing 简称'SH')算法先根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且并未超载,将请求发送到该服务器,否则返回空
- 目标地址散列调度:目标地址散列调度(Destination Hashing 简称'DH')算法先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且并未超载,将请求发送到该服务器,否则返回空
动态方法,根据算法及RS的当前负载状态进行调度
- 最小连接调度:最小连接调度(Least Connections 简称'LC')算法是把新的连接请求分配到当前连接数最小的服务器
- 加权最小连接调度:加权最少连接(Weight Least Connections 简称'WLC')算法是最小连接调度的超集,各个服务器相应的权值表示其处理性能,调度器可以自动问询真实服务器的负载情况,并动态地调整其权值
- 基于局部的最少连接:基于局部的最少连接调度(Locality-Based Least Connections 简称'LBLC')算法是针对请求报文的目标IP地址的 负载均衡调度
- 带复制的基于局部性的最少连接:带复制的基于局部性的最少连接(Locality-Based Least Connections with Replication 简称'LBLCR')算法也是针对目标IP地址的负载均衡
- 最短的期望的延迟:最短的期望的延迟调度(Shortest Expected Delay 简称'SED')算法基于WLC算法
- 最少队列调度:最少队列调度(Never Queue 简称'NQ')算法,无需队列。如果有realserver的连接数等于0就直接分配过去,不需要在进行SED运算
架构
工作原理
- 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间
- PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链
- IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链
- POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器
LVS的组成
LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。
- ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
- ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)
工作模式
- lvs-nat:修改请求报文的目标IP,多目标的IP的DNSAT,支持端口映射,节省公有IP地址,但是请求和响应报文都要经过Director转发;极高负载时,Director可能成为系统瓶颈。
- lvs-dr: 为请求报文重新封装一个MAC首部进行转发。RIP可以使用私有地址,也可以使用公网地址。但是不支持端口映射,不能跨局域网。
- lvs-tun: 在原请求报文之外新增加一个IP首部。RIP,VIP,DIP都应该使用公网地址,且RS网关不指向DIP;但是不支持端口映射,RS的OS必须支持隧道功能,隧道技术会额外花费性能,增大开销
- lvs-fullnat:修改请求报文的源和目标IP。FULLNAT一个最大的问题是RealServer无法获得用户IP
总结
两者都是软件负载均衡产品,但是LVS是基于Linux操作系统实现的一种软负载均衡,而HAProxy是基于第三应用实现的软负载均衡。LVS是基于四层的IP负载均衡技术,而HAProxy是基于四层和七层技术、可提供TCP和HTTP应用的负载均衡综合解决方案。LVS工作在ISO模型的第四层,因此其状态监测功能单一,而HAProxy在状态监测方面功能强大,可支持端口、URL、脚本等多种状态检测方式。HAProxy虽然功能强大,但是整体处理性能低于四层模式的LVS负载均衡,而LVS拥有接近硬件设备的网络吞吐和连接负载能力。大型网站架构,对性能有严格要求的时候可以使用lvs或者硬件F5,单从负载均衡的角度来说,lvs也许会成为主流,更适合现在大型的互联网公司,中型网站架构:对于页面分离请求由明确规定,并且性能有严格要求时,可以使用haproxy。
本文暂时没有评论,来添加一个吧(●'◡'●)