根据规模的提升在不同的阶段需要使用不同的技术和架构,具体的需求需要具体分析,如果是中小型的 Web 应用。
日活跃小于 1000 万,使用 nginx 就可以完全满足了;
大型网站或重要的服务,并且服务比较多时,就可以考虑使用 LVS。
Nginx
Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。
Nginx 特点是占有内存少,并发能力强,nginx 的并发能力在同类型的网页服务器中表现较好。
Nginx 的简单架构:
1
Nginx 的架构设计
Nginx 的架构设计采用的是模块化的,基于事件驱动、异步、单线程且非阻塞(epoll 模型)
Nginx 使用多路复用和事件通知,Nginx 启动后,在后台以 daemon 的方式在系统中运行,其中会包括一个主(master)进程,n(n≥1)个工作(worker)进程。
所有的进程都是单线程(即只有一个主线程)的,进程间通信主要使用共享内存的方式。
其中,master 进程用于接收外部的请求,发送信号给 worker 进程,同时监控 worker 进程的工作状态。
worker 进程用来处理外部请求信息,请求只能在一个 worker 进程中被处理,一个 worker 进程只有一个主线程,同时只能处理一个请求。
2
Nginx 负载均衡
Nginx 负载均衡是对七层网络通信模型中的应用层(HTTP,HTTPS)进行的。
Nginx 是以反向代理的方式进行负载均衡
反向代理:是以代理服务器来接收用户的请求,然后将请求发给内部网络上的服务器,并将服务器上的结果返回给请求的客户端,此时代理服务器就是一个服务器。
负载均衡:就是将这些客户端的请求按照某种策略分摊到后台多台服务器上面,进行处理。
Nginx 的 upstream 目前支持 6 种算法分配方式:
最基本的配置方法,它是 upstream 模块默认的负载均衡默认策略。每个请求会按时间顺序逐一分配到不同的后端服务器。
有如下参数:
在 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;
权重方式,在轮询策略的基础上指定轮询的几率
server 10.168.226.1:8080 weight=1 ;
server 10.168.226.2:8080 weight=2;
注意:
权重越高分配到需要处理的请求越多。
此策略比较适合服务器的硬件配置差别比较大的情况。
指定负载均衡器按照基于客户端 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;
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;
跨平台:Nginx 可以在 Linux 上编译运行,也可以在 window 上运行
配置简单:直接可以通过简单修改配置文件,容易上手
非阻塞、高并发:官网理论可以支持 5 万并发连接,在实际生产环境也可以跑到 2-3 万的并发
事件驱动:采用 epoll 模型,支持更多的并发连接
内存消耗小:内存和 CPU 占用率低。(为 Apache 的 1/5-1/10)
内置健康检查:Nginx 代理的后端的某台服务器宕机了,会自动不访问该机器
Nginx 仅能支持 HTTP,HTTPS,tcp,email 等协议
不支持直接保存 session,可以通过 ip_hash 来支持
LVS 就是 Linux 虚拟(Virtual Server)服务器。从 Linux 内核 2.4 之后,内置了 LVS 的各个功能模块,就可以直接 使用 LVS 提供的功能。
LVS 架构 的服务器集群系统有三个部分 组成:
最前端的负载均衡层,用 Load Balancer 表示
中间的服务器集群层,用 Server Array 表示
最底层的数据共享层,Shard storage 表示
LVS 是四层负载均衡,建立在 OSI 模型的第四层——传输层之上,传输层有 TCP/UDP,相对于其它高层负载均衡的方法,比如 DNS 域名轮询解析,应用层负载的调度,客户端的调度等,它的效率都非常高。
七层负载均衡:也称为“内容交换”,主要通过报文中的 真正有意义的应用层内容。
DS:Director Server。指的是前端负载均衡器节点。
RS:Real Server。后端真实的工作服务器。
NAT 模式下,网络数据的进出都要经过 LVS 处理,LVS 需要作为真实服务器的网关。
RS 处理完,返回响应时,源 IP 是 RS IP,目标 IP 是客户端的 IP。
DR 模式下需要 LVS 和 RS 集群绑定同一个 VIP,与 NAT 的不同点在于:
请求由 LVS 接受,由真实提供服务的服务器(RS)直接发放给用户,返回的时候不经过 LVS。
DR 模式具有较好的性能,也是目前大型网站使用最广泛的一种负载均衡。
负载能力强,工作在传输层上仅作为分发的作用,没有流量的产生,对内存和 CPU 资源消耗比较低
配置简单,很容易上手
工作稳定,有完整的双机热备方案,如:LVS+Keepalived
无流量,LVS 只分发请求
应用范围比较广,LVS 工作在传输层,几乎可以对所有应用做负载均衡,包括 HTTP,数据库
软件本身不支持正则表达式,不能做动静方法分离
-
网站应用比较庞大的话,LVS 实施起来比较复杂