负载均衡(Load Balance)是应用于互联网后台系统架构设计中的各层,它将请求均匀分摊到多个操作单元上执行。
目前,在线上环境中应用较多的负载均衡器硬件有F5 BIG-IP,但是硬件设备昂贵,不如软件适应互联网公司的快速发展。最常用的负载均衡软件有LVS、HAProxy和Nginx,结合高可用软件有Heartbeat、Keepalived,可以搭建出承载海量请求的成熟架构如LVS Keepalived、HAProxy keepalived等.
领取方式见文末
一、LVS
自学资料:使用 LVS 实现负载均衡原理及安装配置详解 思维导图
LVS 是 Linux Virtual Server 的简称,也就是 Linux 虚拟服务器。现在 LVS 已经是 Linux 标准内核的一部分,从 Linux2.4 内核以后,已经完全内置了 LVS 的各个功能模块,无需给内核打任何补丁,可以直接使用 LVS 提供的各种功能。
LVS 自从1998年开始,发展到现在已经是一个比较成熟的技术项目了。
1、LVS 的体系结构
LVS 架设的服务器集群系统有三个部分组成:
最前端的负载均衡层,用 Load Balancer 表示
中间的服务器集群层,用 Server Array 表示
最底端的数据共享存储层,用 Shared Storage 表示
2、LVS 负载均衡机制
LVS 不像 HAProxy 等七层软负载面向的是 HTTP 包,所以七层负载可以做的 URL 解析等工作,LVS 无法完成。
LVS 是四层负载均衡,也就是说建立在 OSI 模型的第四层——传输层之上,传输层上有我们熟悉的 TCP/UDP,LVS 支持 TCP/UDP 的负载均衡。因为 LVS 是四层负载均衡,因此它相对于其它高层负载均衡的解决办法,比如 DNS 域名轮流解析、应用层负载的调度、客户端的调度等,它的效率是非常高的。
NAT 模式下,网络数据报的进出都要经过 LVS 的处理。LVS 需要作为 RS(真实服务器)的网关。
4、DR 模式:直接路由
DR 模式下需要 LVS 和 RS 集群绑定同一个 VIP(RS 通过将 VIP 绑定在 loopback 实现),但与 NAT 的不同点在于:请求由 LVS 接受,由真实提供服务的服务器(RealServer,RS)直接返回给用户,返回的时候不经过 LVS。
5、LVS 的优点
抗负载能力强、是工作在传输层上仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的,对内存和 cpu 资源消耗比较低。
配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率。
工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案,如 LVS Keepalived。
无流量,LVS 只分发请求,而流量并不从它本身出去,这点保证了均衡器 IO 的性能不会受到大流量的影响。
应用范围比较广,因为 LVS 工作在传输层,所以它几乎可以对所有应用做负载均衡,包括 http、数据库、在线聊天室等等。
6、LVS 的缺点
软件本身不支持正则表达式处理,不能做动静分离;而现在许多网站在这方面都有较强的需求,这个是 Nginx、HAProxy Keepalived 的优势所在。
如果是网站应用比较庞大的话,LVS/DR Keepalived 实施起来就比较复杂了,相对而言,Nginx / HAProxy Keepalived 就简单多了。
二、Nginx
自学资料:nginx官方中文文档 思维导图
文件太大,这里只显示部分截图:
Nginx 是一个强大的 Web 服务器软件,用于处理高并发的 HTTP 请求和作为反向代理服务器做负载均衡。具有高性能、轻量级、内存消耗少,强大的负载均衡能力等优势。
1、Nignx 的架构设计
相对于传统基于进程或线程的模型(Apache就采用这种模型)在处理并发连接时会为每一个连接建立一个单独的进程或线程,且在网络或者输入/输出操作时阻塞。这将导致内存和 CPU 的大量消耗,因为新起一个单独的进程或线程需要准备新的运行时环境,包括堆和栈内存的分配,以及新的执行上下文,当然,这些也会导致多余的 CPU 开销。最终,会由于过多的上下文切换而导致服务器性能变差。
反过来,Nginx 的架构设计是采用模块化的、基于事件驱动、异步、单线程且非阻塞。
Nginx 大量使用多路复用和事件通知,Nginx 启动以后,会在系统中以 daemon 的方式在后台运行,其中包括一个 master 进程,n(n>=1) 个 worker 进程。所有的进程都是单线程(即只有一个主线程)的,且进程间通信主要使用共享内存的方式。
其中,master 进程用于接收来自外界的信号,并给 worker 进程发送信号,同时监控 worker 进程的工作状态。worker 进程则是外部请求真正的处理者,每个 worker 请求相互独立且平等的竞争来自客户端的请求。请求只能在一个 worker 进程中被处理,且一个 worker 进程只有一个主线程,所以同时只能处理一个请求。(原理同 Netty 很像)
2、Nginx 负载均衡
Nginx 负载均衡主要是对七层网络通信模型中的第七层应用层上的 http、https 进行支持。
Nginx 是以反向代理的方式进行负载均衡的。反向代理(Reverse Proxy)方式是指以代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
Nginx 实现负载均衡的分配策略有很多,Nginx 的 upstream 目前支持以下几种方式:
轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
weight:指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。
ip_hash:每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。
fair(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配。
url_hash(第三方):按访问 url 的 hash 结果来分配请求,使每个 url 定向到同一个后端服务器,后端服务器为缓存时比较有效。
3、Nginx 的优点
跨平台:Nginx 可以在大多数 Unix like OS编译运行,而且也有 Windows 的移植版本;
配置异常简单:非常容易上手。配置风格跟程序开发一样,神一般的配置;
非阻塞、高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数;
事件驱动:通信机制采用 epoll 模型,支持更大的并发连接;
Master/Worker 结构:一个 master 进程,生成一个或多个 worker 进程;
内存消耗小:处理大并发的请求内存消耗非常小。在3万并发连接下,开启的10个 Nginx 进程才消耗150M 内存(15M*10=150M);
内置的健康检查功能:如果 Nginx 代理的后端的某台 Web 服务器宕机了,不会影响前端访问;
节省带宽:支持 GZIP 压缩,可以添加浏览器本地缓存的 Header 头;
稳定性高:用于反向代理,宕机的概率微乎其微;
4、Nginx 的缺点
Nginx 仅能支 持http、https 、tcp、 Email等协议,这样就在适用范围上面小些,这个是它的缺点;
对后端服务器的健康检查,只支持通过端口来检测,不支持通过 ur l来检测。不支持 Session 的直接保持,但能通过 ip_hash 来解决;
三、HAProxy
自学资料:HAProxy实战文档 思维导图
HAProxy 支持两种代理模式 TCP(四层)和HTTP(七层),也是支持虚拟主机的。
HAProxy 的优点能够补充 Nginx 的一些缺点,比如支持 Session 的保持,Cookie 的引导;同时支持通过获取指定的 url 来检测后端服务器的状态。
HAProxy 跟 LVS 类似,本身就只是一款负载均衡软件;单纯从效率上来讲 HAProxy 会比 Nginx 有更出色的负载均衡速度,在并发处理上也是优于 Nginx 的。HAProxy 支持 TCP 协议的负载均衡转发,可以对 MySQL 读进行负载均衡,对后端的 MySQL 节点进行检测和负载均衡,大家可以用 LVS Keepalived 对 MySQL 主从做负载均衡。
如何获取以上资源