在VS/TUN的集群系统中,负载调度器只将请求调度到不同的后端服务器,后端服务器将应答的数据直接返回给用户。这样,负载调度器就可以处理大量的请求,它甚至可以调度百台以上的服务器(同等规模的服务器),而它不会成为系统的瓶颈。即使负载调度器只有100Mbps的全双工网卡,整个系统的最大吞吐量可超过1Gbps。所以,VS/TUN可以极大地增加负载调度器调度的服务器数量。VS/TUN调度器可以调度上百台服务器,而它本身不会成为系统的瓶颈,可以 用来构建高性能的超级服务器。
VS/TUN技术对服务器有要求,即所有的服务器必须支持“IP Tunneling”或者“IP Encapsulation”协议。目前,VS/TUN的后端服务器主要运行Linux操作系统,我们没对其他操作系统进行测试。因为“IP Tunneling”正成为各个操作系统的标准协议,所以VS/TUN应该会适用运行其他操作系统的后端服务器。
三种模型的优缺点比较三种IP负载均衡技术的优缺点归纳在下表中:
VS/NAT VS/TUN VS/DRServer any Tunneling Non-arp device
server_network private LAN/WAN LAN
server_number low (10~20) High (100) High (100)
server_gateway load balancer own router Own router
内核中负载均衡调度算法
IPVS在内核中的负载均衡调度是以连接为粒度的。在HTTP协议(非持久)中,每个对象从WEB服务器上获取都需要建立一个TCP连接, 同一用户的不同请求会被调度到不同的服务器上,所以这种细粒度的调度在一定程度上可以避免单个用户访问的突发性引起服务器间的负载不平衡在内核中的连接调度算法上,IPVS已实现了以下八种调度算法:
固定调度算法:RR : 轮叫调度(Round-Robin Scheduling)
WRR : 加权轮叫调度(Weighted Round-Robin Scheduling)
DH : 目标地址散列调度(Destination Hashing Scheduling)
SH : 源地址散列调度(Source Hashing Scheduling)
动态调度算法:LC : 最小连接调度(Least-Connection Scheduling)
WLC : 加权最小连接调度(Weighted Least-Connection Scheduling)
LBLC : 基于局部性的最少链接(Locality-Based Least Connections Scheduling)
LBLCR : 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication Scheduling)
SED : 最短预期延时调度(Shortest Expected Delay Scheduling)
NQ : 不排队调度(Never Queue Scheduling)
轮叫调度(RR)轮叫调度(Round Robin Scheduling)算法就是以轮叫的方式依次将请求调度不同的服务器,即每次调度执行i = (i +1) mod n,并选出第i台服务器。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。
在系统实现时,我们引入了一个额外条件,当服务器的权值为零时,表示该服务器不可用而不被调度。这样做的目的是将服务器切出服务(如屏蔽服务器故障和系统维护),同时与其他加权算法保持一致。所以,算法要作相应的改动,它的算法流程如下:
轮叫调度算法流程:
假设有一组服务器S = {S0, S1, …, Sn-1},一个指示变量i表示上一次选择的 服务器,W(Si)表示服务器Si的权值。变量i被初始化为n-1,其中n > 0。 j = i; do { j = (j + 1) mod n; if (W(Sj) > 0) { i = j; return Si; } } while (j != i); return NULL;轮叫调度算法假设所有服务器处理性能均相同,不管服务器的当前连接数和响应速度。该算法相对简单,不适用于服务器组中处理性能不一的情况,而且当请求服务时间变化比较大时,轮叫调度算法容易导致服务器间的负载不平衡。
虽然Round-Robin DNS方法也是以轮叫调度的方式将一个域名解析到多个IP地址,但轮叫DNS方法的调度粒度是基于每个域名服务器的,域名服务器对域名解析的缓存会妨碍轮叫解析域名生效,这会导致服务器间负载的严重不平衡。这里,IPVS轮叫调度算法的粒度是基于每个连接的,同一用户的不同连接都会被调度到不同的服务器上,所以这种细粒度的轮叫调度要比DNS的轮叫调度优越很多。
加权轮叫调度(WRR)