运营研发团队 施洪宝一. 基础知识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/zhhttps://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-NATLVS-DRLVS-TUN4.2 基本原理4.2.1 LVS-DRLVS-DR模式的基本原理如下图所示:4.2.2 LVS-NATLVS-NAT模式的基本原理如下图所示:4.3 负载均衡算法4.3.1 静态算法轮询(Round Robin, RR)加权轮询(Weight Round Robin, WRR)源地址Hash(Source Hash, SH)目的地址Hash(Destination Hash, DH), 可以设置多个VIP4.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 Balancenginx负载均衡工作在7层,它会与client、upstream分别建立tcp连接,nginx需要维护这两个连接的状态。nginx的stream模块可以用于4层负载均衡,但一般很少使用。5.1 基本原理nginx做7层负载均衡的基本原理如下图所示:5.2 负载均衡算法轮询(默认)加权轮询源ip哈希响应时间url 哈希