1.8. Linux 虚拟服务器
Linux 虚拟服务器(LVS)是一组集成的软件组件,它用于在真实服务器之间平衡 IP 负载。LVS 运行在一对配置相同的机器上:一个作为活动的 LVS 路由器而另外一个作为备份 LVS 路由器。活动的 LVS 路由器扮演两个角色:
- 在真实服务器之间平衡负载。
- 检查每个真实服务器上的服务的完整性。
备份 LVS 路由器监控活动的 LVS 路由器并在它发生故障时进行接管。
图 1.19 “Components of a Running LVS Cluster” provides an overview of the LVS components and their interrelationship.
图 1.19. Components of a Running LVS Cluster
pulse
守护进程运行在活动的以及备份 LVS 路由器上。在备份 LVS 路由器上,pulse
发送 heartbeat 到活动路由器的公用接口,确保活动路由器正常工作。在活动的 LVS 路由器上,pulse
启动 lvs
守护进程并响应备份 LVS 路由器的 heartbeat 查询。
一旦启动,
lvs
守护进程将调用 ipvsadm
工具来配置和维护内核里的 IPVS(IP 虚拟服务器)路由表,并为每台真实服务器上配置的的每个虚拟服务器启动一个 nanny
进程。每个 nanny
进程检查一台真实服务器上的一个配置好的服务的状态,并告诉 lvs
守护进程这个服务是否发生了故障。如果检测到了故障,lvs
守护进程将指引 ipvsadm
从 IPVS 路由表中删除那台真实服务器的条目。
如果备份 LVS 路由器没有从活动的 LVS 路由器收到响应,它将初始化故障切换,调用
send_arp
将所有虚拟 IP 地址重新分配给备份 LVS 路由器的 NIC 硬件地址(MAC 地址),并通过公用以及专用网络接口向活动的 LVS 路由器发送命令来关闭其 lvs
守护进程,然后在备份 LVS 路由器上启动 lvs
守护进程来接受虚拟服务器的请求。
对于访问宿主服务(如网站或数据库应用程序)的外部用户,LVS 就象是一个服务器。然而,用户实际上访问了 LVS 路由器后面的多个真实服务器。
因为在 LVS 里没有内置组件在真实服务器间共享数据,您有两个基本选择:
- 在真实服务器间对数据进行同步。
- 在拓扑结构中添加用于共享数据访问的第三层。
对于不允许大量用户在真实服务器上上载或修改数据的服务器来说,第一个选择是首选项。而如果真实服务器允许大量用户修改数据,如电子商务网站,添加第三层则更为可取。
有许多方法可以在真实服务器间进行数据同步。例如,您可以使用 shell 脚本同时将更新的 web 页面登记到真实服务器。或者,您可以使用
rsync
等程序以设定的时间间隔在所有节点间复制改动的数据。然而,在用户频繁地上载文件或执行数据库事务的环境里,使用脚本或 rsync
命令来进行同步并不是最理想的方法。因此,对于执行大量上载、数据库事务或具有类似流量的真实服务器,三层的拓扑结构(three-tiered topology) 更适合于数据同步。
1.8.1. Two-Tier LVS Topology
图 1.20 “Two-Tier LVS Topology” shows a simple LVS configuration consisting of two tiers: LVS routers and real servers. The LVS-router tier consists of one active LVS router and one backup LVS router. The real-server tier consists of real servers connected to the private network. Each LVS router has two network interfaces: one connected to a public network (Internet) and one connected to a private network. A network interface connected to each network allows the LVS routers to regulate traffic between clients on the public network and the real servers on the private network. In 图 1.20 “Two-Tier LVS Topology”, the active LVS router uses Network Address Translation (NAT) to direct traffic from the public network to real servers on the private network, which in turn provide services as requested. The real servers pass all public traffic through the active LVS router. From the perspective of clients on the public network, the LVS router appears as one entity.
图 1.20. Two-Tier LVS Topology
到达 LVS 路由器的服务请求被指引到虚拟 IP 地址或 VIP。这是一个公用的地址,站点管理员将它和全限定域名相关联,如 www.example.com,并分配给一个或多个虚拟服务器[1]。注意,进行故障切换时,VIP 地址将从一个 LVS 路由器移植到另外一个 LVS 路由器,并保持这个 IP 地址,这被称为浮动 IP 地址(floating IP address)。
VIP 地址可以以连接 LVS 路由器到公用网络的接口为别名。例如,如果 eth0 连接至 Internet,那么多个虚拟服务器可以使用别名
eth0:1
。或者,每个虚拟服务器可以按照服务和单独的设备相关联。例如,HTTP 通信在 eth0:1
上处理,而 FTP 通信在 eth0:2
上进行处理。
在某一时刻只能有一个 LVS 路由器处于活动状态。活动的 LVS 路由器的角色是将服务请求从虚拟 IP 地址重定向到实际的服务器。这种重定向是基于下面 8 个负载平衡算法中的一个:
- 轮询调度(Round-Robin Scheduling)— 将每个请求按顺序地在一个服务器池里进行分发。使用这个算法,所有的真实服务器都被一视同仁,而不考虑其能力或负载。
- 加权轮询调度(Weighted Round-Robin Scheduling)— 将每个请求按顺序地在一个服务器池里进行分发,但赋予能力更强的服务器更多的负载。能力用用户分配的权重来表示,然后根据负载信息动态地进行上下调整。如果服务器池里的服务器的能力区别很大,这是首选的办法。然而,如果请求负载突然发生变化,权重更大的服务器可能会处理超过其份额的请求。
- 最小连接调度(Least-Connection Scheduling)— 给活动连接较少的服务器分配更多的请求。这是一种动态调度算法,如果请求负载变化较快,这是一个更好的选择。它最适合于每个节点都具备基本相同的能力的服务器池。如果服务器的能力不一样,权重最小连接调度(weighted least-connection scheduling)就是更好的选择。
- 权重最小连接调度(Weighted Least-Connections)— 这是缺省的算法。它将更多的请求分配给相对其能力具有较少连接的服务器。能力以用户分配的权重来表示,并根据动态负载信息上下调整。当服务器池包含具有不同能力的硬件时,附加的权重使其成为理想的算法。
- 基于局部性的最少连接调度(Locality-Based Least-Connection Scheduling)— 将更多的请求分配给相对其目的 IP 地址具有较少连接的服务器。这个算法用于代理-缓存(proxy-cache)的服务器群集。它根据目标 IP 地址将数据报文指引到这个地址的服务器,除非该服务器超载并有一服务器处于一半的工作负荷,此时它将分配给负荷最小的服务器。
- 带复制的基于局部性最小连接调度(Locality-Based Least-Connection Scheduling with Replication Scheduling)— 将更多的请求分配给相对其目的 IP 地址具有较少连接的服务器。这个算法也用于代理-缓存(proxy-cache)的服务器群集。它和基于局部性最小连接调度的区别是:它将目标 IP 地址映射到服务器节点的一个子集。请求将被发送到这个子集里具有最低连接数的服务器上。如果所有目的 IP 地址的节点都超载,它将整个服务器池里的具有最少连接数的服务器添加到用于该目的 IP 地址的服务器子集里,这样就复制了用于该地址的一个新的服务器。然后负载最重的节点将从服务器子集里删除来防止过度复制。
- 源地址散列调度(Source Hash Scheduling)— 通过在静态散列表里查找源 IP 地址来将请求发送到服务器池。这个算法用于带有多重防火墙的 LVS 路由器。
而且,活动的 LVS 路由器通过简单的 send/expect scripts 动态地监控服务器上的特定服务的健康状况。为了帮助检测需要动态数据的服务(如 HTTPS 或 SSL)的健康状况,您也可以调用外部的执行程序。如果服务器上的服务发生了故障,活动的 LVS 路由器将停止发送任务到这个服务器,直到它恢复正常操作。
备份 LVS 路由器扮演备用系统的角色。LVS 路由器通过主要的外部公用接口定期地交换 heartbeat 信息,在故障切换的情况下则通过专用接口。如果备份 LVS 路由器在预期的时间间隔里没有接收到 heartbeat 信息,它将初始化故障切换并开始执行活动 LVS 路由器的任务。在故障切换过程中,备份 LVS 路由器用 ARP spoofing 技术接管失效路由器的 VIP 地址 — 备份 LVS 路由器将自己作为发送到失效节点的 IP 数据包的目的地。当失效节点恢复正常服务时,备份 LVS 路由器将再次行使其备份功能。
The simple, two-tier configuration in 图 1.20 “Two-Tier LVS Topology” is suited best for clusters serving data that does not change very frequently — such as static web pages — because the individual real servers do not automatically synchronize data among themselves.
[1]
虚拟服务器是一个侦听特定的虚拟 IP 地址的服务。