你真的掌握LVS、Nginx及HAProxy工作原理吗?( 二 )


详细来看,一个请求过来时,LVS 只需要将网络帧的 MAC 地址修改为某一台 RS 的 MAC,该包就会被转发到相应的 RS 处理,注意此时的源 IP 和目标 IP 都没变,LVS 只是做了一下移花接木 。
RS 收到 LVS 转发来的包时,链路层发现 MAC 是自己的,到上面的网络层,发现 IP 也是自己的,于是这个包被合法地接受,RS 感知不到前面有 LVS 的存在 。
而当 RS 返回响应时,只要直接向源 IP(即用户的 IP)返回即可,不再经过 LVS 。
 

你真的掌握LVS、Nginx及HAProxy工作原理吗?

文章插图
 
 
DR 负载均衡模式数据分发过程中不修改 IP 地址,只修改 Mac 地址,由于实际处理请求的真实物理 IP 地址和数据请求目的 IP 地址一致,所以不需要通过负载均衡服务器进行地址转换 。
可将响应数据包直接返回给用户浏览器,避免负载均衡服务器网卡带宽成为瓶颈 。
【你真的掌握LVS、Nginx及HAProxy工作原理吗?】因此,DR 模式具有较好的性能,也是目前大型网站使用广泛的一种负载均衡手段 。
LVS 的优点如下:
  • 抗负载能力强、是工作在传输层上仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强,对内存和 CPU 资源消耗比较低 。
  • 配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率 。
  • 工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案,如 LVS + Keepalived 。
  • 无流量,LVS 只分发请求,而流量并不从它本身出去,这点保证了均衡器 IO 的性能不会受到大流量的影响 。
  • 应用范围比较广,因为 LVS 工作在传输层,所以它几乎可以对所有应用做负载均衡,包括 HTTP、数据库、在线聊天室等等 。
LVS 的缺点如下:
  • 软件本身不支持正则表达式处理,不能做动静分离;而现在许多网站在这方面都有较强的需求,这个是 Nginx、HAProxy+Keepalived 的优势所在 。
  • 如果是网站应用比较庞大的话,LVS/DR+Keepalived 实施起来就比较复杂了,相对而言,Nginx/HAProxy+Keepalived 就简单多了 。
Nginx
Nginx 是一个强大的 Web 服务器软件,用于处理高并发的 HTTP 请求和作为反向代理服务器做负载均衡 。
 
你真的掌握LVS、Nginx及HAProxy工作原理吗?

文章插图
 
 
它具有高性能、轻量级、内存消耗少,强大的负载均衡能力等优势 。
Nignx 的架构设计
相对于传统基于进程或线程的模型(Apache 就采用这种模型)在处理并发连接时会为每一个连接建立一个单独的进程或线程,且在网络或者输入/输出操作时阻塞 。
这将导致内存和 CPU 的大量消耗,因为新起一个单独的进程或线程需要准备新的运行时环境,包括堆和栈内存的分配,以及新的执行上下文,当然,这些也会导致多余的 CPU 开销 。
最终,会由于过多的上下文切换而导致服务器性能变差 。反过来,Nginx 的架构设计是采用模块化的、基于事件驱动、异步、单线程且非阻塞 。
Nginx 大量使用多路复用和事件通知,Nginx 启动以后,会在系统中以 Daemon 的方式在后台运行,其中包括一个 Master 进程,n(n>=1) 个 Worker 进程 。
所有的进程都是单线程(即只有一个主线程)的,且进程间通信主要使用共享内存的方式 。
其中,Master 进程用于接收来自外界的信号,并给 Worker 进程发送信号,同时监控 Worker 进程的工作状态 。
Worker 进程则是外部请求真正的处理者,每个 Worker 请求相互独立且平等的竞争来自客户端的请求 。
 
你真的掌握LVS、Nginx及HAProxy工作原理吗?

文章插图
 
 
请求只能在一个 Worker 进程中被处理,且一个 Worker 进程只有一个主线程,所以同时只能处理一个请求 。(原理同 Netty 很像)
Nginx 负载均衡
Nginx 负载均衡主要是对七层网络通信模型中的第七层应用层上的 HTTP、HTTPS 进行支持 。Nginx 是以反向代理的方式进行负载均衡的 。
反向代理(Reverse Proxy)方式是指以代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器对外就表现为一个服务器 。
Nginx 实现负载均衡的分配策略有很多,Nginx 的 Upstream 目前支持以下几种方式:


推荐阅读