集群服务器系统负载均衡原理的分析与实现

  • 格式:pdf
  • 大小:245.57 KB
  • 文档页数:4

文章编号:100425694(2004)0620084204 集群服务器系统负载均衡原理的分析与实现Ξ

李长志(涪陵师范学院计算机科学系,重庆408003)

摘 要:随着计算机网络技术的不断发展和光纤技术的不断应用,线路传输速度得到了极大提高,这使得服务器慢慢地成为网络中的瓶颈,集群技术正是解决这一问题的主要手段。通过对LVS系统的分析,讨论在Linux环境下采用netfilter功能框架实现单一局域网络集群负载均衡的方法。

关键词:集群服务器;单一局域局;负载均衡中图分类号:TP393103 文献标识码:A

0 引 言在计算机硬件价格下降和计算机网络拓扑发展的情况下,分布式计算机系统给用户提供了一个丰富的资源集合。人们在研究分布式系统时就注意到这样一个问题:在一个由网络连接起来的多计算机环境中,在某一时刻,一些计算机的负载过重,而另外一些计算机的负载较轻。平衡各计算机之间的负载是任务分配与调度的一个主要目标,它能够提高整个系统的性能。为了改善系统的性能,通过在多台计算机之间合理地分配负载,使各台计算机的负载基本达到均衡,这种计算能力共享的形式通常被称为负载平衡或负载共享。

1 IP层负载均衡调度的解决方法由于IPv4中IP地址空间的日益紧张和安全方面的原因,很多网络使用保留IP地址(10.0.0.0/

255.0.0.0,172.16.0.0/255.128.0.0,192.168.0.0/255.255.0.0)[64,65,66]。这些地址不在Inter2net上使用,而是专门为内部网络预留的。当内部网络的主机要访问Internet或被Internet访问时,就需要采用网络地址转换(NAT:networkaddress

translation),将内部地址转换成为Internet上可用的外部地址。NAT的工作原理是报文头(目标地址、源地址和端口)被正确改写后,客户相信它们连接一个IP地址,而不同IP地址的并行网络服务变成一个IP地址上的一个虚拟服务。在LVS系统中,用户通过虚拟IP地址访问服务时,访问请求的报文会到达负载调度器。由它负责均衡调度,由一组真实服务器中选出一个,将报文的目标地址和端口(LVS虚拟IP地址)转换成选定的真实服务器的地址和端口,最后将报文发送给选定的服务器。真实服务器的回应报文经过负载均衡器时,将报文的源地址和源端口改为LVS的虚拟IP地址和相应端口,再把报文发送给用户。Berke2ley的MagicRouter,Cisco的LocalDirector,Alteon的ACEDirector等都使用了NAT。我们使用以下一个简单的例子说明(如图1),

第16卷第6期2004年12月重庆邮电学院学报JournalofChongqingUniversityofPostsandTelecommunicationsVol.16 No.6Dec.2004

Ξ收稿日期:2003211213 修订日期:2004202217

基金项目:涪陵师范学院院级课题项目:Linux集群研究作者简介:李长志(19732),重庆人,涪陵师范学院计科系助教,主要研究方向为操作系统,集群与分布式计算。E2mail:

lichangzhio24@163.com。所有到IP地址为202.103.106.5:80的流量都被负载均衡器(loadbanlancer)调度到真实服务器172.16.0.2:80和172.16.0.3:8000上;目标地址为202.103.106.5:21的报文被转移到172.16.0.3:21上。到其他端口的报文将被拒绝。2 负载调度器结构LVS负载调度器由以下3部分构成:IP包处理模块、负载调度算法和系统配置和管理模块。2.1 IP包处理包处理使用的就是Linux2.4内核的Netfilter框架完成的,一个数据包通过Netfilter框架的过程如图2所示。在IP层代码中,有一些带有HF2HOOK宏的语句,如IP的转发函数中有:<-ipforword.cip-forward()->NF-HOOK(pf-inet,NF-IP-FORWARD,skb,skb->dev,dev2,ip-forward-finish);//其中NF-HOOK宏的定义基本如下:〈-/include/linux/netfilter.h-〉#ifdefCONFIG-NETFILTER#defineNF-HOOK(pf,hook,skb,indev,outdev,okfn)\(list-empty(&nf-hook[(pf)][(hook)]\?(okfn)(skb):nf-hook-slow((pf),(hook),(skb),(in2dev),(outdev),(okfn))#else#defineNF-HOOK(pf,hook,skb,indev,outdev,okfn)(iokfn)(skb)#endif如果在编译内核时没有配置netfilter时,就相当于调用最后一个参数,此例中即执行ip-for2ward-finish函数;否则进入HOOK点,执行通过nf-register-hook()登记的功能(即进入nf-hook-slow()函数,再由它执行登记的函数)。NF-HOOK宏的参数都是在内核中定义好的,具体解释在参考文献[1]中有详细说明。对于检测点进行的处理是可以由用户自行指定的,Netfilter的许多功能如:packetfilter,NAT,connectiontrack这些功能,也是以这种方式提供的。正如Netfilter当初的设计目标———提供一个完善灵活的框架,为扩展功能提供方便。如果我们想加入自己的代码,可以用nf

-regis

2

ter-hook函数,其函数原型为:intnf-register-hook(structnf-hook-ops3reg)structnf-hook-ops的结构如下structnf-hook-ops{

nf

-hookfn3hook;

intpf;

inthooknum;

intpriority;};

类似LVS的做法是生成一个structnf

-hook-

ops的实例,并用NF-REGISTER-HOOK函数对

其注册。其中的list项要初始化为(NULL,

NULL);由于一般在IP层工作,pf总是PF-INET;hooknum就是hook点,一个hook点可以挂接多个处理函数,其处理的顺序则由其优先级决定,Netfil2ter-Ipv4.h中用一个枚举类型指定了内置的处理函数的优先级。hook指针是指提供的处理函数,也就是我们的主要工作,其原型为:

unsignedintnf-hookfn(unsignedinthooknum;

structsk

-buff33skb;

conststructnet

-device3in;

conststructnet

-device3out;

int(3okfn)(structsk

-buff3));

它的5个参数将由NF

-HOOK

宏传进去。

以上是Netfilter编写自己模块的基本方法,

LVS处理的方式可以参见图3和表1。

表1 钩子函数说明Tab.1HookfunctionshowHOOK1NF-IP-PRE-ROUTINGHOOK2NF-IP-LOCAL-INHOOK3NF-IP-FORWARDHOOK4NF-IP-POST-ROUTINGHOOK5NF-IP-LOCAL-OUT

LVS将负载调度程序设计成Linux可加载模块IPVS。模块的初始化函数ip

-vs-init

()注册了

・58・李长志:集群服务器系统负载均衡原理的分析与实现NF-IP-LOCAL-IN、NF-IP-FORWARD、NF-

IP-POST-ROUTING钩子函数用于处理进出的数

据包。212 NF-LOCAL-IN处理过程如果用户向虚拟服务器(VS)发起请求,数据包经过NF

-LOCAL-IN[HOOK2]由函数ip-vs-in

()

处理;如果传入的是ICMP包,则调用ip

-vs-in-

icmp();否则继续判断是不是tcp/ip包,如果不是,

钩子函数返回NF

-ACCEPT

(让内核继续处理该数

据包);余下情况就是如何处理tcp/ip包了。首先,调用ip

-vs-header-check()检查报头,

果异常,则函数返回NF

-DROP

(丢弃该数据包)。

而后,调用ip

-vs-conn-in-get()去ip-vs-conn-

tab表中查找是否存在这样的联接:即它的客户机和

虚拟服务器的IP地址和端口号以及协议类型均与数据包中的相应信息一致。如果不存在相应的联接,则意味着联接尚未建立,此时如果数据包为TCP的SYNC报文或者UDP数据包,则查找相应的虚拟服务器;如果相应虚拟服务器存在但是已经满负荷,则返回NF

-

DROP;如果相应服务器存在并且没有满负荷,那么

调用ip

-vs-schedule(),调度一个RS

并创建一个新

的联接,如果调度失败,则调用ip

-vs-leave

()继续

传递或者丢弃数据包。如果存在相应联接,首先判断联接上的RS是否仍旧可用,如果不可用,则处理相关信息后返回NF-DROP。找到已存在的联接或者建立新的联接后,修改系统记录的相关信息,如传入的数据包的个数等。如果这个联接再创建时绑定了特定的数据包传输函数,调用这个函数传输数据包,否则返回NF

-AC

2

CEPT。Ip-vs-in()调用的函数ip-vs-schedule()为虚

拟服务器调度可用的RS并建立相应的联接。它将根据虚拟服务器绑定的调度算法分配一个RS,如果成功,则调用ip

-vs-conn-new

()建立联接。

ip-vs-conn-new()将进行一系列的初始化操

作:设置联接的协议、ip地址、端口号,协议超时信息,绑定applicationhelper,RS和数据包传输函数。最后调用ip

-vs-conn-back

()将这个联接插入哈希

表ip

-vs-conn-tab

中。

一个联接绑定的数据包传输函数依据IPVS工作方式可分为ip

-vs-nat-xmit(),ip-vs-tunnel-

xmit(),ip-vs-dr-xmit()。例如ip-vs-nat-xmit()的主要操作信息是:修改报文的目的地址和目的端口为RS信息,重新计算并设置校验和,调用ip-send()发送修改后的数据包。213 NF-IP-FORWARD处理过程数据包进入NF-IP-FORWARD[HOOK3]后,将进入ip-vs-out()进行处理。这个函数只在NAT方式下被调用。它首先判断数据包类型,如果是ICMP包则直接调用ip-vs-out-icmp();其次判断是否为tcp/udp数据包,如果不是这二者,则返回NF-AC2CEPT。余下的就是tcp/udp数据包的处理。首先,调用ip-vs-header-check()检查报头,如果异常则返回NF-DROP。其次,调用ip-vs-conn-out-get()判断是否存在相应的联接。如果不存在相应联接,调用ip-vs-lookup-re2al-service()去哈希表中查找发送数据包的RS是否仍然存在,如果RS存在且报文是TCP非复位报文或udp报文,则调用icmp-send()给RS发送目的地不可达ICMP报文并返回NF-STOLEN;其余情况均返回NF-ACCEPT。若存在相应联接:检查数据包的校验和。如果错误,返回NF-DROP,如果正确,修改数据包,将源地址修改为虚拟服务器ip地址,源端口号修改为虚拟服务器端口号,重新计算校验和,并返回NF-AC2CEPT。ip-vs-out-icmp()的流程与ip-vs-in-icmp()类似,只是修改数据报时有所区别:ip报头的源地址和差错信息中udp或tcp报头的目的地址均修改为虚拟服务器地址,差错信息中udp或tcp报头的目的端口号修改为虚拟服务器的端口号。214 NF-IP-POST-ROUTING处理过程NF-IP-POST-ROUTING钩子函数只在NAT方式下使用。数据报进入NF-IP-POST-ROUTING后,由ip-vs-post-routing()进行处理。它首先判断数据报是否经过IPVS,如果未经过则返回NF-AC2CEPT;否则立刻传输数据报,函数返回NF-STOLEN,防止数据报被iptable的规则修改。3 LVS系统配置与管理 IPVS模块初始化时注册了setsockopt/getsockopt()。ipvsadm命令调用这两个函数向IPVS内核模块传递ip-vs-rule-user结构的系统配置数据,完成