运营研发团队 施洪宝
一. 基础知识
1.1 基础
- 什么是负载均衡?
当单机提供的并发量不能满足需求时,我们需要多台服务器同时服务。当客户请求到达时,如何为客户选择最合适的服务器?这个问题就是负载均衡问题。
- 负载均衡主要需要解决的问题是哪些?
- 从客户端的角度上看,客户需要最快速的得到服务器的相应,负载均衡时需要找出能最快相应客户需求的服务器进行服务。
- 从服务端来看如何使得每台服务器都能达到较高的利用率,最大限制的为用户提供快速、可靠的服务是服务端需要考虑的主要问题。
1.2 负载均衡分类
- 硬件
- 软件
- dns负载均衡
- LVS负载均衡(4层)
- nginx, haproxy(7层)
二. F5负载均衡
- F5是一家美国的公司,该公司生产一些硬件设备可以作为负载均衡器使用(例如:big-ip), 本文后续部分所说的F5是指其负载均衡器产品。
- 不同的产品实现的功能不一致,具体情况需要根据产品说明书。
- F5可以在4-7层内做负载均衡,用户可以根据需求进行配置。
- 由于F5可以做7层负载均衡,故而可以实现会话管理,http处理等。
2.1 数据转发模式
- standard类型, 这种模式下,客户端与F5服务器建立连接,F5服务器与真实服务器建立连接,F5服务器将客户需求转发给真实服务器,并将真实服务器的相应转发给客户端,此时F5可以查看请求和相应的所有信息。
- 四层转发模式(performance L4), 这种模式下,F5只处理4层以下的数据。客户端将数据发送给F5, F5仅将数据转发给真实服务器,包括TCP的握手数据包以及挥手数据包,真实服务器需要先将数据发送给F5服务器,F5将其转发给客户端。
- 路由模式, 这种模式与LVS的DR模式类似。
- ...
2.2 负载均衡算法
- 轮询,加权轮询。
- 源地址哈希
- ...
2.3 小结
F5的优势在于功能强大,并发量高,能满足客户的大多数需求,但其成本较高,一般大型国企可能会使用。
2.4 参考
三. dns负载均衡
- dns负载均衡由dns服务提供厂商提供。
- 最初的dns负载均衡提供简单轮询,不能根据客户端或者服务端状态进行选择。
- 目前,有些dns服务厂商可以提供智能dns服务,用户可以设置负载均衡方案,例如:根据客户端ip地址,选择就近的服务器。
- 对于目前大多数的公司而言,为了更好的服务用户,通常会使用dns负载均衡,将用户按照就近原则,分配到某个集群服务器上。之后,集群内再采用其他的负载均衡方案。
四. Linux Virtual Server(LVS)
- LVS通过修改数据包Ip地址,Mac地址实现负载均衡。
- LVS由ipvs(内核中), ipvsadm(用户态)组成。LVS需要理解tcp,ip头部。
- 当tcp握手信号,SYN数据包达到时,ipvs选择一个后端服务器,将数据包进行转发。在此之后,所有包含相同的ip,tcp头部的数据包都会被转发到之前选择的服务器上。很明显,ipvs无法感知数据包内容。
4.1 分类
4.2 基本原理
4.2.1 LVS-DR
LVS-DR模式的基本原理如下图所示:
4.2.2 LVS-NAT
LVS-NAT模式的基本原理如下图所示:
4.3 负载均衡算法
4.3.1 静态算法
- 轮询(Round Robin, RR)
- 加权轮询(Weight Round Robin, WRR)
- 源地址Hash(Source Hash, SH)
- 目的地址Hash(Destination Hash, DH), 可以设置多个VIP
4.3.2 动态算法
- 最少连接(Least Connections, LC),找出当前连接数最小的服务器
- 加权最少连接(Weighted Least Connections, WLC)
- 最短期望延迟(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服务器。
- 永不排队(Never Queue Scheduling, NQ), 改进的sed, 如果某台服务器连接数为0,直接连接过去,不在进行sed计算。
- 基于局部性的最少连接(locality-Based Least Connections, LBLC),根据目标ip, 找出目标ip最近使用的服务器,如果服务器存在并且负载没有大于一个阈值,则将新的连接分配到这个服务器上,否则按照最少连接找出一个服务器处理该请求。
- 带复制的基于局部性最少连接(Locality-Based Least Connections with Replication, LBLCR),根据目标ip,维护一个服务器组,每次从组中挑选服务器,如果服务器不可以处理,则从所有服务器中按照最少连接挑选出一台服务器,并将其加入到目标ip的处理组服务器中。
4.3 参考
五. Nginx Load Balance
- nginx负载均衡工作在7层,它会与client、upstream分别建立tcp连接,nginx需要维护这两个连接的状态。
- nginx的stream模块可以用于4层负载均衡,但一般很少使用。
5.1 基本原理
nginx做7层负载均衡的基本原理如下图所示:
5.2 负载均衡算法
- 轮询(默认)
- 加权轮询
- 源ip哈希
- 响应时间
- url 哈希