2.6内核上一步一步配置LVS(Linux Virtual Server)

时间:2021-11-14 06:36:09
Linux Virtual Server(LVS)的配置方法,网上虽然是能搜到很多,但无外外乎是那几个版本。这些版本大都只是写了如何这样配置,而没有为什么这样配置,还有很多基础性的东西是默认读者已知了,就没有讲明白。
最近成功在学校机房配置了一台调度器(Director)、两台服务器(Real Server)的集群服务器,用一台客户机来访问。我的配置有比较高的可实现性,所有计算机都在同一个局域网内,不用配置网关。如果这样的LVS配置成功了,之后配置更有有实用性的集群也不难了。
本文参考了LVS中文站点上的《LVS在Fedora Core5上的配置指南(以Linux、FreeBSD、Solaris系统为RealServer)》(http://zh.linuxvirtualserver.org/node/272),原文是一篇HOW TO性质的文章,并没有对一些原理进行阐述。本文在此基础上对一些细节的部分进行了说明(甚至是很基础的地方,这些地方对于理解整个LVS系统有着重要的作用),并进行了一些改动,使得更具可实现性(所有机器都在同一网段),文中亦会说明要如何将其改为可真正派上用场的集群服务。
我假设你在此之前已经读过了LVS的基本介绍,知道其用途和基本原理。如果你还没有看过,请看一下LVS的官方站点(http://www.linuxvirtualserver.org,http://zh.linuxvirtualserver.org)。本文所述采用的是通过直接路由实现虚拟服务器(VS/DR)的方法,这里先引述官方站点对此的介绍,并标出重点、加上注释。
引用:
跟VS/TUN方法相同,VS/DR利用大多数Internet服务的非对称特点,负载调度器中只负责调度请求,而服务器直接将响应返回给客户,可以极大地提高整个集群系统的吞吐量。该方法与IBM的NetDispatcher产品中使用的方法类似,但IBM的NetDispatcher是非常昂贵的商品化产品,我们也不知道它内部所使用的机制,其中有些是IBM的专利。
VS/DR的体系结构如图3.6所示:调度器和服务器组都必须在物理上有一个网卡通过不分断的局域网相连,如通过交换机或者高速的HUB相连。VIP地址为调度器和服务器组共享,调度器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文;所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外面是不可见的,只是用于处理目标地址为VIP的网络请求。(请看注释1)

2.6内核上一步一步配置LVS(Linux Virtual Server)
图3.6:VS/DR的体系结构
VS/DR的工作流程如图3.7所示:它的连接调度和管理与VS/NAT和VS/TUN中的一样,它的报文转发方法又有不同,将报文直接路由给目标服务器。在VS/DR中,调度器根据各个服务器的负载情况,动态地选择一台服务器,不修改也不封装IP报文,而是将数据帧的MAC地址改为选出服务器的MAC地址,再将修改后的数据帧在与服务器组的局域网上发送。(请看注释2)因为数据帧的MAC地址是选出的服务器,所以服务器肯定可以收到这个数据帧,从中可以获得该IP报文。当服务器发现报文的目标地址VIP是在本地的网络设备上,服务器处理这个报文,然后根据路由表将响应报文直接返回给客户。
2.6内核上一步一步配置LVS(Linux Virtual Server)
图3.7:VS/DR的工作流程
在VS/DR中,请求报文的目标地址为VIP,响应报文的源地址也为VIP,所以响应报文不需要作任何修改,可以直接返回给客户,客户认为得到正常的服务,而不会知道是哪一台服务器处理的。
VS/DR负载调度器也只处于从客户到服务器的半连接中,按照半连接的TCP有限状态机进行状态迁移。


注释1:VIP地址为调度器和服务器(RealServer)把共享,那会不会引起IP冲突?答案是:不会。正因为后面所说的,“调度器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文;所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外面是不可见的”。在调度器上,VIP与其局域网内IP对外都是可见的;在服务器上,对外可见的是其在局域网上的IP(调度器调度的时候使用的IP),而在服务器上,VIP的性质就像是平常我们所熟知的127.0.0.1的性质一样,它是一个loopback device,他只在网络层之上可见(包括网络层),这样的loopback device用来模拟网络适配器的行为。就算没有装网卡,127.0.0.1与VIP的这样IP都是可用的。
那为什么要在服务器上还放上一个VIP呢?
因为当只修改了MAC地址的链路层帧发到服务器的链路层时(详情请见注释2),要想再向上提交到应用层去让HTTP等服务器程序处理,必须再经过网络层、传输层等,而要通过这些层是要经过目标IP的检测的。
就像你要去参加一个婚礼,到门口,接待人员问你要参加谁的婚礼,人家这里明明举行的是李湘跟王老五的婚礼,你说你要参加谢霆锋跟张柏芝的婚礼,接待人员一定是不让你进去的。
那我就是又要说我要参加谢霆锋跟张柏芝的婚礼,以要进入李湘跟王老五的婚礼现场,怎么办?那就在李湘跟王老五的婚礼现场里安排一个自己人,你到时候对他说:“我要参加谢霆锋跟张柏芝的婚礼”,他会意地笑一声,就会帮你在李湘跟王老五的婚礼现场安排座位,让你在里面享受各种服务。
服务器里的VIP就有这个自己人的性质,他对外不可见,当请求包到达网络层以上的部分里,就可以看到VIP,从而一路上去,到达应用层,享用HTTP等服务。
原理如图(IPVS有没有到网络层?)

2.6内核上一步一步配置LVS(Linux Virtual Server)
 
注释2:在这里可能有人会产生疑问,修改MAC地址就能让请求包发往Real Server上吗,不用改目标IP地址?答案是:是的。因为交换机是一个链路层的设备,链路层的传送单位是帧,他可不管网络层的包里放的是什么IP地址(网络层的ipv4包已经被封装在帧里)。当Direcotr把存有客户机的请求包的那帧的MAC地址改成某台Real Server的之后,就发出去,到交换机之后,交换机查找MAC地址与端口的对应表(端口MAC地址对应拥有些MAC地址的计算机),将这一帧发往与帧上MAC地址对应的端口,之后就发到计算机的链路层,如果MAC地址与网卡上的匹配,再向上层发送,直至应用层。

现在俺们来一步一步地在局域网内配置LVS。

 

 
2.6内核上一步一步配置LVS(Linux Virtual Server) 
四台计算机按如上方式插在交换机上,分别按如下的方式配置四台计算机。

Client
代码:

ifconfig eth0 192.168.11.1 netmask 255.255.255.0 broadcast 192.168.11.255

当重启时,上面的配置将会失效。如果要长期保留这个配置,请更改/etc/sysconfig/network-scripts/ifcfg-eth0文件。具体步骤请参考DIRECTOR的配置。

Director
首先安装IPVSADM,就是LVS的管理工具。REDHAT的用户可以到rpm.pbone.net上搜索ipvsadm,找到和自己系统对应的安装包,在安装文件夹里执行如下命令:
代码:
rpm ivh *.rpm

*.rpm代表rpm安装包的文件名。
当IPVSADM安装完成后,就可以配置DIRECTOR了,使用如下命令:
代码:
ipvsadm –C
ipvsadm -A -t 192.168.11.200:80 -s wlc
ipvsadm -a -t 192.168.11.200:80 -r 192.168.11.21 -g
ipvsadm -a -t 192.168.11.200:80 -r 192.168.11.22 -g
ipvsadm -Ln

每一行的命令信息可以查看IPVSADM的MAN。如果是要配置流媒体的服务器的话,应该打开UDP的包转发。
下面配置网卡:
首先新建配置文件/etc/sysconfig/network-scripts/ifcfg-eth0:0如下:

代码:
DEVICE=e th 0 : 0
ONBOOT=y e s
BOOTPROTO= s t a t i c
IPADDR= 1 9 2 . 1 6 8 . 11 . 2 0 0
NETMASK= 2 5 5 . 2 5 5 . 2 5 5 . 2 5 5
BROADCAST= 1 9 2 . 1 6 8 . 11 . 255

上面配置的是DIRECTOR的虚拟IP。

配置文件/etc/sysconfig/network-scripts/ifcfg-eth0如下:
代码:
DEVICE=e th 0
ONBOOT=y e s
BOOTPROTO= s t a t i c
IPADDR= 1 9 2 . 1 6 8 . 11 .10
NETMASK= 2 5 5 . 2 5 5 . 2 5 5 . 2 5 5
BROADCAST= 1 9 2 . 1 6 8 . 11 . 255

上面配置的是DIRECTOR的真实IP。

再执行下面的命令以使上面对网络的配置生效
代码:
/etc/rc.d/init.d/network restart


RS1(RealServer1)的配置
Linux Realserver 配置的关键之一在于关闭 arp,这要配置/etc/sysctl.conf如下
代码:

#f o r i p v s
n e t . ip v 4 . c o n f . l o . a r p i g n o r e = 1
n e t . ip v 4 . c o n f . l o . a rp announ c e = 2
n e t . ip v 4 . c o n f . a l l . a r p i g n o r e = 1
n e t . ip v 4 . c o n f . a l l . a rp announ c e = 2
n e t . ip v 4 . c o n f . d e f a u l t . r p f i l t e r = 1
#end o f i p v s

在/etc/sysconfig/network-scripts/ifcfg-eth0 中配置 ip 地址和网关。
代码:
DEVICE=e th 0
ONBOOT=y e s
BOOTPROTO= s t a t i c
IPADDR= 1 9 2 . 1 6 8 . 11 . 21
NETMASK= 2 5 5 . 2 5 5 . 2 5 5 . 0
BROADCAST= 1 9 2 . 1 6 8 . 11. 2 5 5

新建VIP 的网卡配置文件为/etc/sysconfig/network-scripts/ifcfg-lo:0。
代码:
DEVICE=l o : 0
ONBOOT=y e s
IPADDR= 1 9 2 . 1 6 8 . 11 . 2 0 0
NETMASK= 2 5 5 . 2 5 5 . 2 5 5 . 2 5 5


再执行下面的命令以使上面对网络的配置生效
代码:
/etc/rc.d/init.d/network restart


RS2(RealServer2)的配置
Linux Realserver 配置的关键之一在于关闭 arp,这要配置/etc/sysctl.conf如下
代码:

#f o r i p v s
n e t . ip v 4 . c o n f . l o . a r p i g n o r e = 1
n e t . ip v 4 . c o n f . l o . a rp announ c e = 2
n e t . ip v 4 . c o n f . a l l . a r p i g n o r e = 1
n e t . ip v 4 . c o n f . a l l . a rp announ c e = 2
n e t . ip v 4 . c o n f . d e f a u l t . r p f i l t e r = 1
#end o f i p v s

在/etc/sysconfig/network-scripts/ifcfg-eth0 中配置 ip 地址和网关。
代码:
DEVICE=e th 0
ONBOOT=y e s
BOOTPROTO= s t a t i c
IPADDR= 1 9 2 . 1 6 8 . 11 . 22
NETMASK= 2 5 5 . 2 5 5 . 2 5 5 . 0
BROADCAST= 1 9 2 . 1 6 8 . 11. 2 5 5

新建VIP 的网卡配置文件为/etc/sysconfig/network-scripts/ifcfg-lo:0。
代码:
DEVICE=l o : 0
ONBOOT=y e s
IPADDR= 1 9 2 . 1 6 8 . 11 . 2 0 0
NETMASK= 2 5 5 . 2 5 5 . 2 5 5 . 2 5 5


再执行下面的命令以使上面对网络的配置生效
代码:
/etc/rc.d/init.d/network restart


至此,一个LVS就配置好了,我们只要分别在Director,RS1,RS2的/var/www/html/文件夹下分别放入三个内容不同的名为index.htm的文件,然后在Client的浏览器中输入http://192.168.11.200,回车,不停的刷新,就会发现,有时看到的是放在RS1上的index.htm,有时看到的是RS2上的index.htm,而不会看到director上的index.html。因为发现198.168.11.200的80端口的http请求报文都被转发到到rs1或rs2上。
大功告成!

LVS中文官网:http://zh.linuxvirtualserver.org/