知识 - 负载均衡

参考资料

概述

负载均衡(Load Balance,简称 LB)是高并发、高可用系统必不可少的关键组件,目标是尽力将网络流量平均分发到多个服务器上,以提高系统整体的响应速度和可用性。

负载均衡主要作用:

  • 高并发:通过负载均衡算法,尽力均匀的分配应用集群中各节点的工作量,以此提高应用集群的并发处理能力(吞吐量)。
  • 伸缩性:动态增减服务器,由负载均衡进行分发控制。
  • 高可用:监控候选服务器,当一台服务器不可用时,自动跳过,将请求分发给可用的服务器。
  • 安全防护:有些负载均衡软件或硬件提供了安全性功能,如:黑白名单处理、防火墙,防DDos 攻击等。

负载均衡类型

最常见的负载均衡技术方案主要有三种:

  • 基于DNS负载均衡
  • 基于硬件负载均衡
  • 基于软件负载均衡

基于DNS负载均衡

基于DNS来做负载均衡其实是一种最简单的实现方案,通过在DNS服务器上做一个简单配置即可。

原理:当用户访问域名时,会先向DNS服务器去解析域名对应的IP地址,这时可以让DNS服务器根据不同地理位置的用户返回不同的IP,从而实现「就近原则」将请求分流了,既减轻了单个集群的负载压力,也提升了用户的访问速度

  • 优点:

    • 使用简单:配置简单,实现成本非常低,无需额外的开发和维护工作。
    • 提高性能:可以支持基于地址的域名解析,解析成距离用户最近的服务器地址,可以加快访问速度,改善性能;
  • 缺点:

    • 可用性差:DNS 解析是多级解析,新增/修改 DNS 后,解析时间较长;解析过程中,用户访问网站将失败;
    • 扩展性低:DNS 负载均衡的控制权在域名商那里,无法对其做更多的改善和扩展;
    • 维护性差:也不能反映服务器的当前运行状态;支持的算法少;不能区分服务器的差异

另外,使用DNS做负载均衡的话,大多是基于地域或者干脆直接做IP轮询,没有更高级的路由策略,所以这也是DNS方案的局限所在。

基于硬件负载均衡

硬件负载均衡是通过专门的硬件设备来实现负载均衡功能,是专用的负载均衡设备。目前业界典型的硬件负载均衡设备有两款: F5 和 A10 。

这类设备性能强劲、功能强大,但价格非常昂贵,一般只有土豪公司才会使用此类设备,中小公司一般负担不起,业务量没那么大,用这些设备也是挺浪费的。

优点:

  • 功能强大:全面支持各层级的负载均衡,支持全面的负载均衡算法。
  • 性能强大:由于是在专用处理器上运行,因此吞吐量大,可支持单机百万以上的并发。
  • 稳定性高:商用硬件负载均衡,经过了良好的严格测试,经过大规模使用,稳定性高。
  • 安全防护:往往具备防火墙,防 DDos 攻击等安全功能。

缺点:

  • 成本昂贵:购买和维护硬件负载均衡的成本都很高。
  • 扩展性差:当访问量突增时,超过限度不能动态扩容。

基于软件负载均衡

软件负载均衡的主流产品有:Nginx、HAProxy、LVS。

  • Nginx :七层负载均衡,支持 HTTP、E-mail 协议,同时也支持 4 层负载均衡;
  • HAproxy :支持七层规则的,性能也很不错。OpenStack 默认使用的负载均衡软件就是 HAproxy;
  • LVS :运行在内核态,性能是软件负载均衡中最高的,严格来说工作在三层,所以更通用一些,适用各种应用服务。

优点:

  • 扩展性好:适应动态变化,可以通过添加软件负载均衡实例,动态扩展到超出初始容量的能力。
  • 成本低廉:软件负载均衡可以在任何标准物理设备上运行,降低了购买和运维的成本。

缺点:

  • 性能略差:相比于硬件负载均衡,软件负载均衡的性能要略低一些。

网络通信分类

软件负载均衡从通信层面来看,又可以分为四层和七层负载均衡

四层负载均衡

  • 工作在OSI模型的传输层: 由于在传输层,只有TCP/UDP协议,这两种协议中除了包含源IP、目标IP以外,还包含源端口号及目的端口号。四层负载均衡服务器在接受到客户端请求后,以后通过修改数据包的地址信息(IP+端口号)将流量转发到应用服务器。

基于IP 地址和端口进行请求的转发:

  • 修改 IP 地址

    • IP 负载均衡是在网络层通过修改请求目的地址进行负载均衡。
  • 修改 MAC 地址

    • 数据链路层负载均衡是指在通信协议的数据链路层修改 mac 地址进行负载均衡。

在 Linux 平台上最好的链路层负载均衡开源产品是 LVS (Linux Virtual Server)。LVS 是基于 Linux 内核中 netfilter 框架实现的负载均衡系统。netfilter 是内核态的 Linux 防火墙机制,可以在数据包流经过程中,根据规则设置若干个关卡(hook 函数)来执行相关的操作。

七层负载均衡

  • 工作在OSI模型的应用层,应用层协议较多,常用http、radius、dns等。七层负载就可以基于这些协议来负载。这些应用层协议中会包含很多有意义的内容。

可以根据访问用户的 HTTP 请求头、URL 信息将请求转发到特定的主机:

  • DNS 重定向

    • 基于 DNS 查询缓存,按照负载情况返回不同服务器的 IP 地址。
  • HTTP 重定向

    • 根据用户的 HTTP 请求计算出一个真实的服务器地址,将该服务器地址写入 HTTP 重定向响应中,返回给浏览器,由浏览器重新进行访问。

  • 反向代理

    • 代理服务器来接受网络请求,然后将请求转发给内网中的服务器,并将从内网中的服务器上得到的结果返回给网络请求的客户端。

负载均衡算法

负载均衡算法有很多种,分别适用于不同的应用场景,本文仅介绍最为常见的负载均衡算法的特性及原理:轮询、随机、源地址哈希、加权轮询、加权随机、最小活跃数、一致性哈希

  1. 轮询法

    • 将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。
  2. 随机法

    • 通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。由概率统计理论可以得知,随着客户端调用服务端的次数增多,其实际效果越来越接近于平均分配调用量到后端的每一台服务器,也就是轮询的结果。
  3. 源地址哈希法

    • 源地址哈希的思想是根据获取客户端的IP地址,通过哈希函数计算得到的一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。
  4. 加权轮询法

    • 不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。
  5. 加权随机法

    • 与加权轮询法一样,加权随机法也根据后端机器的配置,系统的负载分配不同的权重。不同的是,它是按照权重随机请求后端服务器,而非顺序。
  6. 最小连接数法

    • 最小连接数算法比较灵活和智能,由于后端服务器的配置不尽相同,对于请求的处理有快有慢,它是根据后端服务器当前的连接情况,动态地选取其中当前积压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负责合理地分流到每一台服务器。
  7. 一致性哈希

    • 一致性哈希(Consistent Hash)算法的目标是:相同的请求尽可能落到同一个服务器上。一致性哈希 可以很好的解决 稳定性问题,可以将所有的 存储节点 排列在 首尾相接 的 Hash 环上,每个 key 在计算 Hash 后会 顺时针 找到 临接 的 存储节点 存放。而当有节点 加入 或 退出 时,仅影响该节点在 Hash环上顺时针相邻的后续节点。