LVS介绍
LVS(Linux Virtual Server):Linux虚拟服务器,由章文嵩博士发起的自由软件项目。
LVS 是一组服务器,在客户端看来是一个大型、快速、可靠(高可用性)服务器。该项目的核心是运行在LVS控制器上的ip_vs代码。
LVS工作在传输层,LVS由用户空间的ipvsadm和内核空间的ipvs组成,ipvsadm用来定义规则,ipvs利用ipvsadm定义的规则工作。
LVS是 Linux标准内核的一部分。在Linux2.4内核之前,使用LVS时必须要重新编译内核以支持LVS功能模块。在Linux2.4内核之后,Linux内置了LVS的各个功能模块,无需给内核打补丁,可以直接使用LVS提供的各种功能。
LVS的应用程序
Linux 虚拟服务器作为高级负载平衡解决方案可用于构建高度可扩展和高度可用的网络服务,例如可扩展的 Web、缓存、邮件、ftp、媒体和 VoIP 服务。
LVS特点
1、是一个 4 层交换机。它在网络中显示为路由器,其规则与普通路由器略有不同。
2、导向器接收来自客户端的连接请求,然后选择一个可用的后端服务器(在 LVS 语言中称为 realservers)来为客户端的请求提供服务。
3、Realserver可以提供通常在互联网上的单个服务器上提供的任何服务。
4、通过向控制器提供的命令,可以在客户端不知道 LVS 硬件更改的情况下,在 LVS 中添加和删除各个真实服务器。这允许 realserver 发生故障,以进行例行维护和升级,或者在硬件故障时发生故障,以及在高(或低)负载时添加(或删除)Realserver。
LVS结构
一组服务器通过高速的局域网或者地理分布的广域网相互连接,在它们的前端有一个负载调度器(Load Balancer)。
负载调度器能无缝地将网络请求调度到真实服务器上,从而使得服务器集群的结构对客户是透明的,客户访问集群系统提供的网络服务就像访 问一台高性能、高可用的服务器一样。
客户程序不受服务器集群的影响不需作任何修改。系统的伸缩性通过在服务机群中透明地加入和删除一个节点来达到,通过检 测节点或服务进程故障和正确地重置系统达到高可用性。由于我们的负载调度技术是在Linux内核中实现的,我们称之为Linux虚拟服务器(Linux Virtual Server)。
LVS框架
目前,LVS项目已提供了一个实现可伸缩网络服务的Linux Virtual Server框架。
负载均衡技术
IPVS软件实现三种IP负载均衡技术
1. Virtual Server via Network Address Translation(VS/NAT)通过NAT实现虚拟服务器
在一组服务器前有一个调度器,它们是通过Switch/HUB相连接的。这些服务器 提供相同的网络服务、相同的内容,即不管请求被发送到哪一台服务器,执行结果是一样的。服务的内容可以复制到每台服务器的本地硬盘上,可以通过网络文件系 统(如NFS)共享,也可以通过一个分布式文件系统来提供。
架构图
客户通过Virtual IP Address(虚拟服务的IP地址)访问网络服务时,请求报文到达调度器,调度器根据连接调度算法从一组真实服务器中选出一台服务器,将报文的目标地址 Virtual IP Address改写成选定服务器的地址,报文的目标端口改写成选定服务器的相应端口,最后将修改后的报文发送给选出的服务器。
同时,调度器在连接Hash 表中记录这个连接,当这个连接的下一个报文到达时,从连接Hash表中可以得到原选定服务器的地址和端口,进行同样的改写操作,并将报文传给原选定的服务器。
当来自真实服务器的响应报文经过调度器时,调度器将报文的源地址和源端口改为Virtual IP Address和相应的端口,再把报文发给用户。我们在连接上引入一个状态机,不同的报文会使得连接处于不同的状态,不同的状态有不同的超时值。
2. Virtual Server via IP Tunneling(VS/TUN)通过IP隧道实现虚拟服务器
IP隧道(IP tunneling)是将一个IP报文封装在另一个IP报文的技术,这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。IP隧道技 术亦称为IP封装技术(IP encapsulation)。IP隧道主要用于移动主机和虚拟私有网络(Virtual Private Network),在其中隧道都是静态建立的,隧道一端有一个IP地址,另一端也有唯一的IP地址。
我们利用IP隧道技术将请求报文封装转 发给后端服务器,响应报文能从后端服务器直接返回给客户。但在这里,后端服务器有一组而非一个,所以我们不可能静态地建立一一对应的隧道,而是动态地选择 一台服务器,将请求报文封装和转发给选出的服务器。这样,我们可以利用IP隧道的原理将一组服务器上的网络服务组成在一个IP地址上的虚拟网络服务。
架构图
工作流程
调度器根据各个服务器的负载情况,动态地选择一台服务器, 将请求报文封装在另一个IP报文中,再将封装后的IP报文转发给选出的服务器;服务器收到报文后,先将报文解封获得原来目标地址为VIP的报文,服务器发 现VIP地址被配置在本地的IP隧道设备上,所以就处理这个请求,然后根据路由表将响应报文直接返回给客户。
3. Virtual Server via Direct Routing(VS/DR)通过直接路由实现虚拟服务器
这种请求调度方法类似于IBM的NetDispatcher中实现的方法。虚拟 IP 地址由真实服务器和负载均衡器共享。负载均衡器也有一个配置了虚拟 IP 地址的接口,用于接受请求数据包,并将数据包直接路由到所选服务器。
所有真实服务器都配置了虚拟 IP 地址的非 arp 别名接口,或将发往虚拟 IP 地址的数据包重定向到本地套接字,以便真实服务器可以在本地处理数据包。负载均衡器和真实服务器必须有一个接口通过集线器/交换机进行物理链接。
架构图
工作流程
当用户访问服务器群集提供的虚拟服务时,发往虚拟 IP 地址(虚拟服务器的 IP 地址)的数据包将到达。负载均衡器 (LinuxDirector) 检查数据包的目标地址和端口。如果它们与虚拟服务匹配,则通过调度算法从群集中选择真实服务器,并将连接添加到记录连接的哈希表中。
然后,负载均衡器直接将其转发到所选服务器。当传入数据包属于此连接并且可以在哈希表中找到所选服务器时,数据包将再次直接路由到服务器。当服务器收到转发的数据包时,服务器会发现数据包是针对其别名接口上的地址或本地套接字的,因此它会处理请求并最终将结果直接返回给用户。连接终止或超时后,将从哈希表中删除连接记录。
负载均衡器只需将数据帧的 MAC 地址更改为所选服务器的 MAC 地址,并在 LAN 上重新传输。这就是负载平衡器和每个服务器必须通过 LAN 的单个不间断网段直接相互连接的原因。
三种方法的优缺点
负载调度算法
IPVS调度器实现了以下八种负载调度算法:
1. 轮叫(Round Robin)
调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
2. 加权轮叫(Weighted Round Robin)
调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
3. 最少链接(Least Connections)
调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载。
4. 加权最少链接(Weighted Least Connections)
在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
5. 基于局部性的最少链接(Locality-Based Least Connections)
"基于局部性的最少链接" 调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器 是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接"的原则选出一个可用的服务 器,将请求发送到该服务器。
6. 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)
"带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个 目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务 器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按"最小连接"原则从这个集群中选出一 台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的 程度。
7. 目标地址散列(Destination Hashing)
"目标地址散列"调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
8. 源地址散列(Source Hashing)
"源地址散列"调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
高可用性
随着越来越多的任务关键型应用程序在 Internet 上移动,提供高度可用的服务变得越来越重要。集群系统的优点之一是它具有硬件和软件冗余,因为集群系统由许多独立的节点组成,每个节点运行操作系统和应用软件的副本。高可用性可以通过检测节点或守护程序故障并适当地重新配置系统来实现,以便工作负载可以由集群中的其余节点接管。
高可用性是一个很大的领域。一个先进的高可用系统可以具有可靠的群通信子系统、成员管理、仲裁子系统、并发控制子系统等。
工作原理
负载平衡器上运行服务监视器守护程序来定期检查服务器运行状况。如果在指定时间内没有响应来自服务器的服务访问请求或 ICMP ECHO_REQUEST,服务监视器将认为该服务器已失效,并将其从负载平衡器的可用服务器列表中删除,因此不会向此失效服务器发送新请求。
当服务监视器检测到失效服务器已恢复工作时,服务监视器会将该服务器添加回可用服务器列表中。因此,负载均衡器可以自动屏蔽服务守护程序或服务器的故障。此外,管理员还可以使用系统工具添加新服务器以提高系统吞吐量或删除服务器以进行系统维护,而不会关闭整个系统服务。
负载均衡器可能成为整个系统的单个故障点。为了防止整个系统因负载均衡器故障而停止服务,我们需要设置负载均衡器的备份(或多个备份)。两个检测信号守护进程分别在主守护进程和备份守护程序上运行,它们定期通过串行线路和/或网络接口相互检测“我还活着”之类的消息。
当备份的检测信号守护进程在指定时间内无法听到来自主服务器的检测信号消息时,它将接管虚拟 IP 地址以提供负载平衡服务。当发生故障的负载均衡器恢复工作时,有两种解决方案,一种是它自动成为备份负载均衡器,另一种是活动负载均衡器释放 VIP 地址,恢复负载均衡器接管 VIP 地址并再次成为主负载均衡器。
主负载均衡器具有连接状态,即连接转发到哪个服务器。如果备份负载均衡器在没有这些连接信息的情况下接管,则客户端必须再次发送其请求以访问服务。为了使负载均衡器故障转移对客户端应用程序透明,我们在 IPVS 中实现了连接同步,主 IPVS 负载均衡器通过 UDP 多播将连接信息同步到备份负载均衡器。当主负载均衡器发生故障后备份负载均衡器接管时,备份负载均衡器将具有大多数连接的状态,以便几乎所有连接都可以继续通过备份负载均衡器访问服务。