2009年4月16日星期四

用LVS构架负载均衡Linux集群系统


Redhat Linux ES 5.0下面安装:
1. 因为2.6内核已经集成IPVS内核补订了,所以不再需要重新编译内核.
2. 下载ipvsadm-1.24-6.src.rpm放到某个目录
3. root用户执行 ln -s /usr/src/kernels/2.6.18-53.el5-xen-i686 /usr/src/linux,把内核连接到/usr/src/linux目录
4. rpm -iph ipvsadm-1.24-6.src.rpm,解压安装ipvs代码包
5. 修改/usr/src/redhat/SPECS下面的ipvsadm.spec文件,把这一行Copyright: GNU General Public Licence 替换成 License: GNU General Public Licence
6. 执行 rpmbuild -ba /usr/src/redhat/SPECS/ipvsadm.spec,等待build完成
7. 最后执行rpm -ivh /usr/src/redhat/RPMS/i386/ipvsadm-1.24-6.i386.rpm 安装刚刚编译的包
8. 执行ipvsadm检查是否安装成功。

DR直连方式实例:
Director物理地址: 192.168.145.128
RealServer1物理地址: 192.168.145.129
RealServer2物理地址: 192.168.145.130
虚拟地址:192.168.145.132,端口都是80,httpd服务。
只要在三个服务器上运行相应的脚本,就可以实现LVS服务:
Director:
[root@localhost LVS]# cat lvs_dr.sh
#/bin/bash
# set ip_forward OFF for vs-dr director (1 on, 0 off)
echo 0 > /proc/sys/net/ipv4/ip_forward
ifconfig  eth0:0 192.168.145.132 netmask 255.255.255.255 broadcast 192.168.145.132 up
/sbin/route add -host 192.168.145.132 dev eth0:0
ipvsadm -C
ipvsadm -A -t 192.168.145.132:80 -s rr
# Set Real Server
ipvsadm -a -t 192.168.145.132:80 -r 192.168.145.129:80 -g
ipvsadm -a -t 192.168.145.132:80 -r 192.168.145.130:80 -g
ipvsadm

Real Server后台服务器:
[root@localhost LVS]# cat realserver
#!/bin/sh
VIP=192.168.145.132
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p













下面看看lvs控制台的基本命令


添加一个Service



  1. # ipvsadm -A -t 192.168.8.100:80 -s rr      
  2. rr:表示轮询的方法,缺省为wcl  


添加一个realserver



  1. # ipvsadm -a -t 192.168.8.100:80 -r 192.168.8.180:80 -g    
  2. -a:添加一个realserver   
  3. -r:realserver的地址   
  4. -g:缺省参数   


修改realserver



  1. # ipvsadm -e -t 192.168.8.100:80 -r 192.168.8.180:80 -w 100   
  2. -e:修改-r参数的realserver   
  3. -w:lvs转发通道的处理能力 














 用LVS构架负载均衡Linux集群系统


最近有客户需要一个负载均衡方
案,笔者对各种软硬件的负载均衡方案进行了调查和比较,从IBM sServer Cluster、Sun Cluster
PlatForm等硬件集群,到中软、红旗、TurboLinux的软件集群,发现无论采用哪个厂商的负载均衡产品其价格都是该客户目前所不能接受的。于
是笔者想到了开放源项目Linux Virtual Server(简称LVS)。经过对LVS的研究和实验,终于在Red Hat
9.0上用LVS成功地构架了一组负载均衡的集群系统。整个实现过程整理收录如下,供读者参考。

选用的LVS实际上是一种Linux操作系统上基于IP层的负载均衡调度技术,它
在操作系统核心层上,将来自IP层的TCP/UDP请求均衡地转移到不同的服务器,从而将一组服务器构成一个高性能、高可用的虚拟服务器。使用三台机器就
可以用LVS实现最简单的集群,如图1所示。

图1显示一台名为Director的机器在集群前端做负载分配工作;后端两台机器
称之为Real
Server,专门负责处理Director分配来的外界请求。该集群的核心是前端的Director机器,LVS就是安装在这台机器上,它必须安装
Linux。Real Server则要根据其选用的负载分配方式而定,通常Real
Server上的设置比较少。接下来介绍Director机器上LVS的安装过程。


图1 LVS实现集群系统结构简图


安装

LVS的安装主要是在Director机器上进行,Real Server只需针对不同的转发方式做简单的设定即可。特别是对LVS的NAT方式,Real Server惟一要做的就是设一下缺省的网关。所以构架集群的第一步从安装Director机器开始。

首先要在Director机器上安装一个Linux操作系统。虽然早期的一些Red
Hat版本,如6.2、7.2、8.0等自带Red
Hat自己的集群软件,或者是在内核中已经支持LVS,但是为了更清楚地了解LVS的机制,笔者还是选择自行将LVS编入Linux内核的方式进行安
装,Linux版本采用Red Hat 9.0。

如果用户对Red Hat的安装比较了解,可以选择定制安装,并只安装必要的软件包。安装中请选择GRUB做为启动引导管理软件。因为GRUB在系统引导方面的功能远比LILO强大,在编译Linux内核时可以体会它的方便之处。

LVS是在Linux内核中实现的,所以要对原有的Linux内核打上支持LVS的
内核补丁,然后重新编译内核。支持LVS的内核补丁可以从LVS的官方网站http://www.linuxvirtualserver.org下载,下
载时请注意使用的Linux核心版本,必须下载和使用的Linux内核版本相一致的LVS内核补丁才行。对于Red Hat
9.0,其Linux内核版本是2.4.20,所以对应内核补丁应该是http://www.linuxvirtualserver.org
/software/kernel-2.4/linux-2.4.20-ipvs-1.0.9.patch.gz。笔者经过多次实验,使用Red
Hat
9.0自带的Linux源代码无法成功编译LVS的相关模组。由于时间关系笔者没有仔细研究,而是另外从kernel.org上下载了一个tar包格式的
2.4.20内核来进行安装,顺利完成所有编译。下面是整个内核的编译过程:

1.删除Red Hat自带的Linux源代码







# cd /usr/src
# rm -rf linux*



2.下载2.4.20内核







# cd /usr/src
# wget ftp://ftp.kernel.org/pub/linux/kernel/v2.4/linux-2.4.20.tar.bz2



3.解压到当前目录/usr/src







# cd /usr/src
# tar -xjpvf linux-2.4.20.tar.bz2



4.建立链接文件







# cd /usr/src
# ln -s linux-2.4.20 linux-2.4
# ln -s linux-2.4.20 linux



5.打上LVS的内核补丁







# cd /usr/src
# wget http://www.linuxvirtualserver.org/software/kernel-2.4/linux-2.4.20-ipvs-1.0.9.patch.gz
# gzip -cd linux-2.4.20-ipvs-1.0.9.patch.gz
# cd /usr/src/linux
# patch -p1 < ../linux-2.4.20-ipvs-1.0.9.patch



在打补丁时,注意命令执行后的信息,不能有任何错误信息,否则核心或模组很可能无法成功编译。

6.打上修正ARP问题的内核补丁







# cd /usr/src
# wget http://www.ssi.bg/~ja/hidden-2.4.20pre10-1.diff
# cd /usr/src/linux
# patch -p1 < ../hidden-2.4.20pre10-1.diff



这一步在Director机器上可以不做,但是在使用LVS/TUN和LVS/DR方式的Real Server上必须做。

7.为新核心命名

打开/usr/src/linux/Makefile。注意,在开始部分有一个变量
EXTRAVERSION可以自行定义。修改这个变量,比如改成“EXTRAVERSION=-LVS”后,编译出的核心版本号就会显示成2.4.20-
LVS。这样给出有含义的名称将有助于管理多个Linux核心。

8.检查源代码







# make mrproper



这一步是为确保源代码目录下没有不正确的.o文件及文件的互相依赖。因为是新下载的内核,所以在第一次编译时,这一步实际可以省略。

9.配置核心选项







# make menuconfig



命令执行后会进入一个图形化的配置界面,可以通过这个友好的图形界面对内核进行定
制。此过程中,要注意对硬件驱动的选择。Linux支持丰富的硬件,但对于服务器而言,用不到的硬件驱动都可以删除。另外,像Multimedia
devices、Sound、Bluetooth support、Amateur Radio support等项也可以删除。

注意,以下几项配置对LVS非常重要,请确保作出正确的选择:

(1)Code maturity level options项

对此项只有以下一个子选项,请选中为*,即编译到内核中去。







[*]Prompt for development and/or incomplete code/drivers



(2)Networking options项

对此项的选择可以参考以下的配置,如果不清楚含义可以查看帮助:







<*> Packet socket
[ ] Packet socket: mmapped IO
< > Netlink device emulation
[*] Network packet filtering (replaces ipchains)
[ ] Network packet filtering debugging
[*] Socket Filtering
<*> Unix domain sockets
[*] TCP/IP networking
[*] IP: multicasting
[*] IP: advanced router
[*] IP: policy routing
[ ] IP: use netfilter MARK value as routing key
[ ] IP: fast network address translation
<M> IP: tunneling
[*] IP: broadcast GRE over IP
[ ] IP: multicast routing
[ ] IP: ARP daemon support (EXPERIMENTAL)
[ ] IP: TCP Explicit Congestion Notification support
[ ] IP: TCP syncookie support (disabled per default)
IP: Netfilter Configuration --->
IP: Virtual Server Configuration --->



(3)Networking options项中的IP: Virtual Server Configuration项

如果打好了LVS的内核补丁,就会出现此选项。进入Virtual Server Configuration选项,有以下子选项:







<M> virtual server support (EXPERIMENTAL)      
[*] IP virtual server debugging
(12) IPVS connection table size (the Nth power of 2)
--- IPVS scheduler
<M> round-robin scheduling
<M> weighted round-robin scheduling
<M> least-connection scheduling scheduling
<M> weighted least-connection scheduling
<M> locality-based least-connection scheduling
<M> locality-based least-connection with replication scheduling
<M> destination hashing scheduling
<M> source hashing scheduling
<M> shortest expected delay scheduling
<M> never queue scheduling
--- IPVS application helper
<M> FTP protocol helper



以上所有项建议全部选择。

(4)Networking options项中的IP: Netfilter Configuration项

对于2.4版本以上的Linux
Kernel来说,iptables是取代早期ipfwadm和ipchains的更好选择,所以除非有特殊情况需要用到对ipchains和
ipfwadm的支持,否则就不要选它。本文在LVS/NAT方式中,使用的就是iptables,故这里不选择对ipchains和ipfwadm的支
持:





< > ipchains (2.2-style) support                
< > ipfwadm (2.0-style) support



10. 编译内核

(1)检查依赖关系







# make dep



确保关键文件在正确的路径上。

(2)清除中间文件







# make clean



确保所有文件都处于最新的版本状态下。

(3)编译新核心







# make bzImage



(4)编译模组







# make modules



编译选择的模组。

(5)安装模组







# make modules_install
# depmod -a



生成模组间的依赖关系,以便modprobe定位。

(6)使用新模组







# cp System.map  /boot/System.map-2.4.20-LVS
# rm /boot/System.map
# ln -s /boot/System.map-2.4.20-LVS /boot/System.map
# cp arch/i386/boot/bzImage /boot/vmlinuz-2.4.20-LVS
# rm /boot/vmlinuz
# ln -s /boot/vmlinuz-2.4.20-LVS /boot/vmlinuz
# new-kernel-pkg --install --mkinitrd --depmod 2.4.20-LVS



(7)修改GRUB,以新的核心启动

执行完new-kernel-pkg命令后,GRUB的设置文件/etc/grub.conf中已经增加了新核心的启动项,这正是开始安装Linux时推荐使用GRUB做引导程序的原因。







grub.conf中新增内容如下:
title Red Hat Linux (2.4.20-LVS)
root (hd0,0)
kernel /boot/vmlinuz-2.4.20LVS ro root=LABEL=/
initrd /boot/initrd-2.4.20LVS.img



将Kernel项中的root=LABEL=/改成 root=/dev/sda1 (这里的/dev/sda1是笔者Linux的根分区,读者可根据自己的情况进行不同设置)。

保存修改后,重新启动系统:







# reboot



系统启动后,在GRUB的界面上会出现Red Hat
Linux(2.4.20-LVS)项。这就是刚才编译的支持LVS的新核心,选择此项启动,看看启动过程是否有错误发生。如果正常启动,ipvs将作为
模块加载。同时应该注意到,用LVS的内核启动后在/proc目录中新增了一些文件,比如/proc/sys/net/ipv4/vs/*。

11.安装IP虚拟服务器软件ipvsadm

用支持LVS的内核启动后,即可安装IP虚拟服务器软件ipvsadm了。用户可以
用tar包或RPM包安装,tar包可以从以下地址http://www.linuxvirtualserver.org/software
/kernel-2.4/ipvsadm-1.21.tar.gz下载进行安装。

这里采用源RPM包来进行安装:







# wget http://www.linuxvirtualserver.org/software/kernel-2.4/ipvsadm-1.21-7.src.rpm
# rpmbuild --rebuild ipvsadm-1.21-7.src.rpm
# rpm -ivh /usr/src/redhat/RPMS/i386/ipvsadm-1.21-7.i386.rpm



注意高版本的rpm命令去掉了--rebuild这个参数选项,但提供了一个rpmbuild命令来实现它。这一点和以前在Red Hat 6.2中以rpm—rebuild XXX.src.rpm来安装源RPM包的习惯做法有所不同。

安装完,执行ipvsadm命令,应该有类似如下的信息出现:







# ipvsadm
IP Virtual Server version 1.0.9 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn



出现类似以上信息,表明支持LVS的内核和配置工具ipvsadm已完全安装,这台Director机器已经初步安装完成,已具备构架各种方式的集群的条件。

原理

接下来的工作是根据实际需求选择采用何种负载分配方式和调度算法。目前LVS主要有
三种请求转发方式和八种调度算法。根据请求转发方式的不同,所构架集群的网络拓扑、安装方式、性能表现也各不相同。用LVS主要可以架构三种形式的集群,
分别是LVS/NAT、LVS/TUN和LVS/DR,可以根据需要选择其中一种。在选定转发方式的情况下,采用哪种调度算法将决定整个负载均衡的性能表
现,不同的算法适用于不同的应用场合,有时可能需要针对特殊场合,自行设计调度算法。LVS的算法是逐渐丰富起来的,最初LVS只提供4种调度算法,后来
发展到以下八种:

1.轮叫调度(Round Robin)

调度器通过“轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。

2.加权轮叫(Weighted Round Robin)

调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器能处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

3.最少链接(Least Connections)

调度器通过“最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载。

4.加权最少链接(Weighted Least Connections)

在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

5.基于局部性的最少链接(Locality-Based Least Connections)

“基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于
Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器
不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。

6.带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)

“带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要
用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务
器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发
送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组
有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

7.目标地址散列(Destination Hashing)

“目标地址散列”调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

8.源地址散列(Source Hashing)

“源地址散列”调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

了解这些算法原理能够在特定的应用场合选择最适合的调度算法,从而尽可能地保持Real Server的最佳利用性。当然也可以自行开发算法,不过这已超出本文范围,请参考有关算法原理的资料。



实例

理解了上述关于请求转发方式和调度算法的基本概念后,就可以运用LVS来具体实现几
种不同方式的负载均衡的集群系统。LVS的配置是通过前面所安装的IP虚拟服务器软件ipvsadm来实现的。ipvsadm与LVS的关系类似于
iptables和NetFilter的关系,前者只是一个建立和修改规则的工具,这些命令的作用在系统重新启动后就消失了,所以应该将这些命令写到一个
脚本里,然后让它在系统启动后自动执行。网上有不少配置LVS的工具,有的甚至可以自动生成脚本。但是自己手工编写有助于更深入地了解,所以本文的安装没
有利用其它第三方提供的脚本,而是纯粹使用ipvsadm命令来配置。

下面就介绍一下如何配置LVS/NAT、LVS/TUN、LVS/DR方式的负载均衡集群。

1.设定LVS/NAT方式的负载均衡集群

NAT是指Network Address
Translation,它的转发流程是:Director机器收到外界请求,改写数据包的目标地址,按相应的调度算法将其发送到相应Real
Server上,Real
Server处理完该请求后,将结果数据包返回到其默认网关,即Director机器上,Director机器再改写数据包的源地址,最后将其返回给外
界。这样就完成一次负载调度。

构架一个最简单的LVS/NAT方式的负载均衡集群如图2所示。


图2 LVS/NAT方式的集群简图


Real
Server可以是任何的操作系统,而且无需做任何特殊的设定,惟一要做的就是将其默认网关指向Director机器。Real
Server可以使用局域网的内部IP(192.168.0.0/24)。Director要有两块网卡,一块网卡绑定一个外部IP地址
(10.0.0.1),另一块网卡绑定局域网的内部IP(192.168.0.254),作为Real Server的默认网关。

这里将所有LVS的配置命令写到一个可执行脚本中,脚本如下:







#!/bin/bash
# Open IP Forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
# To make the load balancer forward the masquerading packets
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -d 0.0.0.0/0 -o eth0 -j MASQUERADE
ipvsadm -C
# Choose the Weighted Round Robing
ipvsadm -A -t 10.0.0.1:80 -s wrr
# Set Real Server
ipvsadm -a -t 10.0.0.1:80 -r 192.168.0.1:873 -m -w 2
ipvsadm -a -t 10.0.0.1:80 -r 192.168.0.2:873 -m -w 3
ipvsadm



将该脚本保存为/root/lvs_nat.sh,然后加上可执行属性,执行它:







# chmod a+x /root/lvs_nat.sh
# /root/lvs_nat.sh



运行该脚本后,一个简单的LVS/NAT方式的负载均衡集群已经成功架设。模拟多个用户从外界访问10.0.0.1的80端口,用ipvsadm可以观看到以下信息:







# ipvsadm
IP Virtual Server version 1.0.9 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.1:http wrr
-> 192.168.0.1:http Masq 3 2 0
-> 192.168.0.2:http Masq 2 1 0



其中ActiveConn表示对应的Real Server当前有多少个正在活动的连接,InActConn表示不活动的连接数。从这里我们可以看到有3个HTTP请求,被分别分配在不同的Real Server上,表明这个负载均衡集群正在成功运行中。

本例完成了这样一个简单的LVS/NAT集群,由此可以看出,LVS/NAT方式实
现起来最为简单,而且Real Server使用的是内部IP,可以节省Real
IP的开销。但因为执行NAT需要重写流经Director的数据包,在速度上有一定延迟;另外,当用户的请求非常短,而服务器的回应非常大的情况下,会
对Director形成很大压力,成为新的瓶颈,从而使整个系统的性能受到限制。

2.设定LVS/TUN方式的负载均衡集群

TUN是指IP Tunneling,它的转发流程是:Director机器收到外界请求,按相应的调度算法将其通过IP隧道发送到相应Real Server,Real Server处理完该请求后,将结果数据包直接返回给客户。至此完成一次负载调度。

最简单的LVS/TUN方式的负载均衡集群架构如图3所示。

LVS/TUN使用IP
Tunneling技术,在Director机器和Real Server机器之间架设一个IP Tunnel,通过IP
Tunnel将负载分配到Real Server机器上。Director和Real
Server之间的关系比较松散,可以是在同一个网络中,也可以是在不同的网络中,只要两者能够通过IP
Tunnel相连就行。收到负载分配的Real
Server机器处理完后会直接将反馈数据送回给客户,而不必通过Director机器。实际应用中,服务器必须拥有正式的IP地址用于与客户机直接通
信,并且所有服务器必须支持IP隧道协议。


图3 LVS/TUN方式的集群简图


这里将所有LVS的配置命令写到一个可执行脚本,脚本内容如下:







#!/bin/bash
# Close IP Forwarding
echo 0 > /proc/sys/net/ipv4/ip_forward
ifconfig eth0 down
ifconfig eth0 192.168.0.253 netmask 255.255.255.0 broadcast 192.168.0.255 up
ifconfig eth0:0 192.168.0.254 netmask 255.255.255.255 broadcast 192.168.0.254 up
ipvsadm -C
ipvsadm -A -t 192.168.0.254:80 -s wlc
ipvsadm -a -t 192.168.0.254:80 -r 192.168.0.1 -i -w 3
ipvsadm -a -t 192.168.0.254:80 -r 192.168.1.201 -i -w 1
ipvsadm



将上面的脚本保存为/root/lvs_tun.sh。然后加上可执行属性,执行它:







# chmod a+x /root/lvs_tun.sh
# /root/lvs_tun.sh



运行此脚本之后应该出现如下信息:







# ./lvs-tun.sh
IP Virtual Server version 1.0.9 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.254:http wlc
-> 192.168.1.201:http Tunnel 1 0 0
-> 192.168.0.1:http Tunnel 1 0 0



另外在每台Real Server上还要执行如下的命令:







ifconfig tunl0 192.168.0.254 netmask 255.255.255.255 broadcast 192.168.0.254 up
route add -host 192.168.0.254 dev tunl0
echo 1 > /proc/sys/net/ipv4/conf/all/hidden
echo 1 > /proc/sys/net/ipv4/conf/tunl0/hidden



注意Real Server的内核必须打上修正ARP问题的内核补丁,如Linux2.4.20的内核是hidden-2.4.20pre10-1.diff,编译内核的方法参见Director机器。

通过本例来简单评价一下LVS/TUN方式。该方式中Director将客户请求分
配到不同的Real Server,Real
Server处理请求后直接回应给用户,这样Director就只处理客户机与服务器的一半连接,极大地提高了Director的调度处理能力,使集群系
统能容纳更多的节点数。另外TUN方式中的Real
Server可以在任何LAN或WAN上运行,这样可以构筑跨地域的集群,其应对灾难的能力也更强,但是服务器需要为IP封装付出一定的资源开销,而且后
端的Real Server必须是支持IP Tunneling的操作系统。

3.设定LVS/DR方式的负载均衡集群

DR是指Direct Routing,它的转发流程是:Director机器收到外界请求,按相应的调度算法将其直接发送到相应Real Server,Real Server处理完该请求后,将结果数据包直接返回给客户,完成一次负载调度。

构架一个最简单的LVS/DR方式的负载均衡集群如图4所示。

Real
Server和Director都在同一个物理网段中,Director的网卡IP是192.168.0.253,再绑定另一个
IP:192.168.0.254作为对外界的virtual IP,外界客户通过该IP来访问整个集群系统。Real
Server在lo上绑定IP:192.168.0.254,同时加入相应的路由。

Director端的实现脚本如下:







#!/bin/bash
# set ip_forward OFF for vs-dr director (1 on, 0 off)
echo 0 > /proc/sys/net/ipv4/ip_forward
ifconfig eth0:0 192.168.0.254 netmask 255.255.255.255 broadcast 192.168.0.255 up
ipvsadm -C
ipvsadm -A -t 192.168.0.254:80 -s wlc
# Set Real Server
ipvsadm -a -t 192.168.0.254:80 -r 192.168.0.1:873 -g
ipvsadm -a -t 192.168.0.254:80 -r 192.168.0.2:873 -g
ipvsadm




图4 LVS/DR方式的集群简图


将脚本保存为/root/lvs_dr.sh,加上可执行属性,执行它:







# chmod a+x /root/lvs_dr.sh
# /root/lvs_dr.sh



运行此脚本之后可以看到如下信息:







# ./lvs_dr.sh
IP Virtual Server version 1.0.9 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.254:http wlc
-> 192.168.0.2:http Route 1 0 0
-> 192.168.0.1:http Route 1 0 0



另外每台Real Server上要执行如下命令:







ifconfig lo:0 192.168.0.254 netmask 255.255.255.255 broadcast 192.168.0.255 up
route add -host 192.168.0.254 dev lo:0
echo 1 > /proc/sys/net/ipv4/conf/all/hidden
echo 1 > /proc/sys/net/ipv4/conf/lo/hidden



注意Real Server的内核也必须打上修正ARP问题的内核补丁,编译内核的方法参见Director机器。

同样通过本例来简单评价一下LVS/DR方式。LVS/DR方式与前面的LVS
/TUN方式有些类似,前台的Director机器也是只需要接收和调度外界的请求,而不需要负责返回这些请求的反馈结果,所以能够负载更多的Real
Server,提高Director的调度处理能力,使集群系统容纳更多的Real
Server。但LVS/DR需要改写请求报文的MAC地址,所以所有服务器必须在同一物理网段内。

结束语

其实集群架设到此还不能达到正式应用的要求,至少还需要解决三个问题:

1. 安装监视软件

集群运作时,应当监视集群中所有Real
Server的运行情况并对其中的变化作出反应。如果发现Real
Server突然down机,需要将其从集群队列中删除,等恢复后再重新加入。mon就是这样一个系统资源监控程序,可以监控网络服务可用性、服务器问题
等。用户可以对其进行定制和扩展。

2. 后台Real Server节点的数据一致性问题和更新方法

比如一个提供Web服务的集群系统,每台服务器的Web资料必须一致,如果对Web
资料的内容进行更新、增加或删除,如何使所有服务器之间数据同步呢?对于这种数据同步问题,一是采用网络镜像,如借用Mirror、FTP等来自行编写脚
本进行镜像;另一种是使用网络文件系统,如coda等。

3. 提高可用性

以上示例中,Director机器只有一台,一旦Director机器down掉,整个集群也就崩溃了,所以要考虑使用两台机器做一个HA(High-Availability)。比如,配合使用Linux的另一个软件heartbeat来实现HA。

实际运行中,面对的问题可能不只以上这些,相关内容在此就不再详述,欢迎大家共同探讨。

(责任编辑:赵纪雷)





















VMware5安装集群LVS实战解析


环境描述:本文在配置LVS时使用三台linux,虚拟VIP:192.168.8.11


 


一台做Directorserver(192.168.8.2) ,操作系统RedhatAS4


 


两台做realserver(192.168.8.5,192.168.8.6) 操作系统RedhatAS4


 


在配置lvs+heartbeat时,又添加了一台(192.168.8.3)做为备份主节点, 操作系统Fedora7


 


Virtual IP: 192.168.8.11


Load Balancer: 192.168.8.2


 


Backup: 192.168.8.3


 


Real Server 1: 192.168.8.5


Real Server 2: 192.168.8.6


 


软件列表:


ipvsadm-1.24.tar.gz: http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz


 


ipvsadm-1.24-8.1.i386.rpm


 


ftp://rpmfind.net/linux/fedora/releases/7/Everything/i386/os/Fedora/ipvsadm-1.24-8.1.i386.rpm


libnet.tar 下载地址:http://www.packetfactory.net/libnet/ 稳定版本是:1.1.2.1


 


heartbeat-2.0.2.tar.gz: http://linux-ha.org/download/heartbeat-2.0.8.tar.gz


 


2.6内核已经集成IPVS内核补订了,所以不再需要重新编译内核.


 


配置此集群分以下几种情况


 


一、配置基于DR模式Lvs集群


 


1、下载ipvsadm管理程序


http://www.linuxvirtualserver.org/software/


注意对应自己的内核版本


ipvsadm-1.24.tar.gz


tar zxvf ipvsadm-1.24.tar.gz


cd ipvsadm-1.24


make && make install


注意在make时可能会出现很多错误的信息,请按照如下操作就可以心编译正常


ln -s /usr/src/kernels/2.6.9-22.EL-i686/ /usr/src/linux


 


cd ipvsadm-1.24


 


make && make install


 


2.配置VIP脚本


 


[root@test7 chang]#vi LvsDR


 


#!/bin/sh


 


VIP=192.168.8.11


 


RIP1=192.168.8.6


 


RIP2=192.168.8.5


 


/etc/rc.d/init.d/functions


 


case "$1" in


 


start)


 


echo "start LVS of DirectorServer"


#Set the Virtual IP Address


 


/sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up


 


/sbin/route add -host $VIP dev eth0:1


 


#Clear IPVS Table


 


/sbin/ipvsadm -C


 


#Set Lvs


 


/sbin/ipvsadm -A -t $VIP:80 -s rr


 


/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g


 


/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g


 


#Run Lvs


 


/sbin/ipvsadm


 


;;


 


stop)


 


echo "close LVS Directorserver"


 


/sbin/ipvsadm -C


 


;;


 


*)


 


echo "Usage: $0 {start|stop}"


 


exit 1


 


esac


 


(-s rr 是使用了轮叫算法,可以自行选择相应的算法,默认是-wlc, -g 是使用lvs工作DR直接路由模式,ipvsadm -h查看帮助)。


 


3、配置realserver脚本


 


[root@test5 chang]#vi realserver


 


#!/bin/sh


 


VIP=192.168.8.11


 


/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up


 


/sbin/route add -host $VIP dev lo:0


 


echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore


 


echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce


 


echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore


 


echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce


 


sysctl –p


 


如果有多个realserver直接添加就可以了,之后启动此脚本就可以了.


 


测试:分别启动realserver上的httpd服务


在realserver1 执行 echo "This is realserver1" >> /var/www/html/index.html


在realserver2 执行 echo "This is realserver2" >> /var/www/html/index.html


 


打开IE浏览器输入http://192.168.8.11 应该可以分别看到:This is realserver1 和 This is realserver2.




二、配置基于隧道模式Lvs集群


 


1.配置LVS directorserver 脚本


 


[root@test7 chang]#vi TunLVS


 


#!/bin/sh

VIP=192.168.8.11


 


RIP1=192.168.8.5


 


RIP2=192.168.8.6


 


/etc/rc.d/init.d/functions


 


case "$1" in


 


start)


 


echo "Start Lvs of DirectorServer"


 


#set vip server


 


/sbin/ifconfig tunl0 $VIP broadcast $VIP netmask 255.255.255.255 up


 


/sbin/route add -host $VIP dev tunl0


 


#clear IPVS table


 


/sbin/ipvsadm -C


 


#set lvs


 


/sbin/ipvsadm -A -t $VIP:80 -s rr


 


/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -i


 


/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -i


 


#Run Lvs


 


/sbin/ipvsadm


 


;;


 


stop)


 


echo "Close Lvs DirectorServer "


 


ifconfig tunl0 down


 


/sbin/ipvsadm -C


 


;;


 


*)


 


echo "Usage: $0 {start|stop}"


 


exit 1


 


esac


 


2. 配置realserver


 


[root@test5 chang]#


 


#!/bin/sh


 


VIP=192.168.8.11


 


/etc/rc.d/init.d/functions


 


case "$1" in


 


start)


 


echo "tunl port starting"


 


/sbin/ifconfig tunl0 $VIP broadcast $VIP netmask 255.255.255.255 up


 


/sbin/route add -host $VIP dev tunl0


 


echo "1" > /proc/sys/net/ipv4/ip_forward


 


echo "1" > /proc/sys/net/ipv4/conf/tunl0/arp_ignore


 


echo "2" > /proc/sys/net/ipv4/conf/tunl0/arp_announce


 


echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore


 


echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce


 


sysctl -p


 


;;


 


stop)


 


echo "tunl port closing"


ifconfig tunl0 down


 


echo "1" > /proc/sys/net/ipv4/ip_forward


 


echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce


 


;;


 


*)


 


echo "Usege: $0 {start|stop}"


 


exit 1


 


esac


 


此脚本分别在realserver上执行,目的使realserver忽略arp响应,并设定vip.


 


三、配置基于高可用Lvs+heartbeat


 


确定LVS使用DR或/tun模式,请对照上面的配置,本例使用DR模式


 


1.配置LVS directorserver 脚本


 


#!/bin/sh


 


VIP=192.168.8.11


 


RIP1=192.168.8.6


 


RIP2=192.168.8.5


 


/etc/rc.d/init.d/functions


 


case "$1" in


 


start)


 


echo "start LVS of DirectorServer"


 


#Set the Virtual IP Address


 


/sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up


 


/sbin/route add -host $VIP dev eth0:1


 


#Clear IPVS Table


 


/sbin/ipvsadm -C


 


#Set Lvs


 


/sbin/ipvsadm -A -t $VIP:80 -s rr


 


/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g


 


/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g


 


#Run Lvs


 


/sbin/ipvsadm


 


;;


 


stop)


 


echo "close LVS Directorserver"


 


/sbin/ipvsadm -C


 


;;


 


*)


 


echo "Usage: $0 {start|stop}"


 


exit 1



esac


 


2. realserver端同样使用上面的配置文件就可以。


 


3.安装heartbeat


 


3.1 安装


 


tar -zxvf libnet.tar.gz


cd libnet


./configure


make


make install


 


groupadd -g 694 haclient


useradd -u 694 -g haclient hacluster


 


tar zxf heartbeat-1.99.4.tar.gz


cd heartbeat-1.99.4


./ConfigureMe configure


make


make install


cp doc/ha.cf doc/haresources doc/authkeys /etc/ha.d/


cp ldirectord/ldirectord.cf /etc/ha.d/


 


3.2配置主文件/etc/ha.d/ha.cf


 


logfile /var/log/ha-log


 


keepalive 2


 


deadtime 60


 


warntime 10


 


initdead 120


 


udpport 694


 


bcast eth0 # Linux


 


auto_failback on


 


ping_group group1 192.168.8.2 192.168.8.3


 


respawn root /usr/lib/heartbeat/ipfail


 


apiauth ipfail gid=root uid=root


 


hopfudge 1


 


use_logd yes


 


node test7


 


node test8


 


crm on


 


3.3资源文件/etc/ha.d/ haresources


 


test7 192.168.8.11 httpd




设置test7为主节点,集群服务器的ip地址为192.168.8.11 集群服务有httpd


 


3.4认证文件(/etc/ha.d/authkeys),选取一种认证方式,这个文件的权限必须是600


 


auth 1


1 crc


#2 sha1 sha1_any_password


#3 md5 md5_any_password


 


chmod 600 /etc/ha.d/ haresources


 


3.5编辑主机名:/etc/hosts


 


192.168.8.2 test8


 


192.168.8.3 test7


 


备份节点192.168.8.3 上的heartbeat和apache的配置与节点1要完全相同,lvs配置也要相同


 


完装完毕进行测试,关闭主节点机器,另一台自动接管,主节点恢复后自动接管回服务。如果以上测试没有问题,那么开始和lvs整合。


 


4.配置Ldirectord


Ldirectord的作用是监测Real Server,当Real Server失效时,把它从Load Balancer列表中删除,恢复时重新添加,在安装heartbeat时已经安装了Ldirectord。


 


配置(/etc/ha.d/ldirectord.cf):


 


checktimeout=3


 


checkinterval=1


 


fallback=127.0.0.1:80


 


autoreload=yes


 


logfile="/var/log/ldirectord.log"


 


quiescent=yes


 


# Sample for an http virtual service


 


virtual=192.168.8.11:80


 


real=192.168.8.6:80 gate


 


real=192.168.8.5:80 gate


 


fallback=127.0.0.1:80 gate


 


service=http


 


request="index.html"


 


receive="Test Page"


 


protocol=tcp


 


checktype=negotiate


 


checkport=80


 


在每个Real Server的中添加监控页:


echo "Test Page" >> /var/www/html/index.html


 


修改/etc/ha.d/haresources


 


test7 192.168.8.11 ipvsadm ldirectord httpd


 


现在可以在主节点启动heartbeat


/etc/init.d/heartbeat start


 


并在备份节点启动heartbeat


 


/etc/init.d/heartbeat start


 


测试:关闭主节点,备份节点将自动接管directorserver服务。


至此配置完毕。









没有评论: