1.定义
负载均衡(Load Balance,简称 LB),是在现有网络结构之上分摊到多个操作单元上进行执行,扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
2.主要作用
高并发:负载均衡通过算法调整负载,尽力均匀的分配应用集群中各节点的工作量,以此提高应用集群的并发处理能力(吞吐量)。
伸缩性:添加或减少服务器数量,然后由负载均衡进行分发控制。这使得应用集群具备伸缩性。
高可用:负载均衡器可以监控候选服务器,当服务器不可用时,自动跳过,将请求分发给可用的服务器。这使得应用集群具备高可用的特性。
安全防护:有些负载均衡软件或硬件提供了安全性功能,如:黑白名单处理、防火墙,防 DDos 攻击等。
3.分类
3.1.按载体分类
从支持负载均衡的载体来看,可以将负载均衡分为两类:硬件负载均衡、软件负载均衡。
3.1.1.硬件负载均衡
硬件负载均衡,一般是在定制处理器上运行的独立负载均衡服务器,价格昂贵。主流产品有 F5 和 A10。
硬件负载均衡的优点:
功能强大:支持全局负载均衡并提供较全面的、复杂的负载均衡算法。
性能强悍:硬件负载均衡由于是在专用处理器上运行,因此吞吐量大,可支持单机百万以上的并发。
安全性高:往往具备防火墙,防 DDos 攻击等安全功能。
硬件负载均衡的缺点:
成本昂贵:购买和维护硬件负载均衡的成本都很高。
扩展性差:当访问量突增时,超过限度不能动态扩容。
3.1.2.软件负载均衡
软件负载均衡,应用最广泛,是从软件层面实现负载均衡,一般可以在任何标准物理设备上运行。主流产品有:Nginx、HAProxy、LVS。
LVS 可以作为四层负载均衡器。其负载均衡的性能要优于 Nginx;HAProxy 可以作为 HTTP 和 TCP 负载均衡器;Nginx、HAProxy 可以作为四层或七层负载均衡器。
软件负载均衡的优点:
扩展性好:适应动态变化,可以通过添加软件负载均衡实例,动态扩展到超出初始容量的能力。
成本低廉:软件负载均衡可以在任何标准物理设备上运行,降低了购买和运维的成本。
软件负载均衡的缺点:
性能略差:相比于硬件负载均衡,软件负载均衡的性能要略低一些。
3.2.按网络通信分类
根据负载均衡技术实现在 OSI 七层模型的不同层次,可以在应用层、传输层、网络层和数据传输层。所以,工作在应用层的负载均衡通常称之为七层负载均衡、工作在传输层的称之为四层负载均衡。
3.2.1.二层负载均衡
负载均衡服务器对外提供一个VIP(虚拟 IP),集群中不同的机器采用相同 IP 地址,但是机器的MAC地址不一样。当负载均衡服务器接受到请求之后,通过改写报文的目标 MAC 地址的方式将请求转发到目标机器实现负载均衡。
3.2.2.三层负载均衡
和二层负载均衡类似,负载均衡服务器对外依然提供一个VIP(虚拟 IP),但是集群中不同的机器采用不同的IP地址。当负载均衡服务器接受到请求之后,根据不同的负载均衡算法,通过IP将请求转发至不同的真实服务器。
3.2.3.四层负载均衡
四层负载均衡工作在 OSI 模型的传输层,由于在传输层只有 TCP/UDP 协议,这两种协议中除了包含源IP、目标IP以外,还包含源端口号及目的端口号。四层负载均衡服务器在接受到客户端请求后,以后通过修改数据包的地址信息(IP + 端口号)将流量转发到应用服务器。
3.2.4.七层负载均衡
七层负载均衡工作在 OSI 模型的应用层,应用层协议较多,常用的如 HTTP、DNS 等。七层负载就基于这些协议来负载。这些应用层协议中会包含很多有意义的内容。比如同一个 Web 服务器的负载均衡,除了根据IP加端口进行负载外,还可根据七层的URL、浏览器类别等来决定是否要进行负载均衡。
4.负载均衡算法
负载均衡服务器在决定将请求转发到具体哪台真实服务器的时候,是通过负载均衡算法来实现的。负载均衡算法,是一个负载均衡服务器的核心。
负载均衡算法可以分为两类:静态负载均衡算法和动态负载均衡算法。
4.1.静态负载均衡算法
静态负载均衡算法包括:轮询、加权轮询、随机、加权随机等。
- 轮询(Round Robin):每次的请求到达时,对每个服务器都轮询访问,保证每个服务器命中概率相同,实现简单但无法解决不同服务器之间性能差异问题。
- 加权轮询(Weighted Round Robin):权重高的服务器请求命中的概率更高,根据不同服务器的性能调整权重比可以降低服务器性能差异带来的问题。
- 随机(Random):所有服务器随机访问,实现简单,服务器的命中概率取决于随机算法,无法解决不同服务器之前性能差异问题。
- 加权随机(Weighted Random):实现上可以参照加权轮询,生成的随机数作为列表的索引值,也可以降低服务器性能差异带来的问题。
4.2.动态负载均衡算法
动态负载均衡算法包括:最小连接数、加权最小连接数、源地址哈希、一致性哈希等。
- 最小连接数(Least Connections):传递新的连接给那些进行最少连接处理的服务器。根据连接数并不能真实的反应服务器的负载能力,当服务器不处于同一水平时,有可能连接数少的服务器处理能力差,而连接数多的服务器处理能力强。
- 加权最小连接数(Weighted Least Connection)在最小连接数的基础上,根据服务器的性能为每台服务器分配权重,再根据权重计算出每台服务器能处理的连接数。
- 源地址哈希(IP Hash):这种方式通过生成请求源 IP 的哈希值,并通过这个哈希值来找到正确的真实服务器。这意味着对于同一主机来说他对应的服务器总是相同。
- 一致性哈希(Consistent Hash):将主机 IP 或者主机名等唯一标识,按一致性 Hash 算法分布在 0 ~ 232-1 的闭环圆圈上,当我们取某个值的时候,将这个数据的 Key 用相同的 Hash 算法映射到 0 ~ 232-1上,从这个位置顺时针找到的第一个缓存节点,就是这个数据存储位置。
在实际的映射中,服务器映射到哈希环上很有可以是斜的,称为哈希偏斜,在 Hash 环偏斜的情况下,大部分的数据很有可能会存到一台服务器上。导致分布极度不均匀,没有被平均的使用,如果数据较多的服务器失效,很有可能引起系统的故障。要想均衡的将数据分布到服务器上,要让服务器尽量多,这样才能均匀地分布在 Hash 环上,解决方式是:增加虚拟节点。引入虚拟节点后,虚拟节点越多,Hash 环上的服务器节点就越多,数据被均匀分布的概率就越大。当我们删除或新增其中一个节点,影响的只是这个节点之前的数据,其他节点并未受影响。