15

运营研发团队 施洪宝

一. 基础知识

1.1 基础

  1. 什么是负载均衡?
当单机提供的并发量不能满足需求时,我们需要多台服务器同时服务。当客户请求到达时,如何为客户选择最合适的服务器?这个问题就是负载均衡问题。
  1. 负载均衡主要需要解决的问题是哪些?
  • 从客户端的角度上看,客户需要最快速的得到服务器的相应,负载均衡时需要找出能最快相应客户需求的服务器进行服务。
  • 从服务端来看如何使得每台服务器都能达到较高的利用率,最大限制的为用户提供快速、可靠的服务是服务端需要考虑的主要问题。

1.2 负载均衡分类

  1. 硬件
  • F5
  1. 软件
  • dns负载均衡
  • LVS负载均衡(4层)
  • nginx, haproxy(7层)

二. F5负载均衡

  1. F5是一家美国的公司,该公司生产一些硬件设备可以作为负载均衡器使用(例如:big-ip), 本文后续部分所说的F5是指其负载均衡器产品。
  2. 不同的产品实现的功能不一致,具体情况需要根据产品说明书。
  3. F5可以在4-7层内做负载均衡,用户可以根据需求进行配置。
  4. 由于F5可以做7层负载均衡,故而可以实现会话管理,http处理等。

2.1 数据转发模式

  1. standard类型, 这种模式下,客户端与F5服务器建立连接,F5服务器与真实服务器建立连接,F5服务器将客户需求转发给真实服务器,并将真实服务器的相应转发给客户端,此时F5可以查看请求和相应的所有信息。
  2. 四层转发模式(performance L4), 这种模式下,F5只处理4层以下的数据。客户端将数据发送给F5, F5仅将数据转发给真实服务器,包括TCP的握手数据包以及挥手数据包,真实服务器需要先将数据发送给F5服务器,F5将其转发给客户端。
  3. 路由模式, 这种模式与LVS的DR模式类似。
  4. ...

2.2 负载均衡算法

  1. 轮询,加权轮询。
  2. 源地址哈希
  3. ...

2.3 小结

F5的优势在于功能强大,并发量高,能满足客户的大多数需求,但其成本较高,一般大型国企可能会使用。

2.4 参考

三. dns负载均衡

  1. dns负载均衡由dns服务提供厂商提供。
  2. 最初的dns负载均衡提供简单轮询,不能根据客户端或者服务端状态进行选择。
  3. 目前,有些dns服务厂商可以提供智能dns服务,用户可以设置负载均衡方案,例如:根据客户端ip地址,选择就近的服务器。
  4. 对于目前大多数的公司而言,为了更好的服务用户,通常会使用dns负载均衡,将用户按照就近原则,分配到某个集群服务器上。之后,集群内再采用其他的负载均衡方案。

四. Linux Virtual Server(LVS)

  1. LVS通过修改数据包Ip地址,Mac地址实现负载均衡。
  2. LVS由ipvs(内核中), ipvsadm(用户态)组成。LVS需要理解tcp,ip头部。
  3. 当tcp握手信号,SYN数据包达到时,ipvs选择一个后端服务器,将数据包进行转发。在此之后,所有包含相同的ip,tcp头部的数据包都会被转发到之前选择的服务器上。很明显,ipvs无法感知数据包内容。

4.1 分类

  • LVS-NAT
  • LVS-DR
  • LVS-TUN

4.2 基本原理

4.2.1 LVS-DR

LVS-DR模式的基本原理如下图所示:
image

4.2.2 LVS-NAT

LVS-NAT模式的基本原理如下图所示:
image

4.3 负载均衡算法

4.3.1 静态算法

  1. 轮询(Round Robin, RR)
  2. 加权轮询(Weight Round Robin, WRR)
  3. 源地址Hash(Source Hash, SH)
  4. 目的地址Hash(Destination Hash, DH), 可以设置多个VIP

4.3.2 动态算法

  1. 最少连接(Least Connections, LC),找出当前连接数最小的服务器
  2. 加权最少连接(Weighted Least Connections, WLC)
  3. 最短期望延迟(Shortest Expected Delay Scheduling, SED) 基于WLC。例如: 现有A, B, C三台服务器,权重分别为100,200,300,当前的连接数分别为1,2,3,下一个连接到达时,通过计算期望时延选择服务器(1+1)/100, (2+1)/200, (3+1)/300, 故而选择C服务器。
  4. 永不排队(Never Queue Scheduling, NQ), 改进的sed, 如果某台服务器连接数为0,直接连接过去,不在进行sed计算。
  5. 基于局部性的最少连接(locality-Based Least Connections, LBLC),根据目标ip, 找出目标ip最近使用的服务器,如果服务器存在并且负载没有大于一个阈值,则将新的连接分配到这个服务器上,否则按照最少连接找出一个服务器处理该请求。
  6. 带复制的基于局部性最少连接(Locality-Based Least Connections with Replication, LBLCR),根据目标ip,维护一个服务器组,每次从组中挑选服务器,如果服务器不可以处理,则从所有服务器中按照最少连接挑选出一台服务器,并将其加入到目标ip的处理组服务器中。

4.3 参考

五. Nginx Load Balance

  1. nginx负载均衡工作在7层,它会与client、upstream分别建立tcp连接,nginx需要维护这两个连接的状态。
  2. nginx的stream模块可以用于4层负载均衡,但一般很少使用。

5.1 基本原理

nginx做7层负载均衡的基本原理如下图所示:
image

5.2 负载均衡算法

  1. 轮询(默认)
  2. 加权轮询
  3. 源ip哈希
  4. 响应时间
  5. url 哈希

AI及LNMPRG研究
7.2k 声望12.8k 粉丝

一群热爱代码的人 研究Nginx PHP Redis Memcache Beanstalk 等源码 以及一群热爱前端的人