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

吃透“负载均衡”只需要这篇文章

时间:2023-03-22 00:54:57 科技观察

我们对高可用都有一个基本的认识,其中负载均衡是高可用的核心工作。本文将通过以下几个方面,让您彻底了解“负载均衡”。什么是负载均衡?常用负载均衡策略常用负载均衡策略优缺点及适用场景图使用健康检测保证高可用结语什么是负载均衡?二次分发的过程就是负载均衡,其本质和分布式系统一样,都是分而治之。如果你习惯在开车的时候使用一些导航软件,我们会发现导航软件推荐的路线规划会有一个上限,比如3条或者5条路线。所以本质上也起到了类似负载均衡的作用,因为如果你只能走Top3畅通的路由,自然就不能把拥堵严重的路由推荐给你,让流量的压力分散到相对空闲的路由上.在软件系统中也是如此。为了避免流量分配不均和本地节点负载过大(如CPU不足等),引入了一个独立的统一入口来做类似上述“导航”的工作。但是,软件系统中的负载均衡与导航的区别在于,导航是一种灵活的策略,最终需要用户做出选择,而前者则不同。如何平衡的背后是策略在起作用,而策略的背后是由一定的算法或逻辑组成的。例如导航中的算法属于路径规划的范畴,又细分为静态路径规划和动态路径规划,不同分支下有各种具体的计算算法,如Dijikstra、A*等。同样,在软件系统的负载均衡中,也有很多算法或逻辑支持这些策略。巧合的是,也有静态和动态之分。常用负载均衡策略示意图下面列出了日常工作中最常用的五种策略。轮询是最常用和最简单的策略。它是均匀分布的,每个人都有一个。大致代码如下:intglobalIndex=0;//注意是全局变量,不是局部变量。try{returnservers[globalIndex];}finally{globalIndex++;if(globalIndex==3)globalIndex=0;}加权轮询在轮询中增加了权重的概念。重量是一个广义的概念,可以用任何方式来表达,本质上是一种思想,谁能做更多的工作。例如,可以根据主机的性能差异配置不同的权重。大致代码如下:intmatchedIndex=-1;inttotal=0;for(inti=0;ie.active_conns).first();matchedServer.active_conns+=1;returnmatchedServer;//当连接关闭时,active_conns需要减1。最快响应也是一种动态负载平衡策略。其实质是根据各个节点对过去一段时间的响应情况进行分配。响应越快,分配越多。还有很多具体的操作方式。上图中的可以理解为记录最近一段时间请求时间的平均值,结合前面的加权轮询进行处理,所以相当于2:1:3的加权轮询。题外话:一般来说,同一个机房??的延迟基本没有区别,响应时间的区别主要在于服务的处理能力。如果用在一些跨地域的请求处理中(比如:浙江->上海,或者浙江->北京),大部分情况下会使用常规的“Ping”方式获取时延,因为是OSIL3转发,数据更干净,更准确。Hash法Hash法的负载均衡方法与前面的不同,它的结果是由客户端决定的。客户端带来的某个标识符通过标准化的哈希函数进行分散和分发。上图中的哈希函数使用了最简单粗暴的求余法。题外话:hash函数除了取余,还有rebase、folding、取正方形中间等方法,这里不再展开。感兴趣的小伙伴可以自行查阅资料。另外,待取余的参数可以是任意的,只要最终转化为整数参与运算即可。最常用的应该是使用源IP地址作为参数,这样可以保证同一个客户端请求尽可能落在同一个服务器上。常用负载均衡策略优缺点及适用场景我们知道没有什么是完美的,负载均衡策略也是如此。以上列出的最常用的策略也各有优缺点和适用场景。我稍微整理了一下,如下。这些负载均衡算法之所以被普遍使用,是因为它们的简单性。如果你想要更好的结果,你将不可避免地需要更高的复杂性。例如,可以组合使用简单的策略,或者通过更多维度的数据采样进行综合评价,甚至可以根据数据挖掘后的预测算法进行综合评价。使用健康检测来保证高可用无论是什么策略,都难免会出现机器故障或者程序故障。因此,为了保证负载均衡能够更好地工作,需要结合一些健康检测机制。定时检测服务器是否还能连接,响应是否比预期慢。如果该节点处于“不可用”状态,则需要将该节点暂时从列表中移除,以提高可用性。常用的健康检测方法有3种。HTTP检测使用Get/Post在服务器端请求一个固定的URL来判断返回的内容是否符合预期。一般使用HTTP状态码和Response中的内容来判断。TCP检测是基于TCP的三次握手机制来检测指定的IP+端口。最佳实践可以借鉴阿里云的SLB机制,如下图所示:▲图片来自阿里云,版权归原作者所有。值得注意的是,为了尽快释放连接,在三次握手后立即跟随RST中断TCP连接。UDP探测一些应用程序可能使用UDP协议。在该协议下,可以通过数据包检测到指定的IP+端口。最佳实践还可以借鉴阿里云的SLB机制,如下图:▲图片来自阿里云,版权归原作者所有。否则,将返回ICMP错误消息。结语一句话概括负载均衡的本质:将请求或流量按照预期的规则分配给多个运行单元执行。通过它可以实现水平扩展(scaleout),冗余的作用可以作为高可用。此外,还可以物尽其用,提高资源利用率。