这里的所实现的负载均衡是以www.linuxvirtualserver.org项目的ipvsadm为原型,配合以其他的一些开源软件来实现的。
在这里,我们需要四个组件:
· iptables
· ipvsadm, (http://www.linuxvirtualserver.org)
· keepalived, (http://keepalived.sourceforge.net)
· heartbeat , (http://www.linux-ha.org)
1,ipchains
ipchains 是Linux下很有名的Firewall软件,iptables在Linux的内核中对进出Linux的数据进行控制,包括数据包的过滤和伪装等。在 Linux的内核中有三条标准控制数据包去向的链:input , forward , output 。input是对进入Linux的数据包进行控制,forward是对路由的数据包进行控制,output是对出Linux的数据包进行控制。在我们的这个方案中iptables的作用是将用户的请求数据交给ipvsadm来处理,并由ipvsadm决定用户的请求数据最终由哪台web服务器来相应。大家也可参考IPTABLES-HOWTO。在此不多说。
2,ipvsadm(www.linuxvirtualserver.org)
ipvsadm是由中国的年轻黑客维护的,他是从ipportfw发展而来的。ipvsadm是在Linux的内核中实现的,他在Linux的内核中监测需要路由的IP数据包,ipvsadm根据用户设置的条件对数据包进行相应的操作。了解ipchains的用户知道,在Linux的内核中有三条控制数据包去向的链:input , forward , output,ipvsadm是在forward的过程中对数据包进行操作的。ipvsadm的作用是为用户选择合适的web服务器。LLB在选择服务器时有四种不同的规则,这四种规则用于选择哪台服务器处理用户的请求。这四种规则是:Round-Robin (RR)、 Weighted Round-Robin (WRR)、 Least-Connection (LC)、 Weighted Least-Connection (WLC)。这四种规则各有自己的适应环境。
Round-Robin:
如果您的LLB选用的是这种算法,她会将数据包均匀的分发给各台服务器,他把所有的服务器放在相等的地位上,而不会实际的去考虑各台服务器的差异,如响应时间、session数等!例如您有ABC三台服务器,那么LLB分发数据包的顺序是......ABCABCABC.....
Round-Robin算法的好处是简单、占用系统资源少,缺点是无法检测哪台服务器有更高的响应速度、更少的连接,所以他非常适合服务器性能相当的环境。
Weighted Round-Robin
这种规则适用于用户扩展系统时,因为这是集群中的服务器的性能会有较大的差别,为每一个服务器定义一个参数是必要的。
这是一种带参数的Round-Robin的算法,参数的名字叫Weighed。您可以根据您的服务器的处理能力来为每一台服务器分配一个Weighted 值,值越高其优先程度越高,默认值是1。例如:你有三台服务器,分别为A:486、B:奔腾、C:奔腾2,你可以为他们分配Weighted值为:1、 2、3,则按照Weighted Round-Robin的算法处理数据包的服务器的顺序是:CCCBBBA
Round-Robin可以说是Weighted Round-Robin的一种特殊情况,既所有的服务器有相同的Weighted值。
Least-Connection
这是一种动态算法,LLB将根据每台服务器当前的连接数目来转发数据包,具有最少连接的服务器将处理下一个请求。这一种算法能很好的分配各种流量,对于突发的请求或大量的请求能够做出比较平滑的处理,不会产生将请求的数据发往同一台服务器的情况。
Weighted Least-Connection
这种算法是Least-Connection Scheduling的一种扩展,她为每一台服务器分配一个weighted值,然后根据这个值和每台服务器当前状态下的连接数来决定由谁来处理用户的请求。可以举一个例子来说明她的工作原理:
假设有n台服务器,每一台服务器的weighted值为Wi ( i=1,2. . . n) ,session为Ci (i=1,...n), ALL-CONNECTIONS 是所有服务器的session和,既C1+C2+....+Cn.,那么按照下面的算法,服务器j将处理下一个请求:
( Cj/ALL-CONNECTIONS )/Wj=min { (Ci/ALL-CONNECTIONS)/Wi } ( i=1,..,n)
也可以简化为:Cj/Wj = min { Ci/Wi } (i=1,..,n)
我们可以对这四种算法做一个比较,Round-Robin和Weighted Round-Robin是静态的方法,对于服务器的当前状态不能做出很好的估计,因此数据的分配并不是最合理。
但在服务器的性能相当时Round-Robin却是最好的选择。Least-Connection 和Weighted Least-Connection是动态的方法,可以对服务器的当前状态做出比较合理的估计,这样在平衡各台服务器时,可以做出比较优化的选择。
3,Keepalived
keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
Layer3,4&5工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:
Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。在本文中将采用这种方式。
Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。
Layer5:Layer5就是工作在具体的应用层了,比Layer3,Layer4要复杂一点,在网络上占用的带宽也要大一些。 Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。
4,Heartbeat
heartbeat是一种心跳检测机制。他可以让两台服务器(Master Server 和Slave Server)互为备份。Heartbeat的中文是“心跳检测”。Slave Server利用heartbeat来检测Master Master的当前状态,当Master Server不能工作时(如:down机)Slave Server通过heartbeat来接管Master Server的所有工作,这个接管过程在10秒以内完成,对用户来说没有什么察觉。Heartbeat中包含一个IP take over(IP 地址接管)的功能,此功能是通过ARP欺骗的手段来完成的。