什么是负载均衡?百度词条中的解释是:负载均衡,英文叫做LoadBalance,意思是将请求或数据分发给多个运行单元执行,共同完成工作任务。其目的是通过调度集群来最大化资源利用,最大化吞吐量,最小化响应时间,避免单点过载。负载均衡的分类负载均衡可以根据网络协议的层数来分类。这里我们以ISO模型为标准。从下到上分为:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。当客户端发起请求时,会逐层封装发送给服务端。服务端收到请求后,会逐层解析,得到相应的内容。HTTP协议的二层负载均衡二层债权均衡是基于数据链路层债权均衡,即债权均衡服务器和业务服务器绑定同一个虚拟IP(VIP),客户端直接通过这个请求VIP,怎么办?如何区分同一IP下的不同机器?是的,通过MAC物理地址,每台机器的MAC物理地址是不一样的。负载均衡服务器收到请求后,会重写HTTP报文中以太网头的MAC地址。按照一定的算法,将请求转发到目标机器上,实现负载均衡。这种方式虽然负载控制粒度比较粗,但是好处是对负载均衡服务器的压力会比较小。负载均衡服务器只负责传入的请求,不负责请求的响应(响应是后端业务服务器直接响应客户端。),吞吐量会更高。二层负载和三层负载均衡三层负载均衡是基于网络层的负载均衡。通俗地说,就是根据不同机器的不同IP地址,将请求转发给不同的机器。这种方式虽然比二层多了一层负载,但是在控制粒度上并不比二层负载均衡更有优势,而且因为请求要经过负载均衡服务器,所以会对它。压力比较大,性能比二层负载均衡差。三层负载均衡和四层负载均衡四层负载均衡是基于传输层的负载均衡。传输层的代表协议是TCP/UDP协议。除了包括IP,它还区分端口号。通俗地说,就是根据IP+端口号来转发请求。与上面两者相比,控制范围缩小到端口,可以在同一台机器上加载不同的服务。这一层以LVS为代表。七层负载均衡无图七层负载均衡是基于应用层的负载均衡。应用层的代表协议有HTTP、DNS等,可以根据请求的url转发负载。相比四层负载会更灵活,所以控制的粒度也最细,让整个网络更加“智能”。例如,访问网站的用户流量可以将对图片的请求转发到特定的图片服务器,并通过七层缓存技术;将文本请求转发到特定的文本服务器并使用压缩技术。可以说是功能非常强大的负载。这层自豪感以Nginx为代表。在常见的应用架构中,使用Nginx完全可以满足要求。对于一些大型应用,一般采用DNS+LVS+Nginx的方式进行多级债务均衡。以上描述均基于软件级负载均衡。在大型应用中,会在前面多加一层物理负载均衡,比如大家熟知的F5。负载均衡算法负载均衡算法有两种:一种是静态负载均衡,另一种是动态负载均衡。静态平衡算法:1.round-robin方式将请求轮流分配给各个节点,不考虑各个节点的实际连接数和当前系统负载。优点:简单高效,易于水平扩展,各节点满足字面平衡;缺点:不考虑机器的性能。根据桶中木板最短理论,性能较差的服务器更容易影响集群性能瓶颈。轮询2.random方法将请求随机分配给各个节点。根据概率统计理论,随着客户端调用服务器的次数增加,其实际效果越来越接近平均分布,这就是轮询的结果。优点和缺点类似于轮询。3.随机3.源地址哈希法源地址哈希的思想是根据客户端的IP地址通过哈希函数计算出一个值,用这个值对服务器节点数取模,得到的结果为要访问的节点的序号。源地址散列法用于负载均衡。对于IP地址相同的客户端,在后端服务器列表不变的情况下,每次都会落到同一台服务器上访问。优点:同一个IP每次都落在同一个节点上,可以人为干预客户端请求的方向,比如灰度发布;缺点:如果某个节点出现故障,则该节点上的客户端将不可用,无法保证高可用性。当某个用户成为热点用户时,会有大量流量流向该节点,导致冷热分布不均,集群性能无法得到有效利用。因此,当发生热点事件时,一般会将源地址散列方式切换为轮询方式。哈希法4、加权轮询法不同的后端服务器可能机器配置不同,当前系统负载不同,因此其抗压能力也不同。给配置高、负载低的机器分配更高的权重,让它们处理更多的请求;给配置低、负载高的机器分配较低的权重,以减轻其系统负载,而加权轮询可以很好地处理这个问题,将请求按权重顺序分配给后端。加权轮询算法需要生成一个服务器序列,其中包含n台服务器。n是所有服务器的权重之和。在这个序列中,每个服务器出现的次数等于它的权重值。另外,在生成的序列中,服务器的分布要尽量均匀。比如在序列{a,a,a,a,a,b,c}中,前5个请求会分配给服务器a,这是一种不均匀分布的方式。更好的顺序应该是:{a,a,b,a,c,a,a}。优点:可以兼顾不同机器的性能问题,优化集群性能;缺点:生产环境复杂多变,无法准确预估服务器的抗压能力。静态算法无法实时动态调整节点权重,只能粗略优化。加权循环法5.加权随机法与加权循环法相同。加权随机法也是根据后端机器的配置和系统的负载分配不同的权重。不同的是,它是按权重随机请求后端服务器,而不是按顺序。6.key-valuerange方法根据key的范围进行负债。比如0到10万的用户请求到第一个节点服务器,10万到20万的用户请求到第二个节点服务器……以此类推。优点:易于横向扩展,随着用户数量的增加,可以增加节点,不影响旧数据;缺点:容易失衡债务,比如新注册用户活跃度高,老用户活跃度低,所以会把压力加到老服务节点的服务节点上,浪费老服务节点的性能。而且还容易出现单点故障,无法满足高可用。键值范围法(注:上面提到的单点故障可以通过主从法解决,从节点监听主节点的心跳,当发现主节点挂掉时,切换从节点到master节点去替换。这里可以想到一个问题,集群master-slave怎么设计才能最大程度的降低成本)动态债务平衡算法:1.最小连接数法根据当前连接数根据每个节点的状态,动态选择当前积压连接数最少的节点处理当前请求,尽可能提高后端服务的利用效率,合理分配请求到各个服务器。俗称闲人不能闲,大家一起动起来。优点:动态的,根据节点状态实时变化;缺点:复杂度增加,每次连接断开都需要统计;实现方式:以连接数的倒数作为权重值。2.最快响应速度法根据请求的响应时间动态调整各节点的权重,将较多的请求分配给响应速度快的服务节点,将较少的请求分配给响应速度较慢的服务节点,俗称有能力更加努力,扶贫济弱。优点:动态、实时变化,控制粒度更细,灵敏度高;缺点:复杂度较高,每次都需要计算请求的响应速度;实现:可以根据响应时间进行打分,计算权重。3.观察模式观察模式结合最少的连接数和最快的响应,同时考虑这两个指标来分配权重。
