Linux Virtual Server,简称LVS。是由中国一个Linux程序员发起的开发项目计划,其实现目标是创建一个具有良好的扩展性、高可靠性、高性能和高可用性的,基于Linux系统的服务器集群。
1.LVS系统结构与特点
使用LVS架设的服务器集群系统从体系结构上看是透明的,最终用户只感觉到一个虚拟服务器.物理服务器之间可以通过高速的LAN或分布在各地的WAN相连。最前端是负载均衡器,它负责将各种服务请求分发给后面的物理服务器,让整个集群表现得象一个服务于同一IP地址的虚拟服务器。
LVS集群系统具有良好的可扩展性和高可用性。
可扩展性是指,LVS集群建立后,可以很容易地根据实际的需要增加或减少物理服务器。而高可用性是指当检测到服务器节点或服务进程出错、失效时,集群系统能够自动进行适当的重新调整系统。
<cente>2.LVS是如何工作的
Linux Virtual Server的主要是在负载均衡器上实现的,负载均衡器是一台加了LVS Patch的2.2.x版内核的Linux系统。LVS Patch可以通过重新编译内核的方法加入内核,也可以当作一个动态的模块插入现在的内核中。
负载均衡器可以运行在以下三种模式下中的一种或几种: 1)Virtual Server via NAT(VS-NAT):用地址翻译实现虚拟服务器;2)Virtual Server via IP Tunneling (VS-TUN):用IP隧道技术实现虚拟服务器;3)Virtual Server via Direct Routing(VS-DR):用直接路由技术实现虚拟服务器。
另外,还需要根据LVS应用对物理服务器进行恰当的配置。
以下将分别讲述一下三种模式的工作原理和优缺点。
2.1.Virtual server via NAT(VS-NAT)
Virtual Server via NAT方法的最大优点是集群中的物理服务器可以使用任何支持TCP/IP操作系统,物理服务器可以分配Internet的保留私有地址,只有负载均衡器需要一个合法的IP地址。
这种实现方法的最大的缺点是扩展性有限。当服务器节点(普通PC服务器)数据增长到20个或更多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包都需要经过负载均衡器再生。假使TCP包的平均长度是536字节的话,平均包再生延迟时间大约为60us(在Pentium处理器上计算的,采用更快的处理器将使得这个延迟时间变短),负载均衡器的最大容许能力为8.93M/s,假定每台物理服务器的平台容许能力为400K/s来计算,负责均衡器能为22台物理服务器计算。
Virtual Server via NAT能够满足许多服务器的服务性能需求。即使是是负载均衡器成为整个系统的瓶颈,如果是这样也有两种方法来解决它。一种是混合处理,另一种是采用Virtual Server via IP tunneling或Virtual Server via direct routing。如果采用混合处理的方法,将需要许多同属单一的RR DNS域。你采用Virtual Server via IP tunneling或Virtual Server via direct routing以获得更好的可扩展性。也可以嵌套使用负载均衡器,在最前端的是VS-Tunneling或VS-Drouting的负载均衡器,然后后面采用VS-NAT的负载均衡器。
2.2.Virtual server via IP tunneling(VS-TUN)
采用VS-NAT方式,请求与应答包都需要经过负载均衡器,那么当服务器节点增长到20个或更多时,这个负载均衡器就可能成为新的瓶颈。我们发现,许多Internet服务(例如WEB服务器)的请求包很短小,而应答包通常很大。
而使用VS-TUN方式的话,负载均衡器只负责将请求包分发给物理服务器,而物理服务器将应答包直接发给用户。所以,负载均衡器能处理很巨大的请求量,这种方式,一台负载均衡能为超过100台的物理服务器服务,负载均衡器不再是系统的瓶颈。使用VS-TUN方式,如果你的负载均衡器拥有100M的全双工网卡的话,就能使得整个Virtual Server能达到1G的吞吐量。
IP tunneling(IP隧道)能够用于架构一个高性能的virtual server,非常适合构建virtual proxy server,因为当代理服务器收到了请求,能够让最终用户直接与服务器联系。
但是,这种方式需要所有的服务器支持"IP Tunneling"(IP Encapsulation)协议,我仅在Linux系统上实现了这个,如果你能让其它操作系统支持,还在探索之中。
2.3.Virtual Server via Direct Routing(VS-DR)
就象VS-TUN一下,在VS-DR方式下,负载均衡器也只是分发请求,应答包通过单独的路由方法返回给客户端。这种方式能够大大提高Virtual Server的可扩展性。与VS-TUN相比,VS-DR这种实现方式不需要隧道结构,但它要求负载均衡器的网卡必须与物理网卡在一个物理段上。
而且VS-DR模式,可以使用大多数操作系统做为物理服务器,其中包括:Linux 2.0.36、2.2.9、2.2.10、2.2.12;Solaris 2.5.1、2.6、2.7;FreeBSD 3.1、3.2、3.3;NT4.0无需打补丁;IRIX 6.5;HPUX11等
3.安装配置LVS
LVS的安装配置主要可以分成以下三个步骤:
1) 下载LVS软件;
2) 安装、配置负载均衡器;
3) 安装、配置物理服务器;
3.1. 安装前的准备
1).下载LVS软件:
大家可以到LVS的主页(),选择“Software”链接,选取最新版的补丁包(tar包)下载。这个包里包含了内核补丁和源程序。
2).安装的指导思想
如果你选用了VS-NAT模式的话,则可以使用所有支持TCP/IP协议的操作系统构建的机器作物理服务器,并且无须做任何修改。
如果你选用了VS-TUN模式的话,则选择Linux作物理服务器的操作系统,并根据后面的介绍做相应的设置。
如果你选用了VS-DR模式的话,则可以选择大多数操作系统(如上节所述)作物理服务器,并根据后面的介绍做相应的设置。
3).各种操作系统作物理服务器的要点详解
a)Linux 2.0.36
这种操作系统无需做任何修改,就可以运行在VS-NAT、VS-Tun、VS-DR三种模式下。
b)Linux 2.2.x
无需任何修改就可运行VS-NAT模式。而使用VS-DR和VS-Tun两种模式可能会引起ARP问题。这种情况
就必须:¨ 为2.2.x内核打补丁
· Stephen WillIams的补丁包:
你可以在获取,它的原理十分简单:让物理服务器不响应对虚拟IP的ARP请求。
· Julian Anastasov的补丁包:
你可以在处获取,然后用以下方法使其生效:
echo 1 > /proc/sys/net/ipv4/conf/<interface_name>/arp_invisible
¨ 新添一块网卡承载虚拟IP地址:
你可以选择一块ISA网卡或廉价的PCI网卡来用于这个功能。你可以将这个接口的ARP功能关闭。
¨ 将物理服务器放置于与虚拟IP地址不同的网络上,并且确认客户端无法直接路由到物理服务器所在网段。这种方法需要在负载均衡器上有两块网卡象防火墙一样工作。
¨ 在客户端或路由器将虚拟IP地址与负载均衡器的物理MAC地址绑定。
¨ 使用IPCHINA重写每一个进入的包,将其从lo接口送入。
c)其它操作系统
如果是VS-NAT的话,无需修改。如果是VS-DR的话,需要采取一些相应的配置方法设置物理服务器的IP地址,使其拥有LVS的虚拟IP地址。用其它操作系统的话不能使用VS-Tun方法。
4).准备硬件环境
构建服务器集群系统,至少需要3台机器,1台用于负载均衡器,2台用于物理服务器。少于这个数字的话就没有意义了。
负载均衡器:运行在打了补丁的2.2.x核心Linux系统。
物理服务器:
VS-NAT:任何机器、任何操作系统,运行Internet网络服务,如 HTTP、FTP、Telnet、SMTP、NNTP、DNS等。
VS-TUN:任何机器、支持IP隧道的操作系统(迄今为止仅有Linux)
VS-DR:任何机器、大多操作系统。
3.2. 理解LVS的相关术语
1).ipvsadm
ipvsadm是LVS的一个用户界面。在负载均衡器上编译、安装ipvsadm:
ipvsadm sets
2).调度算法
LVS的负载均衡器有以下几种调度规则:
Round-robin,简称rr,weighted Round-robin,简称wrr,每个新的连接被轮流指派到每个物理服务器。
Least-connected,简称lc,weighted Least-connected,简称wlc,每个新的连接被分配到负担最小的服务器。
Persistent client connection,简称pcc,(持续的客户端连接,内核2.2.10版以后才支持)。所有来自同一个IP的客户端将一直连接到同一个物理服务器。超时时间被设置为360秒。Pcc是为https和cookie服务设置的。在这处调度规则下,第一次连接后,所有以后来自相同客户端的连接(包括来自其它端口)将会发送到相同的物理服务器。但这也会带来一个问题,大约有25%的Internet可能具有相同的IP地址(AOL的
客户是通过位于美国弗吉尼亚洲的一台服务器连入Internet的),这种情况下只要有一个AOL的客户连接到一个物理服务器上,那么所有来自AOL的客户连接将都被连到这一台物理服务器上。这将多么可怕呀!
3).Persistent port connection调度算法
在内核2.2.12版以后,pcc功能已从一个调度算法(你可以选择不同的调度算法:rr、wrr、lc、wlc、pcc)演变成为了一个开关选项(你可以让rr、 wrr、lc、wlc具备pcc的属性)。在设置时,如果你没有选择调度算法时,ipvsadm将默认为wlc算法。
在Persistent port connection(ppc)算法下,连接的指派是基于端口的,例如,来自相同终端的80端口与443端口的请求,将被分配到不同的物理服务器上。
不幸的是,如果你需要在的网站上采用cookies时将出问题,因为http是使用80端口,然而cookies需要使用443端口,这种方法下,很可能会出现cookies不正常的情况。
3.3. 配置实例
1).例一:https only
a)在lvs_dr.conf 文件写入:
SERVICE=t https ppc 192.168.1.1
b)Ipvsadm设置:
IP Virtual Server version 0.9.4 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP ssl.mack.net:https wlc persistent 360
-> di.mack.net:https Route 1 0 0
2).例二:All ports sticky,超时为30分,wrr调度算法
a)在lvs_dr.conf 文件写入:
SERVICE=t 0 wrr ppc -t 1800 192.168.1.1
#ppc persistent connection, timeout 1800 sec
/sbin/ipvsadm -A -t 192.168.1.110:0 -s wrr -p 1800
echo "adding service 0 to realserver 192.168.1.1 using connection
(接上行) type dr weight 1"
/sbin/ipvsadm -a -t 192.168.1.110:0 -R 192.168.1.1 -g -w 1
b)Ipvsadm设置:
# ipvsadm
IP Virtual Server version 0.9.4 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP ssl.mack.net:https wrr persistent 1800
-> di.mack.net:https Route 1 0 0
3.4. 配置方法
1).准备
用配置脚本*.conf作为输入产生rc.lvs脚本,然后放置在/etc/init.d或/etc/rc.d目录下。
早期版本的配置脚本可以运行在任何机器上。然而现在的配置脚本,针对不同的内核版本是有些不同的。你必须在负载均衡器上运行、检测内核版本。将在负载均衡器上的配置文件和目录,通过nfs输出这个
目录到物理服务器上以供配置需要。 必须先在负载均衡器上运行脚本rc.lvs,然后在物理服务器上运行。
根据你选择的LVS工作模式(VS-NAT、VS-Tun、VS-DR)选择适当的conf文件模板(lvs_nat.conf、
lvs_tun.conf、lvs_dr.conf),然后根据实际情况修改IP地址与服务。在缺省状态下只配置了telnet服务。
telnet服务能够很方便地用于测试:当客户机telnet登录时,根据提示符就可以知道登录到的是哪一台物理
服务器。
你可以编辑conf配置文件来增加其它的服务。在配置文件中提供了集群内部的IP地址建议值
(192.168.1.x/24、10.1.1.x/24)。
在配置文件中,你可以使用名称(如telnet)或端口(如23)来标识服务。使用名称时要注意,须与
/etc/services中匹配。/etc/services文件内容如下所示:
ssh 22/tcp
domain 53/tcp nameserver dns #the string "dns" needs to be added here
domain 53/tcp nameserver dns #and here
https 443/tcp
https 443/udp
在多种情况下,一台机器常需要多个IP地址,你可以使用IP别名(内核支持的可选项,一般情况下已含在内核中)来为一块网卡指定多个IP地址。
2).运行配置脚本
$ ./configure.pl lvs_nat.conf
这将产生一个rc.lvs_xxx脚本(例如:rc.lvs_nat、rc.lvs_tun、rc.lvs_dr)以及mon_xxx.cf脚本。(稍后将rc.lvs_xxx放到/etc/rc.d或/etc/init.d中去,将mon_xxx.cf放在/etc/mon目录下)。
3).rc.lvs脚本选项
a). 为负载均衡器与物理服务器增加以太网设备和路由器;
b).使用fping检查连接;
c).运行ipchains(VS-NAT方式);
d).激活ipforward;
e).关闭ICMP重定向功能(VS-DR和VS-Tun方式);
f).增加ipvsadm服务。
4).继续
在物理服务器上运行:
$ . ./rc.lvs_nat 或
$sh rc.lvs_nat
rc.lvs脚本能够自动判断是运行在负载均衡器(tests x /sbin/ipvsadm)还是物理服务器上(检查ifconfig)。
检查ipvsadm、ifconfig a和netstat rn的输出,检查服务/IP地址是否正确。如果不正确的话,请重
新编辑然后再运行一次。
3.5.测试LVS
检查每一台物理服务器上运行的服务,看它们的IP是不是LVS的虚拟IP—VIP(使用netstat an)。如果运行rc.lvs_xxx脚本没有出错的话,你从客户端telnet到VIP(在本文中是192.168.1.110),你将会登录到其中的一台物理服务器上,并看到这台物理服务器的登录提示。
在负载均衡器上查看ipvsadm的输出,你会在23端口上看到一个与物理服务器的连接。而在物理服务器上执行:$ netstat -an | grep 23命令查看到相关信息。客户端logout退出后,再次登录虚拟IP时,你将会看到另一台物理服务器的登录提示符。
4 VS-NAT模式
VS-NAT是基于CISCO的负载均衡器:LocalDirector实现的。
4.1.安装VS-NAT
根据下表设置客户端、负载均衡器、物理服务器的IP地址:
表21-2.客户端、负载均衡器、物理服务器的IP地址
机 器 IP地址
客户端 192.168.1.254
负载均衡器的虚拟IP 192.168.1.110(LVS表现的IP)
负载均衡器内部网卡 10.1.1.1
物理服务器1 10.1.1.2
物理服务器2 10.1.1.3
物理服务器3 10.1.1.4
…… ……
物理服务器n 10.1.1.n+1
物理服务器的默认
网关 10.1.1.1
对于VS-NAT方法来说,物理服务器必须位于与客户机、LVS的虚拟IP地址不同的网段上,也就是说在物理服务器上不能直接PING通客户机。
由于负载均衡器有两个IP地址,一个是LVS的虚拟IP地址,另一个IP地址是内部地址--所有物理服务器默认网关。当数据包从物理服务器发送到负载均衡器时,负载均衡器根据地址翻译(NAT)规则将包转发到客户端。(由于负载均衡器是一个地址翻译器,所以ICMP的重定向功能失效,PING无法应用)。可以采用IP别名的方法,也可以使用双网卡方法来实现这个。
配置脚本将会配置IP伪装。以下是在configure.pl脚本中的程序段:
echo "turning on masquerading "
#setup masquerading
echo "1" >/proc/sys/net/ipv4/ip_forward
echo "installing ipchain rules"
/sbin/ipchains -A forward -j MASQ -s 10.1.1.0/24 -d 0.0.0.0/0
echo "ipchain rules "
/sbin/ipchains L
所有与NAT有关的规则设置都在rc.lvs_nat文件中表现。
4.2.配置VS-NAT
在负载均衡器以及每一台物理服务器上分别执行rc.lvs_xxx脚本程序,使用lvs_nat.conf这个模板来生成rc.lvs_nat配置文件。
VS-NAT将会对端口重新映射,一个来自于80端口的请求,负载均衡器会将其发给物理服务器的8000端口。由于数据包的源地址和目标地址已经被重写,所以无需对重新端口增加额外的开销。很低的重写数据包速度(60us/包)限制了VS-NAT的最大处理能力,而且VS-NAT的最大处理能力不是与增加的物理服务器成正比的。
VS-NAT实现方法的最大优点是物理服务器可以是任何一种操作系统,无需为了完成LVS而作任何修改,而且可以实现一些在Linux上不存在服务。
4.33.VS-NAT与Linux核心支持的NAT
当然可以使用ipchains或ipfw构建基于Linux内核的NAT防火墙。而使用了基于2.0.36版内核的LVS补丁包后,常规的内核模块(如ip_masq_ftp等)不再工作(而且不再需要装载)。
5.VS-DR模式
5.1.总论
VS-DR是基于IBM的NetDispathcer实现的。NetDispatcher位于WEB服务器的前端,对于客户端来说就象一台WEB服务器。NetDispatcher曾服务于奥运会、卡斯帕罗夫与深蓝电脑的国际象棋比赛。
这里有一个VS-DR的IP地址设置的实例。注意:物理服务器与VIP位于同一个网络上。
VS-DR模式在以下几方面受到了限制
1) 物理服务器和负载均衡器必须在同一个网段上(它们之间必须能使用arp协议),它们之间在数据链路层上传递数据包;
2) 客户端必须通过负载均衡器的VIP访问集群;
3) 物理服务器必须有到客户端的路由(即使客户端没有到物理服务器的路由)。因为从物理服务器返回到客户商的包,将直接发送,无须通过负载均衡器转发。
VS-DR模式下,客户端通常与负载均衡器和物理服务器位于不同的网络中,而且每一个物理服务器拥有自己对外的路由表。在下面这个简单的例子中,所有的机器都在192.168.1.0这个网络,物理服务器不需要设置默认路。网络拓扑结构如下图所示:
IP分配如下表所示:
表21-3 .IP分配
机 器 IP 地 址
客户端 本机IP:CIP 192.168.1.254
负载均衡器 本机IP:DIP 192.168.1.1
虚拟IP:VIP 192.168.1.110(ARP与客户端使用)
物理服务器1 本机IP:RIP 192.168.1.2
虚拟IP:VIP 192.168.1.110(不ARP)
物理服务器2 本机IP:RIP 192.168.1.3
虚拟IP:VIP 192.168.1.110(不ARP)
物理服务器3 本机IP:RIP 192.168.1.4
虚拟IP:VIP 192.168.1.110(不ARP)
5.2.VS-DR良好的扩展性
VS-NAT方法受限于经过负载均衡器的每一包都必须重写,用这种方法最大的数据吞吐量受限于负载均衡器的环境。(如一台Pentium机器,快速以太网,最大的数据吞吐量为80M/秒)而且增加物理服务器的数量并不能增加这个最大数据吞吐量。而使用VS-DR模式,速度限制则在每个物理服务器与Internet连接的包处理能力,而对负载均衡器的要求不大,因为其只需处理简单的包。在VS-DR的模式下,能够增加更多物理服务器以提高系统能力。
6 VS-TUN模式
6.1.总论
VS-Tun是LVS独创的的,它是基于VS-DR发展的。具有良好的可扩展性和服务吞吐量。
使用VS-Tun方式的话,必须采Linux作为物理服务器,而负载均衡器将IP请求重新包装成IPIP包后发给
物理服务器。所以物理服务器必须能够解IPIP包装才能,现在只有Linux操作系统能处理IPIP包(IP隧道技
术)。
不同于VS-DR,VS-Tun方案允许物理服务器与负载均衡器在不同的网络上,甚至允许所有的机器都在
单独的网络上,那怕物理服务器位于不同的国家(例如:做一个项目的FTP站点镜像)。在这种情况下物理
服务器将产生源地址=虚拟IP地址,目标地址=客户机IP地址的IP包。
如果物理服务器与负载均衡器位于相同的网络上,那么VS-DR和VS-Tun是等价的。VS-DR更具有灵活
性,因为大多数操作系统都可以用来构建物理服务器。
6.2. VS-Tun实例
以下是一个VS-Tun的IP配置实例。VS-Tun提供的最大方便性就是不需要服务器与客户端位于同一个网络上,仅需要客户端能寻径(有路由)到负载均衡器,物理服务器能寻径(有路由)到客户机。(返回的包直接从物理服务器到客户端,无须再经过负载均衡器)
通常使用VS-Tun模式时,客户端是与负载均衡器、物理服务器位于不同网络上的,而且每一台服务器
有一个通往外界的路由。
IP分配如下表所示:
表21-4.IP分配
机 器 IP 地 址
客户端 本机IP:CIP 192.168.1.254
负载均衡器 本机IP:DIP 192.168.1.1
虚拟IP:VIP 192.168.1.110(ARP与客户端使用)
物理服务器1 本机IP:RIP 192.168.1.2
虚拟IP:VIP 192.168.1.110(隧道技术,不ARP)
物理服务器2 本机IP:RIP 192.168.1.3
虚拟IP:VIP 192.168.1.110(隧道技术,不ARP)
物理服务器3 本机IP:RIP 192.168.1.4
虚拟IP:VIP 192.168.1.110(隧道技术,不ARP)
…… …… ……
物理服务器n 本机IP:RIP 192.168.1.n+1
虚拟IP:VIP 192.168.1.110(隧道技术,不ARP)
6.3.配置VS-Tun
1)编辑配置文件模板lvs_tun.conf后,进行配置:
$ ./configure_lvs.pl lvs_nat.conf
2)在物理服务器上运行:
$ . ./etc/rc.d/rc.lvs_tun
3)将配置文件放到/etc/rc.d或/etc/init.d目录下。
4)检查ipvsadm、ifconfig a和netstat rn的输出,检查服务/IP地址是否正确,如果有误,请修改后重新运行脚本。
文章来源于领测软件测试网 https://www.ltesting.net/