当前位置: 首页 > 科技观察

本文详细讲解了LVS、Nginx和HAProxy的工作原理

时间:2023-03-20 21:01:43 科技观察

目前大多数互联网系统都采用服务器集群技术。集群就是将同一个服务部署在多台服务器上,形成一个集群,作为一个整体对外提供服务。这些集群可以是Web应用服务器集群,也可以是数据库服务器集群,或者分布式缓存服务器集群等等。在实际应用中,web服务器集群之前总会有一个负载均衡服务器。负载均衡器的任务是作为Web服务器流量的入口,选择最合适的Web服务器,将客户端的请求转发给它处理。从客户端到真实服务器的透明转发。近几年非常流行的“云计算”和分布式架构,本质上是使用后端服务器作为计算资源和存储资源,由管理服务器打包成一个服务对外提供服务。客户端不需要关心实际的服务提供者。到底是哪台机器,从它的角度看,它面对的似乎是一台几乎具备***能力的服务器,但本质上,真正提供服务的还是后端集群。LVS、Nginx、HAProxy是目前使用最广泛的三种软件负载均衡软件。负载均衡的一般用途是随着网站规模的增大,根据不同的阶段采用不同的技术。具体的应用需求需要具体分析。如果是中小型Web应用,比如日PV小于1000万,可以使用Nginx;如果机器多,可以使用DNS轮询,LVS还是比较消耗机器的。当有大型网站或重要服务,且服务器较多时,可以考虑使用LVS。目前网站架构一般有合理且流行的架构方案:web前端采用Nginx/HAProxy+Keepalived作为负载均衡器;后端采用一主多从、读写分离的MySQL数据库,采用LVS+Keepalived架构。LVSLVS是LinuxVirtualServer的缩写,即Linux虚拟服务器。现在LVS已经是Linux标准内核的一部分。从Linux2.4内核开始,已经完全内置了LVS的各种功能模块,可以直接使用LVS提供的各种功能,无需对内核打任何补丁。LVS自1998年起步以来,已经成为一个比较成熟的技术项目。LVS的架构LVS搭建的服务器集群系统由三部分组成:(1)前端负载均衡层,以LoadBalancer为代表(2)中间的服务器集群层,以ServerArray(3)最末端的数据SharedStorage层,用SharedStorage来表示LVS负载均衡机制。LVS不像HAProxy等面向HTTP数据包的七层软负载,所??以七层负载可以做的URL解析等工作,LVS无法完成。LVS是四层负载均衡,也就是说,它建立在OSI模型的第四层——传输层之上。传输层有大家熟悉的TCP/UDP。LVS支持TCP/UDP负载均衡。因为LVS是一个四层的负载均衡方案,相对于其他高层的负载均衡方案,比如DNS轮流解析域名,应用层负载调度,客户端调度等,效率是非常高的。所谓四层负载均衡,主要是利用报文中的目的地址和端口。七层负载均衡,又称“内容交换”,主要是通过报文中真正有意义的应用层内容。LVS转发主要通过修改IP地址(NAT模式,分为源地址修改SNAT和目的地址修改DNAT)和修改目标MAC(DR模式)来实现。NAT模式:网络地址转换NAT(NetworkAddressTranslation)是一种外部网络和内部网络地址映射的技术。在NAT模式下,传入和传出的网络数据报必须经过LVS处理。LVS需要充当RS(RealServer)的网关。当数据包到达LVS时,LVS进行目标地址转换(DNAT),将目标IP更改为RS的IP。RS收到包后,好像是client直接发送的。RS处理完返回一个response后,源IP就是RS的IP,目的IP就是客户端的IP。此时RS包通过网关(LVS)中转,LVS会进行源地址转换(SNAT),将包的源地址改为VIP。这样,数据包在客户端看来就好像是LVS直接返回的一样。DR模式:在直接路由DR模式下,LVS和RS集群需要绑定同一个VIP(RS是通过绑定VIP到loopback实现的),但与NAT的区别在于请求由LVS接受,而实际提供服务的服务器(RealServer,RS)则直接返回给用户,无需经过LVS。具体来说,当有请求到来时,LVS只需要将网络帧的MAC地址修改为某个RS的MAC,数据包就会转发给相应的RS进行处理。改,LVS只是做了一点嵌入。当RS收到LVS转发的数据包时,链路层发现MAC是自己的,再到网络上层发现IP也是自己的,所以数据包是合法接受的,RS不能感知到眼前LVS的存在。RS返回响应时,只需要直接返回源IP(即用户的IP)即可,无需经过LVS。DR负载均衡模式下,数据分发过程中不修改IP地址,只修改mac地址。由于实际处理请求的真实物理IP地址与数据请求的目的IP地址是一致的,所以不需要通过负载均衡服务器进行地址转换,响应数据可以直接包返回给用户的浏览器,避免负载均衡服务器的网卡带宽成为瓶颈。因此,DR模式具有更好的性能,是目前大型网站使用最广泛的负载均衡方式。LVS的优点是抗负载能力强,工作在传输层只做分发,不产生流量。这个特性也决定了它在负载均衡软件中的最佳性能。与内存和CPU资源消耗相比低。可配置性比较低,既是缺点也是优点。因为可以配置的东西不多,不需要太多接触,大大减少了人为出错的几率。工作稳定,因为抗负载能力强,有完善的双机热备方案,如LVS+Keepalived。没有流量,LVS只分发请求,流量不会从自己出去,保证了balancerIO的性能不会因为大流量而受到影响。适用范围比较广,因为LVS工作在传输层,所以几乎可以对所有的应用进行负载均衡,包括http、数据库、在线聊天室等等。LVS的缺点软件本身不支持正则表达式处理,不能做动静分离;而且现在很多网站对这方面的要求比较强,这就是Nginx和HAProxy+Keepalived的优势。如果网站应用比较大,LVS/DR+Keepalived的实现比较复杂。相对来说Nginx/HAProxy+Keepalived要简单的多。NginxNginx是一个强大的web服务器软件,作为一个反向代理服务器用来处理高并发的HTTP请求和负载均衡。具有高性能、轻量级、低内存消耗、强大的负载均衡能力等优点。与传统的基于进程或线程的模型(Apache采用这种模型)相比,Nignx的架构设计在处理并发连接时为每个连接创建一个单独的进程或线程,并在网络或输入/输出操作期间阻塞。这会导致内存和CPU的大量消耗,因为启动一个单独的进程或线程需要准备一个新的运行环境,包括堆和栈内存的分配,以及一个新的执行上下文。当然,这些也会造成冗余的CPU开销。最终,服务器性能将因过多的上下文切换而受到影响。反过来,Nginx的架构设计是模块化的、事件驱动的、异步的、单线程的和非阻塞的。Nginx广泛使用多路复用和事件通知。Nginx启动后,在系统中作为守护进程运行在后台,包括一个master进程和n(n>=1)个worker进程。所有进程都是单线程的(即只有一个主线程),进程间通信主要使用共享内存。其中master进程用于接收外界信号,向worker进程发送信号,监控worker进程的工作状态。worker进程是外部请求的真正处理者,每个worker请求都是独立的,与client的请求平等竞争。一个请求只能在一个worker进程中处理,一个worker进程只有一个主线程,所以一次只能处理一个请求。(原理和Netty很相似)Nginx负载均衡Nginx负载均衡在七层网络通信模型中主要支持第七层应用层的http和https。Nginx以反向代理的形式进行负载均衡。反向代理(ReverseProxy)模式是指代理服务器接受Internet上的连接请求,然后将请求转发给内网服务器,并将从服务器得到的结果返回给Internet上请求连接的客户端.此时,代理服务器对外充当服务器。Nginx有很多分布策略来实现负载均衡。Nginx的upstream目前支持以下几种方式:Roundrobin(默认):每个请求按照时间顺序一个接一个分配到不同的后端服务器。如果后台服务器宕机,它可以自动移除。weight:轮询概率。权重与访问率成正比,在后端服务器性能参差不齐时使用。ip_hash:每个请求根据访问ip的hash结果分配,让每个访问者固定访问一个后端服务器,可以解决session问题。fair(thirdparty):根据后端服务器的响应时间分配请求,响应时间短的优先。url_hash(third-party):根据访问的url的hash结果来分配请求,让每个url指向同一个后端服务器,当后端服务器是缓存时更有效。Nginx的优点跨平台:Nginx可以在大多数UnixlikeOS上编译运行,也有Windows的移植版本。配置极其简单:非常易于使用。配置风格与程序开发一致,神级配置无阻塞高并发:官方测试可支持5万并发,实际跑到2万到3万并发生产环境。事件驱动:通信机制采用epoll模型,支持更大的并发连接Master/Worker结构:一个master进程生成一个或多个worker进程内存消耗小:处理大并发请求消耗的内存很少。30000个并发连接下,仅启动10个Nginx进程,消耗150M内存(15M*10=150M)内置健康检查功能:如果Nginx代理后端的web服务器宕机,不会影响前端-端访问节省带宽:支持GZIP压缩,可以添加浏览器本地缓存的header稳定性高:用于反向代理,宕机概率很小Nginx的缺点Nginx只能支持http、https和Email协议,所以它适用范围较小,这是它的缺点。后端服务器的健康检查只支持通过端口检测,不支持通过url检测。不支持直接维护Session,但是可以通过ip_hash解析HAProxy。HAProxy支持TCP(四层)和HTTP(七层)两种代理模式,也支持虚拟主机。HAProxy的优点可以补充Nginx的一些缺点,比如支持session保持和cookie引导;同时支持通过获取指定的url来检测后台服务器的状态。类似于LVS,HAProxy本身只是一个负载均衡软件;单从效率上来说,HAProxy的负载均衡速度会比Nginx好,在并发处理上也比Nginx好。HAProxy支持TCP协议的负载均衡和转发。它可以负载平衡MySQL读取,检测和负载平衡后端MySQL节点。可以使用LVS+Keepalived对MySQL主从进行负载均衡。HAProxy的负载均衡策略有很多种:Round-robin(轮询)、Weight-round-robin(有权限的round-robin)、source(保留原始地址)、RI(请求URL)、rdp-cookie(根据cookie).