ITPub博客

首页 > 数据库 > 数据库开发技术 > 流量调度与负载均衡

流量调度与负载均衡

原创 数据库开发技术 作者:greencoatman 时间:2024-02-08 12:07:34 0 删除 编辑

为什么会需要负载均衡(Load Balance)


流量调度是指按照特定的策略,将大量用户并发的请求有效地分配到多个服务器程序实例上的过程。为了更好地理解这个概念,我们需要先明白几个与服务器程序实例(进程)相关的基本概念,包括连接数、IOPS(每秒输入输出操作次数)、以及流量(包括入向流量和出向流量)。

  • 连接数(或并发数):这是指同时处于服务请求中的请求数量。也就是说,这些请求已经被发送了,但还没有收到响应。

  • IOPS(每秒输入输出操作次数):这代表服务器每秒可以完成的“请求-响应”对的数量。这个指标可以用来衡量服务器处理请求的效率。

  • 流量:分为入向流量和出向流量。入向流量是指平均每秒接收到的请求数据包的数量乘以请求包的平均大小。出向流量是指平均每秒发送的响应数据包的数量乘以响应包的平均大小。在理想情况下,没有失效的请求(即每个请求都会得到响应),那么入向和出向流量的计算就可以基于IOPS进行。

DNS 流量调度

最基础的方式,是通过 DNS,如下图所示。

一个域名通过 DNS 解析到多个 IP,每个 IP 对应不同的服务端程序实例。这样就完成了流量调度。这里我们没有用到常规意义的负载均衡(Load Balance)软件,但是我们的确完成了流量调度。那么这种做法有什么不足?

升级的不便利性

要升级某个服务端程序实例,如IP1,首先需要将其从DNS解析中移除,等待该实例不再接收新的流量后再进行升级,最后再将其重新加入DNS解析。虽然这个过程看似直接,但存在一个重要的不确定因素——DNS解析的缓存机制。即便设置了较短的TTL(例如15分钟),实际上由于DNS解析的多级缓存机制,导致有些用户的请求可能在一天后仍被路由到即将升级的实例上。这种方法导致完成单个实例的升级周期变得异常漫长。如果每个实例升级需要一天,而总共有十个实例,整个升级过程可能需要十天之久,这显然是不可接受的。

流量调度的不均衡问题

虽然DNS服务器能够实现一定程度上的流量均衡,通过轮询方式返回不同的IP地址以分散用户请求,但这种基于域名解析的流量均衡方式并不能确保真正的流量均匀分配。一方面,客户端可能会缓存DNS解析结果,从而不会每次请求都进行新的DNS解析。另一方面,由于DNS解析结果本身也存在多级缓存,真正到达DNS服务器进行新解析的请求比例非常小。因此,依赖于DNS解析进行流量调度的方式在实际应用中往往是粗糙且难以控制的。

那么,怎么让流量调度能够做到真正均衡?

LVS(Linux Virtual Server)是一个基于网络层的负载均衡软件,由章文嵩博士发起。它通过分配网络流量到多个服务器,以提高网站和服务的可用性和性能。LVS支持三种负载均衡模式:VS/NAT(网络地址转换)、VS/TUN(IP隧道)、和VS/DR(直接路由),每种模式以不同的方式处理客户端的请求和服务器的响应,以优化性能和资源利用。

  • VS/NAT模式中,请求和响应都经过调度器转发,性能相对较低。

  • VS/TUN模式利用IP隧道转发请求,直接由服务器响应客户,提高了性能。

  • VS/DR模式通过改写请求的MAC地址,直接将请求发送至服务器,性能最优。

LVS使用虚拟IP(VIP)技术,允许多台服务器共享一个IP地址,提高了系统的可扩展性和可靠性。然而,如果服务器宕机而调度器未能及时更新,会导致请求失败,这种情况需要客户端重试来解决。总的来说,LVS是一种高效、可靠的负载均衡解决方案。

应用层负载均衡

为了避免因服务器宕机而导致请求失败的情况,一种有效的解决方案是通过应用层负载均衡,即使用应用网关进行服务端重试。应用网关,特别是基于HTTP协议的HTTP应用网关如Nginx和Apache,因为能够理解应用层协议的细节,所以它们在处理请求和进行负载均衡时具有很大的灵活性和强大的功能。

工作原理是,HTTP网关在接收到客户端的HTTP请求后,会根据特定的调度算法将请求转发给后端的业务服务器(Real Server)。如果遇到服务器无响应或宕机的情况,HTTP网关可以将请求重新发送给其他可用的服务器实例,以此实现服务端重试。为了支持重试机制,关键在于要保存原始的HTTP请求。这样,在某个服务器实例处理失败时,可以重新利用保存的请求信息进行重试。

大多数HTTP请求体积不大,可以直接在内存中保存,使得保存代价较低。但对于包含大文件上传的请求,可能需要通过临时文件或其他机制来存储HTTP请求数据,以支持重试机制。

优雅升级

利用负载均衡技术,不仅可以实现流量的均匀分配,还大大简化了业务服务器的升级流程。根据负载均衡的类型,升级过程有所不同:

LVS(网络层负载均衡)场景:

  1. 升级通知:通知LVS调度器(Director Server)下线待升级的业务服务器(Real Server)实例。

  2. 流量调度调整:LVS调度器将该实例从调度集合中移除,停止向其分配新流量。

  3. 服务器准备退出:待升级的服务器实例完成当前处理中的请求后主动退出。

  4. 升级并重启:更新服务器实例至新版本并重启。

  5. 重新加入调度:将升级后的服务器实例重新加入到LVS调度集合中,参与流量调度。

HTTP应用网关(应用层负载均衡)场景:

  1. 升级通知:通知待升级的业务服务器实例准备退出。

  2. 新请求处理:该服务器实例进入退出状态,拒绝新的请求(可能通过返回特定的状态码)。

  3. 完成处理并退出:处理完所有在处理中的请求后,服务器实例主动退出。

  4. 升级并重启:更新服务器实例至新版本并重启。

HTTP应用网关由于支持重试机制,使得业务服务器的升级过程更为简单和灵活。在HTTP应用网关场景下,即使某个服务器实例因升级而暂时不可用,网关可以将请求重试到其他可用实例,从而确保服务的连续性和可靠性。这种方式减少了升级过程中的服务中断时间,提高了用户体验。

今天的讨论涉及了流量调度和几种典型的负载均衡手段,突出了负载均衡在实现业务服务器压力均衡中的重要作用。负载均衡技术的核心价值之一是确保多个业务服务器的工作负载均匀分布,这背后的一个关键假设是负载均衡系统本身的处理能力通常远超单个业务服务器。

这种能力差异主要表现在两个方面:

  1. 实例数量比例:负载均衡器的数量远少于业务服务器的数量,实例数比例远小于1,显示出负载均衡器在处理高并发请求上的高效率。

  2. 不均匀的压力分配:即使在使用DNS进行流量调度时存在不均衡,导致不同的负载均衡实例承受的压力不同,有些实例可能面临较大的负载压力。


原文作者:二进制跳动;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2022-07-08

  • 博文量
    312
  • 访问量
    141187