负载均衡(nginx,LVS)工作原理

本贴最后更新于 1273 天前,其中的信息可能已经时移世异

根据规模的提升在不同的阶段需要使用不同的技术和架构,具体的需求需要具体分析,如果是中小型的web应用,比如日活跃小于1000万,使用nginx就可以完全满足了;大型网站或重要的服务,并且服务比较多时,就可以考虑使用LVS

一、Nginx

Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。

Nginx特点是占有内存少,并发能力强,nginx的并发能力在同类型的网页服务器中表现较好。

Nginx的简单架构:

image.png

  1. Nginx的架构设计

Nginx的架构设计采用的是模块化的,基于事件驱动、异步、单线程且非阻塞(epoll模型)

Nginx使用多路复用和事件通知,Nginx启动后,在后台以daemon的方式在系统中运行,其中会包括一个主(master)进程,n(n≥1)个工作(worker)进程。所有的进程都是单线程(即只有一个主线程)的,进程间通信主要使用共享内存的方式。

其中,master进程用于接收外部的请求,发送信号给worker进程,同时监控worker进程的工作状态。worker进程用来处理外部请求信息,请求只能在一个worker进程中被处理,一个worker进程只有一个主线程,同时只能处理一个请求。

  1. Nginx负载均衡

Nginx负载均衡是对七层网络通信模型中的应用层(HTTP,HTTPS)进行的。

Nginx是以反向代理的方式进行负载均衡

反向代理:是以代理服务器来接收用户的请求,然后将请求发给内部网络上的服务器,并将服务器上的结果返回给请求的客户端,此时代理服务器就是一个服务器。

负载均衡:就是将这些客户端的请求按照某种策略分摊到后台多台服务器上面,进行处理。

Nginx 的upstream目前支持6种算法分配方式:

image.png

①、轮询

  最基本的配置方法,它是upstream模块默认的负载均衡默认策略。每个请求会按时间顺序逐一分配到不同的后端服务器。

有如下参数:

image.png

示例:在30秒内错误次数超过2次,就认为服务器已经不能访问了,下次就不会访问该机器

server 10.168.226.1:8080 max_fails=2 fail_timeout=30s;

server 10.168.226.2:8080 max_fails=2 fail_timeout=30s;

②、weight

  权重方式,在轮询策略的基础上指定轮询的几率

server 10.168.226.1:8080 weight=1 ;

server 10.168.226.2:8080 weight=2;

注意:

权重越高分配到需要处理的请求越多。

此策略比较适合服务器的硬件配置差别比较大的情况。

③、ip_hash

  指定负载均衡器按照基于客户端IP的分配方式,这个方法确保了相同的客户端的请求一直发送到相同的服务器,以保证session会话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题。

ip_hash; #保证每个访客固定访问一个后端服务器

server 10.168.226.1:8080 weight=1 ;

server 10.168.226.2:8080 weight=2;

注意:

ip_hash在nginx1.3版本之后才有的



ip_hash不能与backup同时使用



这种策略适合有状态服务,比如session



当有服务器需要剔除,必须手动down掉

④、least_conn

把请求转发给连接数较少的后端服务器,轮询算法是把请求平均的转发给各个后端服,使它们的负载

大致相同,但是,有些请求占用的时间很长,会导致所在的后端负载较高,这种情况下,least_conn

这种方式就可以达到更好的负载均衡效果

least_conn;
server 10.168.226.1:8080 weight=1;

server 10.168.226.2:8080 weight=2;

注意:

这种负载均衡策略适合请求处理时间长短不一致造成服务器过载的情况
⑤、第三方策略

第三方的负载均衡策略的实现需要安装第三方插件(upstream_fair)

① fair

安装服务器端响应时间来分配请求,响应时间段的优先分配

fair;

server 10.168.226.1:8080 weight=1;
server 10.168.226.2:8080 weight=2;

②、url_hash

按访问URL的hash结果来分配请求,是每个URL定向知道同一个后端服务器,要配合缓冲命中来使用

同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高

以及一些资源时间的浪费,而使用url_hash,可以使得同一个URL会到达同一台服务器,一段缓存了

资源,再次请求的时候,就可以从缓存中读取,需要hash软件包

hash $request_uri; #实现每个URL定向到同一个后端服务器

server 10.168.226.1:8080 weight=1;
server 10.168.226.2:8080 weight=2;

  1. Nginx的优点
  1. Nginx的缺点

二、LVS

LVS就是Linux虚拟(Virtual Server)服务器。从Linux内核2.4之后,内置了LVS的各个功能模块,就可以直接 使用LVS提供的功能。

  1. LVS的体系 架构

image.png

LVS架构 的服务器集群系统有三个部分 组成:

①、最前端的 负载均衡层,用Load Balancer表示

②、中间的服务器集群层,用Server Array表示

③、最底层的 数据共享层,Shard storage 表示

  1. 负载均衡机制

LVS是四层负载均衡,建立在OSI模型的第四层——传输层之上,传输层有TCP/UDP,相对于其它高层负载均衡的方法,比如DNS域名轮询解析,应用层负载的调度,客户端的调度等,它的效率都非常高。

四层负载均衡:主要通过报文中的目标地址和端口

七层负载均衡:也称为“内容交换”,主要通过报文中的 真正有意义的应用层内容。

LVS的转发主要通过修改IP地址(NAT模式,分为源地址修改SNAT和目标地址修改DNAT)、修改目标MAC(DR模式)来实现。

  1. LVS相关术语

①、 DS:Director Server。指的是前端负载均衡器节点。

②、 RS:Real Server。后端真实的工作服务器。

③、 VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。

④、 DIP:Director Server IP,主要用于和内部主机通讯的IP地址。

⑤、 RIP:Real Server IP,后端服务器的IP地址。

⑥、 CIP:Client IP,访问客户端的IP地址

  1. NAT模式:网络地址转换

NAT(network address transaction)是外网和内网地址映射的技术。

NAT模式下,网络数据的进出都要经过LVS处理,LVS需要作为真实服务器的网关。

image.png

①、当包请求到LVS时,LVS做目标地址转换(DNAT),将目标IP改为 RS的IP。

②、RS处理完,返回响应时,源IP是RS IP,目标IP是客户端的IP。

③、RS的包通过网关(LVS)中转,LVS做源地址转换(SNAT),将包的源地址改为VIP,这样,这个包对客户端来说就像是LVS直接返回给它的。

  1. DR模式:直接路由

DR模式下需要LVS和RS集群绑定同一个VIP,与NAT的不同点在于:

请求由LVS接受,由真实提供服务的服务器(RS)直接发放给用户,返回的时候不经过LVS。

image.png

一个请求过程中,LVS只需要将网络帧的Mac地址修改为某一台RS的MAC,该请求就去会被转发到响应的RS处理,此时的源IP和目标IP都没有变。

RS收到LVS转发来的请求时,链路层发现Mac地址是自己的,当上面的网络层,也发现IP是自己的,于是这个包被合法的接受,RS感知不到前面有RS的存在。当RS返回响应时,只要直接向源IP返回即可,不再经过LVS。

DR负载均衡模式数据分发过程中不修改IP地址,只修改Mac地址,由于实际处理请求的真实物理IP地址和 数据请求目的IP地址一致,所以不需要通过负载均衡服务器进行地址转换,就可以将响应数据直接返回给浏览器,避免服务器网卡带宽成为瓶颈。

DR模式具有较好的性能,也是目前大型网站使用最广泛的一种负载均衡。

  1. LVS的优点

①负载能力强,工作在传输层上仅作为分发的作用,没有流量的产生,对内存和CPU资源消耗比较低

②、配置简单,很容易上手

③、工作稳定,有完整的双机热备方案,如:LVS+Keepalived

④、无流量,LVS只分发请求

⑤、应用范围比较广,LVS工作在传输层,几乎可以对所有应用做负载均衡,包括HTTP,数据库

  1. LVS的缺点

①、软件本身不支持正则表达式,不能做动静方法分离

②、网站应用比较庞大的话,LVS实施起来比较复杂

回帖
请输入回帖内容 ...