当前位置: 首页 > 科技观察

想要实现高可用性?先搞定负载均衡的原理

时间:2023-03-16 10:05:12 科技观察

【.com原稿】在互联网火爆的今天,业务高速增长,技术上我们经常要面对高并发、大流量。图片来自Pexels为了实现高可用和高性能,我们采用了很多技术手段,负载均衡就是其中之一。作为外部流量和内部应用的“接收者”,占据着重要的地位。我们了解整个负载均衡技术吗?它的分类?它的原理?它的特点?今天我们就来说说负载均衡。负载均衡的分类说到负载均衡,大家就会想到Nginx,它通常用于应用服务的负载均衡。一般它的并发在5W左右。如果并发较高,则需要搭建Nginx集群。但是在Nginx之上还有一层负载均衡器,负责将网络请求转发给Nginx,同时也负责网络链路、防火墙等,是一个“硬件负载均衡器”,一般安装在外网和Nginx之间内网服务器。比较流行的有NetScaler、F5、Radware、Array等产品。与外部网络和内部网络之间的“硬件负载均衡器”相比,硬件负载均衡器是一个“软件负载均衡器”来平衡内部网络服务器的负载。例如:LVS、HAProxy、Nginx。硬件负载均衡工作在“接入层”,其主要任务是多链路负载均衡、防火墙负载均衡、服务器负载均衡。软件负载均衡工作在“代理层”,其主要任务是反向代理、缓存、数据校验等。硬件负载均衡和软件负载均衡工作在不同的层次。硬件负载均衡在接入层获取网络请求,然后转交给软件负载均衡,对返回的请求进行同样的处理。接入层、代理层和对应服务器示意图我们知道负载均衡分为“硬件负载均衡”和“软件负载均衡”,下面我们一一看看它们是如何工作的。硬件负载均衡上面说了负载均衡器的分类,下面说说它们的特点。硬件负载均衡技术只注重网络判断,没有考虑业务系统和应用的使用。看似处理网络请求很专业,但有意思的是,如果应用服务出现流量瓶颈,而“接入层”的硬件负载均衡没有发现异常,它仍然允许流量继续进入应用服务器。阻塞,会造成应用服务器流量过大。因此,为了保证高可用,可以在“接入层”和“代理层”考虑限流的问题。作为硬件负载均衡器,常用于大型企业。下面为大家介绍一下F5公司(以下简称F5)的“F5BIG-IP”产品。实际上,它是一个集成的解决方案。对于R&D同学来说,主要是了解它的原理。硬件负载均衡器的三大功能硬件负载均衡器的功能和特点在上面已经说过了。它的三大功能是什么?实现原理是什么?网络服务提供商)接入链路,保证网络服务的可靠性。如果某个ISP停止服务或服务异常,可以使用另一个ISP来替代服务,提高了网络的可用性。不同的ISP有不同的自治域,所以需要考虑两种情况:INBOUNDOUTBOUNDINBOUND,向网络请求信息。F5分别绑定两个ISP服务商的公网地址,解析两个ISP服务商的DNS解析请求。F5可以根据服务器的状态和响应发送DNS,也可以通过多条链路建立DNS连接。OUTBOUND,返回给请求者的响应信息。F5可以将流量分发到不同的网络接口,对源地址做NAT(NetworkAddressTranslation),即将IP地址转换成请求源地址。也可以自动映射接口地址,保证数据包返回时能被源端正确接收。多路径负载方式增强了网络接入层的可靠性②防火墙负载均衡对于大量的网络请求,单个防火墙的能力是有限的,防火墙本身需要数据同时进出。为了解决多防火墙的负载均衡问题,F5提出了防火墙负载均衡的“防火墙三明治”方案。防火墙监控用户会话的双向数据流,判断数据的合法性。如果使用多台防火墙做负载均衡,可能会导致同一个用户会话的双向数据在多台防火墙上处理。另一方面,如果在单个防火墙上无法看到有关用户会话完成的信息,则会认为该数据非法并丢弃该数据。因此,应在每台防火墙两端设置四层交换机,在分配流量的同时保持用户会话的完整性,使同一用户的会话可以由一台防火墙处理。该场景需要F5负载均衡器的协助完成转发。有趣的是,F5在统筹上述解决方案的配置和实施后,将“交换机”、“防火墙”和“交换机”像三明治一样夹在了一起。防火墙“三明治”③服务器负载均衡当多个应用服务器连接到一个硬件负载均衡器时,需要对这些服务进行负载均衡。按照规则向服务器发送请求:服务器负载均衡的前提是服务器都提供相同的服务,即同一业务同时部署在多台服务器上。对于可以在F5上进行配置和负载均衡的应用服务器,F5可以检查服务器的健康状态,如果发现故障则将其从负载均衡组中移除。F5对外网有一个真实的IP,为内网的每台服务器生成一个虚拟IP,用于负载均衡和管理。因此,它可以为大量基于TCP/IP的网络应用提供服务器负载均衡服务。根据不同的服务类型定义不同的服务器组。根据不同的服务端口,将流量导向对应的服务器。甚至可以对VIP用户的请求进行特殊处理,将此类请求导入高性能服务器,让VIP客户得到最佳的服务响应。根据用户访问内容的不同,将流量导向指定的服务器。优缺点总结说完了硬件负载均衡器的特点和作用,我们再总结一下它的优缺点:优点:直连交换机,处理网络请求能力强,独立于系统,负载性能强.可适用于大量设施,适应大量访问,使用方便。缺点:成本高,配置冗余。即使网络请求被分发到服务器集群,负载平衡设施也被配置在单点;无法有效掌握服务器和应用程序的状态。软件负载均衡说完硬件负载均衡,我们再来说说软件负载均衡。软件负载均衡是指在一台或多台服务器的操作系统上安装一个或多个软件来实现负载均衡。其优点是基于特定的环境,配置简单,使用灵活,成本低,可以满足一般的负载均衡需求。代理层通常作为连接上层和下层的纽带,连接“接入层”,连接应用服务器(上游服务器),可作为反向代理、缓存、数据校验、限流等.本文将为您一一介绍。目前市面上比较流行的软件负载均衡有LVS、HAProxy、Ngnix等。限于篇幅,我们以应用广泛的Nginx为切入点向大家讲解,然后对以上三类软件进行比较。功能描述及原理分析对于程序员来说,接触最多的就是软件负载均衡。您不仅需要知道如何使用它,还需要了解其背后的原理。下面列出了四个最常用的函数。①反向代理和负载均衡第一个功能是反向代理和负载均衡,如下图所示:客户端如何向应用服务器发送请求?客户端通过以下步骤向应用服务器发送请求:客户端向DNS请求URL。DNS将URL翻译成相应的IP。通过IP查找服务器。服务器收到请求的消息,转发给接入层处理。因为接入层使用了硬件负载均衡器,所以可以处理大量的数据。接入层将消息转发给代理层(并发5W),代理层的Nginx收到消息后根据反向代理的策略发送给上游服务器(应用服务器)。负载均衡的算法/策略负载均衡的算法其实有很多。这里以Nginx为例,介绍五种算法:Round-Robin:循环算法,默认算法。逐个轮询上游服务器,这个算法可以用权重来实现。Weight:权重算法,为应用服务器设置Weight的值。Weight默认值为1,Weight参数越大,被访问的概率越高。可以根据服务器配置和资源情况配置Weight值,使资源情况乐观的服务器能够承受更多的访问。IP-Hash:该算法可以根据用户IP进行负载均衡,具有相同IP的客户端请求报文将由同一个上游服务器响应。即保持同一个客户端的会话(Session)一致。Least_conn:将请求转发给连接数较少的后端服务器。轮询算法是将请求平均转发到各个后端,使它们的负载大致相同;但是,有些请求需要很长时间,这将导致它们所在的后端负载较高。在这种情况下,Least_conn可以达到更好的负载均衡效果。HashKey:该算法是对Hash算法的补充,主要考虑当上游服务器增加/删除时,请求不能被同一台服务器正确处理。因此,为每个请求设置一个HashKey,这样即使服务器发生变化,Key的值不变,也能找到对应的服务器。②动态负载均衡一般上游服务器采用微服务架构,那么负载均衡会将数据报发给哪个服务呢?如果服务出现问题,如何通知负载均衡器?如果有新的服务注册怎么办?动态加载平衡流程微服务会先注册到“服务注册发现”中心(Consul、Eureka)。注册中心包含微服务信息,Nginx会定时从这里拉取服务信息(Lua)。获取微服务信息后,当Nginx收到数据报时,可以从注册中心获取服务地址,并将信息传递给服务。③限流限流的工作可以在接入层用硬件负载均衡器完成,也可以在代理层完成。限流其实就是限制传入请求的数量。算法有很多,如令牌桶算法、漏桶算法、连接数限制等。这里我们介绍三种常用的。一般采用Nignx+Lua实现。当前连接数限制:由ngx_http_limit_conn_module模块实现。设置最大连接数和共享内存区大小,请求时判断是否超过最大连接数。如果超过最大连接数,则限制流量,否则连接数+1,请求结束后连接数-1。漏桶算法:由ngx_http_limit_req_module模块实现。一个固定容量的桶,数据报以固定的速率流出。数据报可以以任何速度流入桶中。如果数据报的容量超过了桶的容量,传入的数据报将被丢弃。根据这个规则,需要设置限流的区域,桶的容量,是否延时。漏桶策略令牌桶算法,桶的大小是固定的,以固定的速度将令牌丢入桶中。桶满后,后面添加的令牌将无法添加。当数据报到达时,从桶中取出令牌。如果桶中有token,则用token处理请求,处理完后销毁token;当数据报到达时,发现桶中没有令牌,请求将被拒绝。请求在发送到令牌桶之前需要通过过滤器/分类器,令牌桶可以对数据包进行分类。例如,某些类型的报文可以直接发送给应用服务器,而某些类型的报文需要经过令牌桶获取令牌才能发送。.又如:VIP可以直接向服务器发送请求,不经过令牌桶。令牌桶示意图④CacheNginx本地缓存机制接入层发送请求。如果能在Nginx本地缓存中命中,则直接返回缓存数据。如果没有命中,则返回给应用服务器。缓存更新服务器定时更新Nginx本地缓存信息。这些需要考虑数据的一致性,什么时候更新什么时候失效等等。Nginx缓存可以大大提高请求响应时间,可以将用户信息等不经常变化的信息提前放入缓存中,这样就不用每次请求都去请求应用服务器了。用户信息一旦更新,就可以按照一定的时钟频率写入缓存。另外,HTTPHEAD一般包含一些更新的信息。Nginx还可以通过expires、etag、if-modified-since实现浏览器缓存控制。其他几个功能如下:客户端超时重试DNS超时重试Proxy超时重试失败重试心跳检测配置还有服务器流行的软件负载均衡器目前比较流行的有LVS、Nginx和HAProxy,下面我们一一了解它们的特长。LVSLVS(LinuxVirtualServer)是一种使用Linux内核集群实现的高性能、高可用性的负载均衡服务器,具有良好的可扩展性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。LVS的特点是:只用于分发,即把请求直接分发给应用服务器,所以没有流量产生,资源消耗低。配置简单,可以配置的项目很少。它工作在第四层(传输层),支持TCP/UDP,支持广泛的应用。HAProxyHAProxy实现了一个支持大量并发连接的事件驱动的单进程模型。多进程或多线程模型受到内存约束、系统调度程序约束和无处不在的锁的限制,很少能处理数千个并发连接。HAProxy的特点是:支持虚拟主机。支持会话保留和cookie引导。通过指定的URL查看应用服务器的状态。支持TCP/HTTP协议转发。NginxNginx是一个轻量级的网络服务器/反向代理服务器和电子邮件(IMAP/POP3)代理服务器,在类BSD协议下发布。Nginx的特点是:工作在网络的4/7层,实现HTTP应用的负载均衡策略,如域名、目录结构等。对网络的稳定性依赖性小,可以区分访问内网和外网。安装和配置都比较简单。可承受高负载且稳定,处理的流量取决于Nginx服务器的配置。它可以检测服务器问题,对服务器返回的信息进行处理和过滤,避免服务器无法响应请求。可以异步处理请求。支持HTTP、HTTPS和EMAIL。网络负载均衡的技术选择既然我们对软/硬件负载均衡有了一个大致的了解,那么如何按照“技术服务业务”的原则,在业务发展的不同阶段使用这两类负载均衡技术呢?发展阶段企业业务从0到1,从无到有,数据量和访问量不大。使用Nginx或HAProxy的单点负载平衡就足够了。这个阶段刚刚采用多应用服务器和数据库,需要一定的负载均衡来支撑。由于业务量小,没有专业的维护团队维护,不需要大规模的网站部署。所以Nginx或者HAproxy是首选,因为使用起来很快,配置也很方便,而且第七层的HTTP协议可以满足要求。在扩张阶段,随着业务量的增加,用户访问量和交易量也逐渐增加。这时候单点的Nginx或者HAProxy已经不能满足之前的需求了。使用LVS或者硬件负载均衡(F5/Array)是架构师需要考虑的问题。Nginx现在作为LVS或者硬件负载均衡(F5/Array)的一个节点来处理。现阶段需要考虑软件负载均衡+硬件负载均衡的架构配置,这对架构设计者也是一个挑战。成熟期,随着公司业务扩张达到顶峰,之前的网络服务已经升级为主流服务产品,需要考虑在开源产品上进行业务定制,所以开源的LVS成为首选.深度定制后,仍会配合硬件负载均衡器完成业务服务。综上所述,今天的内容很多。总结起来就三句话:硬件负载均衡和软件负载均衡分别工作在“接入层”和“代理层”。一个专注于网络,负责多链路、防火墙和服务器负载均衡,如:F5BIG-IP。另一种是面向业务的,主要功能是反向代理、动态代理、缓存、限流,比如LVS、Nginx、HAProxy。作者:崔浩简介:十六年开发架构经验。曾在惠普武汉交付中心担任技术专家、需求分析师、项目经理,后在一家初创公司担任技术/产品经理。善于学习,乐于分享。目前专注于技术架构和研发管理。【原创稿件,合作网站转载请注明原作者和出处为.com】