Fork me on GitHub

负载均衡(1)

1. 负载均衡技术介绍

  1. HTTP 重定向负载均衡
  2. DNS 域名解析负载均衡
  3. 反向代理负载均衡
  4. IP 负载均衡
  5. 数据链路层负载均衡

1.1 HTTP 重定向负载均衡

介绍:在网站机房有一台名为“HTTP 重定向负载均衡”的服务器 A。

步骤:

  1. 浏览器请求 DNS 解析域名,拿到服务器 A 的IP地址并访问;
  2. 服务器 A 利用某种负载均衡算法获得一台实际物理服务器 B 的地址,重定向响应返回给浏览器;
  3. 浏览器自动重新请求该实际物理服务器的 IP 地址,完成访问。

评价:

  1. 简单、但需要浏览器两次访问服务器;
  2. 使用 HTTP302 响应码重定向,可能使搜索引擎判断为 SEO 作弊,降低搜索排名。

1.2 DNS 域名解析负载均衡

介绍:DNS 服务器不仅进行域名解析,而且同时进行负载均衡。

步骤:

  1. 在 DNS 服务器中配置多个 A 记录;
  2. 每次域名解析请求时会根据负载均衡算法计算一个不同的 IP 地址返回。

评价:

  1. 省去了网站维护负载均衡服务器的麻烦;
  2. DNS 可以基于地理位置的域名解析(离用户较劲的服务器地址),可以加快用户访问速度;
  3. DNS 服务器中的 A 记录修改较麻烦,生效慢;
  4. 控制器不在网站方,网站管理较麻烦。
  5. 大型网站中,会将 DNS 负载均衡放在第一级,域名解析得到的 IP 地址是下一级负载均衡服务器(非实际物理服务器),在下一级负载均衡服务器上会进行再次负载均衡。

1.3 反向代理负载均衡

介绍:在 Web 应用服务器前的反向代理服务器,不仅缓存 Web 响应资源,而且提供负载均衡的功能。

步骤:

  1. Web 服务器不直接对外提供访问,所以只需要内部 IP 地址即可;
  2. 反向代理服务器需要同时具有外部 IP 地址和内部 IP 地址两套 IP 地址;

评价:

  1. 反向代理服务器转发请求在 HTTP 协议层(在应用程序中分发),即应用层负载均衡
  2. 优点是部署简单,缺点是反向代理服务器的重要性提升,需要关注其性能。

1.4 IP 负载均衡

介绍:在网络层通过修改请求目标实现负载均衡。

方案一:

  1. 用户请求数据包到达负载均衡服务器,负载均衡服务器在 OS 的内核进程获取网络数据包,计算出一台真实的 Web 服务器,然后将数据包的目的 IP 地址修改(同时修改源 IP 地址为负载均衡服务器的地址);
  2. Web 服务器响应时的数据包回到负载均衡服务器,服务器将数据包的源地址修改为自身的 IP 地址发送给浏览器。

方案二:

  1. 相比方案一,将负载均衡服务器同时当作网关服务器。那么不需要同时修改数据包的源 IP 地址,就可以让 Web 服务器将响应返还给负载均衡服务器了。

评价:

  1. IP 负载均衡服务器是在内核进程完成数据分发,比在应用层的反向代理服务器性能更好;
  2. 但是所有的请求响应都必须经过负载均衡服务器,那么此负载均衡服务器的网卡带宽容易成为性能的瓶颈。

1.5 数据链路层负载均衡

介绍:在通信协议的数据链路层修改 mac 地址进行负载均衡。

步骤:

  1. 负载均衡服务器(实际 IP)与 Web 服务器集群(虚拟 IP)具有同一个 IP 地址;
  2. 负载均衡服务器拿到数据包后,不修改 IP 地址,而是修改目的 mac 地址,数据包就会传输到该 Web 服务器上;
  3. Web 服务器的响应信息可以不经过负载均衡服务器,直接发送回用户浏览器。

评价:

  1. 以上负载均衡方式称为直接路由方式(DR),模式称为三角模式;
  2. 是目前大型网站应用最广的一种负载均衡手段;
  3. Linux 平台上最好的链路层负载均衡开源产品是 LVS。

2. 负载均衡算法

主要有:轮询、加权轮询、随机、最少连接、原地址散列:

  • 轮询:所有请求依次分发到每台服务器上,平均分配。
  • 加权轮询:在轮询基础上,考虑不同服务器硬件性能的差异,按权重分发。
  • 随机:请求被随机分配。
  • 最少连接:将新进请求发给当前请求数最少的服务器。
  • 源地址散列:将请求来源的 IP 地址进行 Hash,使得来自同一个 IP 地址的请求总在同一个服务器上处理,从而实现会话粘滞。

推荐阅读:四层、七层负载均衡的比较

-------------The End-------------