当前大多数的互联网系统都使用了服务器集群技术,集群是将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是 Web 应用服务器集群,也可以是数据库服务器集群,还可以是分布式缓存服务器集群等等。
一、什么是负载均衡(Load Balancer,LB)
LB,既负载均衡(Load Balancer),是高并发、高可用系统必不可少的关键组件,其目标是尽力将网络流量平均分发到多个服务器上,以提高系统整体的响应速度和可用性。
二、负载均衡的主要作用:
- 高并发:负载均衡通过算法调整负载,尽力均匀的分配应用集群中的各结点的工作量。从而提升整个应用集群处理并发的能力(吞吐量)
- 伸缩性:添加或减少服务器数量,然后由负载均衡分发控制。使集群具备伸缩性。
- 高可用:负载均衡器可以监控候选服务器,当服务器不可用时,自动跳转,将请求分发给可用的服务器。使服务集群具有高可用特性。
- 安全防护:负载均衡软件或硬件提供了安全性功能;如防护墙,黑名单、防攻击。
三、负载均衡的优点
- 减少公网IP数量,节省IP支出成本。
- 异常内部服务器IP,提高内部服务器安全性。
- 解决单机故障问题,提供高并发下高可用的策略。
- 在用户无感知情况下,做WEB服务器的动态水平拓展。
- 支持四层和七层负载,对四层性能更好,支持服务器的动态上下线。
- 性能强,并发数可达数万至数十万。
- 配置简单,有固定格式的配置文件。
四、负载均衡的分类
负载均衡已出现很久的技术,并不是什么黑科技,根据不同的维度可以进行不同的分类。
4.1 载体维度分类
从支持负载均衡的载体来看,可以将负载均衡分为两类:硬件负载均衡、软件负载均衡;
4.1.1 硬件负载均衡
硬件负载均衡:一般是在定制处理器上运行的独立负载均衡服务器,价格昂贵,土豪专属。
硬件负载均衡的主流产品:F5Big-IP,Citrix(思杰)Netscaler
硬件负载均衡优点:
- 功能强大:支持全局负载均衡并提供较全面的、复杂的负载均衡算法。
- 性能强悍:硬件负载均衡由于是在专用处理器上运行,因此吞吐量大,可支持单机百万以上的并发。
- 安全性高:往往具备防火墙,防 DDos 攻击等安全功能。
硬件负载均衡缺点:
- 成本昂贵:购买和维护硬件负载均衡的成本都很高。
- 扩展性差:当访问量突增时,超过限度不能动态扩容。
4.1.2 软件负载均衡
软件负载均衡从软件层面实现负载均衡,一般可以在任何标准物理设备上运行,
软件负载均衡主流产品:Nginx、HAProxy、LVS。
- LVS可以作为四层负载均衡器,其负载均衡的性能优于Nginx。
- HAProxy可以作为HTTP和TCP负载均衡器。
- Nginx、HAProxy可以作为四层或七层负载均衡器。
软件负载均衡优点:
- 成本低廉:只要每个Liunx服务器,然后装上Nginx或其他负载均衡软件即可。
- 灵活:7层和4层负载均衡可以根据业务进行选择,有可以根据业务进行比较方便的扩展,比如:由于业务特殊需要做一些定制化的功能。
- 扩展性好:适应动态变化,可以通过添加软件负载均衡实例,动态扩展到超出初始容量的能力
软件负载均衡缺点:
- 性能一般:比起硬件来说支撑并发数不大。
- 功能没有硬件强大
- 安全性没有硬件负载均衡高
4.2 网络通讯进行分类
软件负载均衡从通信层面来看,又可以分为四层和七层负载均衡。
4.2.1 四层负载均衡
基于 IP 地址和端口进行请求的转发,可基于IP的负载均衡及其基于MAC地址ID负载均衡。
4.2.2 七层负载均衡
基于HTTP头部请求、URL 信息将请求转发到特定的主机。主要方式有:DNS负载均衡、HTTP负载均衡、反向代理负载均衡、IP负载均衡、 数据链路层负载均衡等。
DNS负载均衡:负载均衡工作,交给 DNS 服务器处理,省掉了负载均衡服务器维护的麻烦;性能方面可以支持基于地址的域名解析,解析成距离用户最近的服务器地址(类似 CDN 的原理),可以加快访问速度,改善性能。
HTTP负载均衡:根据用户的 HTTP 请求计算出一个真实的服务器地址,将该服务器地址写入 HTTP 重定向响应中,返回给浏览器,由浏览器重新进行访问。
反向代理负载均衡(Reverse Proxy):指以 代理服务器 来接受网络请求,然后 将请求转发给内网中的服务器,并将从内网中的服务器上得到的结果返回给网络请求的客户端。反向代理负载均衡属于七层负载均衡。主流产品:Nginx、Apache。
正向代理与反向代理有什么区别?
正向代理:发生在客户端,是由用户主动发起的。翻墙软件就是典型的正向代理,客户端通过主动访问代理服务器,让代理服务器获得需要的外网数据,然后转发回客户端。
反向代理:发生在 服务端,用户不知道代理的存在。
IP负载均衡:在内核进程完成数据分发,较反向代理负载均衡有更好的从处理性能。但是,由于所有请求响应都要经过负载均衡服务器,集群的吞吐量受制于负载均衡服务器的带宽。
数据链路层负载均衡:数据链路层负载均衡是指在通信协议的数据链路层修改 mac 地址进行负载均衡。在 Linux 平台上最好的链路层负载均衡开源产品是 LVS (Linux Virtual Server)。LVS 是基于 Linux 内核中 netfilter 框架实现的负载均衡系统。netfilter 是内核态的 Linux 防火墙机制,可以在数据包流经过程中,根据规则设置若干个关卡(hook 函数)来执行相关的操作。
五、负载均衡算法
负载均衡算法是负载均衡服务核心中的核心。负载均衡产品多种多样,但是各种负载均衡算法原理是共性的。负载均衡算法有很多种,分别适用于不同的应用场景,本文仅介绍最为常见的负载均衡算法的特性及原理:轮询、随机、最小活跃数、源地址哈希、一致性哈希。
5.1 轮询(Random)
将请求按顺序轮流地分配到每个节点上,不关心每个节点实际的连接数和当前的系统负载。
优点:简单高效,易于水平扩展,每个节点满足字面意义上的均衡;
缺点:没有考虑机器的性能问题,集群性能瓶颈更多的会受性能差的服务器影响。
5.2 随机
将请求随机分配到各个节点。由概率统计理论得知,随着客户端调用服务端的次数增多,其实际效果越来越接近于平均分配,也就是轮询的结果。
5.3 动态均衡算法
- 最小连接数法
根据每个节点当前的连接情况,动态地选取其中当前积压连接数最少的一个节点处理当前请求,尽可能地提高后端服务的利用效率,将请求合理地分流到每一台服务器。
优点:动态,根据节点状况实时变化;
缺点:提高了复杂度,每次连接断开需要进行计数;
实现:将连接数的倒数当权重值。 - 最快响应速度法
根据请求的响应时间,来动态调整每个节点的权重,将响应速度快的服务节点分配更多的请求,响应速度慢的服务节点分配更少的请求,俗称能者多劳,扶贫救弱。
优点:动态,实时变化,控制的粒度更细,跟灵敏;
缺点:复杂度更高,每次需要计算请求的响应速度;
实现:可以根据响应时间进行打分,计算权重。 - 观察模式法
观察者模式是综合了最小连接数和最快响应度,同时考量这两个指标数,进行一个权重的分配
5.4 源地址哈希
根据客户端的IP地址,通过哈希计算得到一个数值,用该数值对服务器节点数进行取模,得到的结果便是要访问节点序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会落到到同一台服务器进行访问。
优点:相同的IP每次落在同一个节点,可以人为干预客户端请求方向;
缺点:如果某个节点出现故障,会导致这个节点上的客户端无法使用,无法保证高可用。当某一用户成为热点用户,那么会有巨大的流量涌向这个节点,导致冷热分布不均衡,无法有效利用起集群的性能。所以当热点事件出现时,一般会将源地址哈希法切换成轮询法。
5.5 一致性哈希
主要的特点就是Hash环,我们的请求可以构建成一个Hash环,按照顺时针记录hash和请求。当我们的服务挂了A时,我们只需要将A的请求交给A后面的B处理;当我们需要增加服务器C时,我们只需要在Hash环上划一块范围,然后交给C;这样就可以实现动态的扩容和缩容。一致性哈希用于解决分布式缓存系统中的节点选择和在增删服务器后,节点减少带来的数据缓存的消失与重新分配问题。
六、总结
本文讲解了什么是负载均衡、负载均衡常用的方式、负载均衡分类及其算法。下一章基于进程中的负载均衡Ribbon使用。