随着Internet用户的增长,基于Web的公司处理的通信量急剧增加。有各种解决方案来应对这种不断增长的流量。
一种解决方案是垂直扩展服务器(即:简单地向服务器添加更多的CPU和内存资源。)当然在一定程度上是无法完成的。
另一个解决方案是水平扩展服务器(即:添加更多可以应对流量激增的服务器。)。这种机制通常称为集群。
在集群中,多台服务器作为单个组件共同作用,向最终用户提供所需的服务。
当流量/负载增加时,我们可以简单地将更多服务器添加到群集中,因此它具有更高的可扩展性。
在本文中,我们将重点介绍可用于Linux虚拟服务器(LVS)的不同方法和方案。
LVS是一个开源项目,始于1998年,其主要重点是使用由商用硬件组成的集群来构建高可用性和负载平衡解决方案。
如上图所示,典型的LVS群集由位于前面的负载均衡器和位于后面的一组服务器(称为“真实服务器”)组成。最终用户请求首先发送到虚拟IP地址(VIP)。
VIP或虚拟IP地址是为虚拟群集提供的服务添加为A记录的地址。路由器的主要工作(如上图中心所示,Linux框为Linux)是将用户的请求发送到真实服务器。因此,有时也称为调度程序。
从最终用户向真实服务器发送请求的方法有多种。LVS具有三种服务请求的模式。这些在下面提到。
- LVS VIA NAT(网络地址转换)相关信息: 什么是网络地址转换?
- LVS VIA IP隧道
- LVS VIA直接路由
什么是LVS VIA NAT?
通过NAT的Linux虚拟服务器是最简单的配置。这是因为在真实服务器上不需要修改。真实服务器可以是任何支持TCP IP堆栈的操作系统。通过NAT的LVS是使用Linux中的IP伪装技术实现的。用户的请求首先到达分配给前端负载均衡器的虚拟IP。然后,负载均衡器会对数据包进行调查,并使用池中真实服务器的目标地址对其进行修改,然后将其转发至真实服务器。
此处要注意的另一重要事项是虚拟IP(客户端访问的IP,通常作为提供服务的域名的A记录添加到IP中)仅分配给负载均衡器。Real服务器可以具有任何专用寻址方案。
让我们研究当请求到达前端负载均衡器时,直到响应传递回客户端之前发生的一系列事件。为了理解这一系列事件,让我们考虑一个从客户端到虚拟服务器的示例请求,以及从负载均衡器返回到客户端的最终响应。以下是我们将用来理解此示例的地址。
客户端源地址: 183.38.214.214
虚拟IP(分配给负载均衡器的IP): 212.71.233.103
真实服务器1: 10.1.10.1
真实服务器2: 10.1.10.2
步骤1:用户(183.83.214.214)向分配给负载均衡器(212.71.233.103)的VIP发送对所需服务的请求。该请求如下所示。
源地址(183.83.214.214)------->目的地地址(212.71.233.103)
步骤2:负载平衡器在收到请求后,检查请求目的地和端口。如果请求与负载均衡器配置中定义的特定服务匹配,则使用选择算法从池中选择一个真实服务器(在我们的示例中,我们有两个真实服务器)。一旦选择了Real Server,负载均衡器会将连接信息和所选的Real Server记录在表中,然后修改数据包的目标地址和端口(为Real Server的地址和端口),并将数据包转发到Real Server。让我们考虑选择的Real服务器是10.1.10.1,在这种情况下,转发数据包的源和目的地将如下所示。
源地址(183.83.214.214)------->目的地地址(10.1.10.1)
在选择Real服务器后,负载平衡器记下了连接信息(在表中),来自同一连接的后续数据包将简单地用已选择的Real服务器目标地址(可从表中找到)重写。
步骤3:当负载均衡器从Real Server获取响应数据包时,它将再次将源地址和端口重写为其自己的虚拟IP和服务端口的源地址和端口。然后,它将响应发送回用户。
源地址(212.71.233.103)------->目的地地址(183.83.214.214)
最终用户永远不会意识到后面的Real Server。用户始终认为实际响应是由负载均衡器的虚拟IP地址创建和传递的。
通过NAT进行LVS的主要优点是Real Server可以运行任何操作系统,并且仅使用一个IP地址。通过nat进行LVS的缺点是,负载均衡器将目标地址重新写入两次以完全满足单个请求。由于这种重写,如果请求数量很高,则负载平衡器可能会耗尽资源。如果后端真实服务器的数量更多,情况将变得更糟。
什么是LVS VIA IP隧道?
与通过NAT的LVS相比,通过IP隧道的LVS是更好的可扩展解决方案。这是由于两个主要原因。
- 负载平衡器不会对IP数据包进行多次重写。
- 实际响应永远不会通过负载均衡器发送。
IP隧道是将数据包发送到Real Server的技术。在上面显示的图中,在负载均衡器和所有Real Server之间建立了IP隧道。
关于通过IP隧道进行LVS的另一项重要注意事项是,每个Real Server必须具有配置了虚拟IP地址的隧道接口。Real Server可以位于同一LAN中,甚至可以位于WAN网络中。这会在Real服务器的出口路由器上引入另一种配置更改(如果Real服务器位于完全不同的网络上),并且应将其配置为接受具有虚拟IP地址的传出数据包(这是因为路由器具有以下安全措施:丢弃带有源地址的数据包,该地址不属于其接受的列表。)
下面描述了通过IP隧道使用LVS完成请求所涉及的一系列步骤。
步骤1:客户端将请求发送到分配给负载均衡器的虚拟IP地址。在这里,源地址将是客户端的地址,而目标地址将是分配给负载均衡器的VIP。
步骤2:负载均衡器检查数据包,并在数据包与定义的服务规则匹配的情况下,将数据包封装在另一个IP数据包中,然后转发到使用选择/调度算法选择的Real Server。此处,负载平衡器还将连接信息添加到表中,以便可以封装来自同一连接的后续请求并将其发送到同一Real Server。
IP隧道与VPN非常相似(无需加密)。真实服务器可以具有任何不同网络的任何IP地址。但它也应该在虚拟接口上配置负载均衡器的虚拟IP地址。这意味着所有通过IP隧道方法参与LVS的服务器都应分配VIP。这带来了ARP的另一个问题。问题是,如果客户端和LVS群集都在同一个LAN中,则Real服务器永远不要使用针对虚拟IP地址的ARP请求进行响应,否则客户端可能会错误地直接到达Real服务器,而不是通过负载均衡器。
通过在非arp接口(例如lo:0或tun0等)上的Real服务器中分配虚拟IP地址,可以解决此问题。
实际请求被封装在另一个IP数据包中,并从池中发送到Real服务器之一。
步骤3: Real Server解压缩Load Balancer发送的数据包,并从客户端读取原始数据包。然后,Real Server处理该数据包,并将响应直接发送到客户端。
由于真实服务器支持IP隧道协议,因此它将数据包解封装并读取原始数据包。在原始数据包的目标字段中找到虚拟IP (已分配给Real服务器上的非arp接口之一)后,Real服务器会认为“是。此数据包适合我..!”,然后处理它,然后将响应直接发送到客户端。
这种隧道方法的主要优点是,负载平衡器不会因重写数据包而过载。可能的缺点可能是Real Server上IP隧道支持的基本要求。
什么是LVS VIA直接路由?
尽管我们减少了使用第二种方法进行多次数据包重写的开销,但是仍然存在IP隧道管理的开销。使用LVS的另一种方法既没有隧道的开销,也没有重写的开销。
此方法称为直接路由方法。在一个方面,它与第二种方法非常相似。响应将从Real服务器直接发送给用户。
在这种方法中,虚拟IP也由负载均衡器和真实服务器分配和共享。如上一节所述,虚拟IP地址被分配给不响应ARP请求的接口(这在此方法中非常重要,因为负载均衡器和Real服务器都位于同一物理段中。)
步骤1:与往常一样,客户端将请求发送到负载均衡器上分配的虚拟IP。负载平衡器检查该请求,如果找到类似的服务配置,则它将仅将数据包转发到选定的虚拟服务器。与其他方法类似,负载均衡器也建立了非连接,因此只需查看表,即可将来自同一连接的后续数据包转发到同一Real服务器。
好吧,负载平衡器修改的唯一内容是mac地址。一旦使用选择/调度算法选择了Real Server,它将使用Real Server的mac地址简单地修改帧,并在LAN上转发帧。这是使用此方法将Load Balancer和Real服务器需要位于同一LAN网段上的主要原因。
步骤2:由于Real服务器在其非arp接口之一上配置了相同的虚拟IP地址,因此它接受数据包并进行处理。然后将响应直接发送回客户端。
这种方法的主要优点是所涉及的开销非常少。唯一的缺点是Real Servers和Load Balancer需要相同的LAN网段。
Linux虚拟服务器中不同负载平衡方案的摘要
LVS类型 | 通过NAT进行LVS | 通过IP隧道进行LVS | 通过直接路由LVS |
好处 |
|
|
|
组态 | 虚拟服务器端不需要特殊配置。 |
| 虚拟IP必须在非arp接口上分配(主要是环回) |
可扩展性 | 更少,因为重写开销 | 高 | 高 |
转载链接:https://www.slashroot.in/lvs-linux-virtual-server-different-methods-of-load-balancing