共计 2265 个字符,预计需要花费 6 分钟才能阅读完成。
运营研发团队 施洪宝
一. 基础知识
1.1 基础
什么是负载均衡?
当单机提供的并发量不能满足需求时,我们需要多台服务器同时服务。当客户请求到达时,如何为客户选择最合适的服务器? 这个问题就是负载均衡问题。
负载均衡主要需要解决的问题是哪些?
从客户端的角度上看,客户需要最快速的得到服务器的相应,负载均衡时需要找出能最快相应客户需求的服务器进行服务。
从服务端来看如何使得每台服务器都能达到较高的利用率,最大限制的为用户提供快速、可靠的服务是服务端需要考虑的主要问题。
1.2 负载均衡分类
硬件
F5
软件
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 参考
https://f5.com/zh
https://www.jianshu.com/p/2b5…
https://wenku.baidu.com/view/…
三. 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 分类
LVS-NAT
LVS-DR
LVS-TUN
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 参考
https://liangshuang.name/2017…
五. Nginx Load Balance
nginx 负载均衡工作在 7 层,它会与 client、upstream 分别建立 tcp 连接,nginx 需要维护这两个连接的状态。
nginx 的 stream 模块可以用于 4 层负载均衡,但一般很少使用。
5.1 基本原理
nginx 做 7 层负载均衡的基本原理如下图所示:
5.2 负载均衡算法
轮询 (默认)
加权轮询
源 ip 哈希
响应时间
url 哈希