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

TrafficSteering-解密网络世界中的负载均衡

时间:2023-03-21 16:47:31 科技观察

网络流量均衡的常用技术,它们的优势和权衡。大型多站点互联网系统,包括内容分发网络(CDN)和云服务提供商,使用一些方法来平衡传入流量。在本文中,我们将讨论常见的流量平衡设计,包括它们的技术手段和权衡。早期的云计算服务商可以提供单一的客户Web服务器,分配一个IP地址,然后使用人类可读的域名配置一个DNS记录指向这个IP地址,然后通过边界网关协议传递IP地址(边界协议)。)宣布BGP是在不同网络之间交换路由信息的标准方式。这本身并不是负载均衡,但它可以将流量分布在多个冗余的网络路径中,可以利用网络技术让流量绕过不可用的网络,从而提高可用性(也会造成路由不对称)。简单DNS负载均衡随着客户流量的增加,老板希望服务高可用。你使用第二个Web服务器上线,它有自己独立的公共IP地址,然后你更新你的DNS记录以将用户流量引导到两个服务器(希望它们能均匀地为你服务)。在其中一台服务器出现故障之前,此操作没有问题。假设您可以快速检测到故障,您可以更新DNS配置(手动或通过软件)以删除解析到故障机器的记录。不幸的是,由于DNS记录被缓存,大约一半的请求在使客户端和它们所依赖的DNS服务器上的缓存失效之前失败。DNS记录的生命周期(TTL)为几分钟或更长,因此这种方法会对系统可用性产生严重影响。更糟糕的是,一些客户端完全忽略了TTL,因此一些请求一直被定向到您的故障机器。设置很短的TTL也不是一个好主意,因为这意味着更高的DNS服务负载和更长的访问延迟,因为客户端要进行更多的DNS查询。如果DNS服务由于某种原因不可用,那么设置较短的TTL将导致该服务的流量下降得更快,因为更少的客户端会缓存您网站的IP地址。添加网络负载均衡为了解决上述问题,您可以添加一对相互冗余的第4层(L4)网络负载均衡器并配置相同的虚拟IP地址(VIP)。均衡器可以是硬件或软件,如HAProxy。域名的DNS记录指向VIP,不再承担负载均衡的功能。四层负载均衡器可以平衡用户和两个Web服务器之间的连接。四层均衡器会将网络流量均衡的引导到后端服务器。通常这是基于IP数据包的散列(数学函数)5元组完成的:源地址、源端口、目标地址、目标端口、协议(例如TCP或UDP)。这种方法快速高效(同时保持TCP的基本属性),并且不需要平衡器保持每个连接的状态。(更多信息请阅读谷歌发表的Maglev论文,该论文详细讨论了四层软件负载均衡器的实现细节。)四层均衡器可以对后端服务进行健康检查,只分发健康机器的流量。优越的。与使用DNS进行负载平衡不同,当后端Web服务发生故障时,它可以快速将流量重新分配给其他机器,尽管故障机器的现有连接将被重置。当后端服务器的能力不同时,四层均衡器可以根据权重分配流量。它以相对较低的硬件成本为运营商提供了强大的功能和灵活性。扩展到多站点系统的规模继续增长。您的客户希望能够一直使用该服务,即使在数据中心发生故障时也是如此。所以你新建了一个数据中心,独立部署了一套服务和一个四层的负载均衡集群,还是用同一个VIP。DNS设置不变。两个站点的边缘路由器都通告它们自己的地址空间,包括VIP地址。对该VIP的请求可能会到达任一站点,具体取决于用户和系统之间的网络连接方式,以及每个网络的路由策略是如何配置的。这是任播。大多数时候这种机制工作正常。如果一个站点出现问题,可以停止通过BGP公布VIP地址,客户的请求会很快转移到另一个站点。此设置存在一些问题,其中使用任播为多个站点提供服务。最大的问题是没有办法控制请求到哪个站点,或者限制某个站点的流量。也没有明确的方式将用户的请求转发到最近的站点(以减少网络延迟),但网络协议和路由配置应该能够在大多数情况下将用户的请求路由到最近的站点。在多站点系统中控制入站请求为了保持稳定性,有必要能够控制每个站点的流量。这种控制可以通过为每个站点分配不同的VIP地址,然后使用简单或加权DNS轮询来实现负载平衡来实现。多个站点提供服务,每个站点使用一个主VIP,另一个站点作为备份。基于地理感知DNS。现在有两个问题。首先,使用DNS平衡意味着会有缓存记录,如果你想快速重定向流量,这会很麻烦。其次,每次用户进行新的DNS查询时,他们可能会连接到任何可能不是最近的站点。如果您的服务在许多广泛分布的站点上运行,用户将体验到响应时间的显着变化,这取决于用户和提供服务的站点之间的网络延迟。让每个站点配置和通告所有其他站点(并因此包括故障站点)的VIP地址可以解决第一个问题。网络上有一些小技巧。例如,备份站点发布路由时,不像主站点那样具体使用目的地址。这样可以保证每个VIP的主站点只要有空就会优先提供服务。这是通过BGP完成的,因此我们应该看到流量在BGP更新后的一两分钟内开始移动。即使离用户最近的站点是健康的,有服务能力的,用户实际访问的站点也不一定是这个站点,这个问题也没有很好的解决办法。很多大型互联网服务使用DNS给不同地区的用户返回不同的解析结果,也能起到一定的作用。但是,由于网络地址的结构与地理位置无关,一个地址段可能会改变位置(例如,当公司重新设计网络时),许多用户可能使用同一个DNS缓存服务器。所以这个方案有一定的复杂度,容易出错。添加第7层负载平衡,一段时间后,您的客户开始要求更高级的功能。四层负载均衡虽然可以在多个Web服务器之间高效分配流量,但它们只对源地址、目的地址、协议和端口进行操作。不知道请求的内容是什么,所以很多高级功能都在四层负载均衡无法实现。七层(L7)负载均衡知道请求的内容和结构,所以它可以做更多的事情。七层负载均衡可以实现缓存、限速、错误注入,在做负载均衡的时候可以感知到请求的开销(有些请求需要服务器处理的时间比较长)。七层负载均衡还可以根据请求属性(如HTTPcookie)分发流量,终止SSL连接,帮助防御应用层的拒绝服务(DoS)攻击。大规模L7负载均衡的缺点是成本——需要更多的计算来处理请求,并且每个活跃的请求都会占用一些系统资源。在一个或多个L7平衡器之前运行一组L4平衡器有助于扩展。结论负载平衡是一个复杂的问题。除了上述策略外,还有不同的负载均衡算法,用于实现负载均衡器的高可用性、客户端负载均衡技术以及最近新兴的服务网络等。核心负载均衡范式随着云计算的发展而演变,并将随着大型Web服务提供商努力使负载平衡更加可控和灵活而继续发展。