Twitter如何使用确定性负载平衡算法来提高资源使用

推特最近分享了为什么他们的RPC框架Finagle使用确定性孔径算法为他们的微服务架构实现客户端负载平衡的细节。Twitter进行了不同的实验,但证实采用确定性方法,请求得到更好的分发,连接数量急剧减少,甚至需要更少的基础设施。

过去几年来,Twitter一直在使用客户端负载平衡技术,它的微服务体系结构。他们称这种技术为“确定性孔径”,它是Finagle的RPC框架的一部分,JVM的开源项目。Finagle在每个客户端嵌入一个客户端负载平衡器。所有的请求都不是直接呼叫中央服务器端的负载平衡器,而是直接到达一个没有中介的目的服务器。因此,减少系统中的基础设施层、网络跳、带宽和故障点。客户端负载平衡是贝克街和Netflix Ribbon等其他项目以及Yelp、Airbnb或Stripe等公司运行微服务系统的一种方法。

客户端负载均衡器意味着现在可以有多个负载均衡器分布在客户端-至少每个客户端一个。因此,当试图以一种均匀的方式向服务器分配流量负载时,特别是当有数千台服务器时,情况就变得复杂了。因此,Finagle的确定性孔径算法结合了P2C(两个随机选择的功率)方法来分配流量负载,并在选择要连接的服务器时结合了确定性方法。P2C是一种基于Michael Mitzenmacher的论文“随机负载平衡中两种选择的力量”的策略,其中负载平衡器随机从集群中选择一小部分服务器,然后将请求路由到加载最少的服务器。

为了解释确定论孔径算法是如何工作的,Twitter将客户端和后端服务器表示为等距间隔的环。

资料来源:SREcon19Americas-Aperture:一种非合作、客户端负载平衡算法

作为第一步,负载均衡器必须选择一个服务器子集来连接,这是孔径大小。此子集只表示平衡器将连接到哪个服务器,然后路由请求。至少,孔径大小为1/N,其中N是服务器的数量-如前面的图表所示。但这可以在Finagle中进行不同的配置,并使用反馈控制器来获得更好的孔径大小。

一旦孔径大小得到解决,所有请求都在服务器内均匀分布,但这种分布并不一定意味着它对请求进行平等的路由-这对整个系统来说可能是不公平的。也就是说,对于三个服务器内100%的请求,一个服务器可以接收10%,另一个服务器可以接收60%,另一个服务器可以接收30%(如上图中的示例所示)。当集群需要添加或删除服务器时,孔径大小可能会发生变化。该算法实现了客户之间的光协调,并在整个系统中实现了最小的中断。

资料来源:SREcon19Americas-Aperture:一种非合作、客户端负载平衡算法

但在找到确定性孔径算法之前,Twitter正在随机选择服务器的子集,允许它们减少连接的数量。但是,请求负载没有得到公平的分配。例如,有更多被占用的服务器每秒接收400个请求,而其他服务器则处于空闲状态,只有一小部分请求


来自Twitter的RubenOanta在SRECon上分享了在Twitter生产基础设施中运行Finagle的确定性孔径算法后的结果。首先,请求在服务器之间的分布更加均匀,帮助它们有效地利用资源。然后,Twitter减少了91%的连接到目标服务器。最后,他们有较少的请求故障,延迟减少在99.9百分位数,大约25%的CPU减少,总共JavaGC减少一半。

然而,确定性孔径有一些局限性。例如,对于小簇,由于最小孔径大小,连接的数量往往高于大簇。此外,如果流量像缓存刷新后一样突发,一些服务器漏洞最终会接收到比其他服务器更多的流量。

用户可以在项目站点或GitHub存储库中了解更多关于如何开始使用Finagle及其孔径负载平衡器的信息。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。