一集群和Linux上的集群解决方案
集群系统(Cluster)主要解决下边几个问题:
高可靠性(HA)
借助集群管理软件,当主服务器故障时,备份服务器才能手动接管主服务器的工作,并及时切换过去,以实现对用户的不间断服务。
高性能估算(HP)
即充分借助集群中的每一台计算机的资源,实现复杂运算的并行处理,一般用于科学估算领域,例如基因剖析,物理剖析等。
负载平衡
即把负载压力按照某种算法合理分配到集群中的每一台计算机上,以减少主服务器的压力,增加对主服务器的硬件和软件要求。
基于Linux的集群解决方案堪称百花齐放。在实际应用中,最常见的情况是借助集群解决负载平衡问题,例如用于提供WWW服务。在这儿主要展示怎样使用LVS(LinuxVirtialServer)来实现实用的WWW负载平衡集群系统。
二LVS简介
LVS是章文嵩博士发起和领导的优秀的集群解决方案,许多商业的集群产品,例如RedHat的Piranha,TurboLinux公司的TurboCluster等,都是基于LVS的核心代码的。在现实的应用中,LVS得到了大量的布署,请参考。关于LinuxLVS的工作原理和更详尽的信息,请参考。
三LVS配置实例
通过LinuxLVS,实现WWW,Telnet服务的负载平衡。这儿实现Telnet集群服务仅为了测试上的便捷。
LVS有三种负载平衡方法,NAT(NetworkAddressTranslation),DR(DirectRouting),IPTunneling。其中,最为常用的是DR方法,因而这儿只说明DR(DirectRouting)形式的LVS负载平衡。为测试便捷,4台机器处于同一网关内,通过一交换机或则网桥相连。实际的应用中,最好能将虚拟服务器vs1和真实服务器rs1,rs2放在于不同的网关上,即提升了性能,也强化了整个集群系统的安全性。
服务器的软硬件配置
首先说明,尽管本文的测试环境中用的是3台相同配置的服务器,但LVS并不要求集群中的服务器尺寸划一,相反,可以依照服务器的不同配置和负载情况,调整负载分配策略,充分借助集群环境中的每一台服务器。
这3台服务器中linux windows,vs1作为虚拟服务器(即负载平衡服务器),负责将用户的访问恳求转发到集群内部的rs1,rs2,之后由rs1,rs2分别处理。client为顾客端测试机器,可以为任意操作系统。4台服务器的操作系统和网路配置分别为:
vs1: RedHat 6.2, Kernel 2.2.19
vs1: eth0 192.168.0.1
vs1: eth0:101 192.168.0.101
rs1: RedHat 6.2, Kernel 2.2.14
rs1: eth0 192.168.0.3
rs1: dummy0 192.168.0.101
rs2: RedHat 6.2, Kernel 2.2.14
rs2: eth0 192.168.0.4
rs2: dummy0 192.168.0.101
client: Windows 2000
client: eth0 192.168.0.200
其中,192.168.0.101是容许用户访问的IP。
虚拟服务器的集群配置
大部份的集群配置工作都在虚拟服务器vs1里面,须要下边的几个步骤:
重新编译内核。
首先,下载最新的Linux内核,版本号为2.2.19,下载地址为:,解压缩后放在/usr/src/linux目录下。
其次须要下载LVS的内核补丁,地址为:。这儿注意,假如你用的Linux内核不是2.2.19版本的,请下载相应版本的LVS内核补丁。将ipvs-1.0.6-2.2.19.tar.gz解压缩后放在/usr/src/linux目录下。
之后,对内核打补丁,如下操作:
[root@vs2 /root]# cd /usr/src/linux
[root@vs2 linux]# patch -p1 < ipvs-1.0.6-2.2.19/ipvs-1.0.6-2.2.19.
patch
下边就是重新配置和编译Linux的内核。非常注意以下选项:
1 Code maturity level options--->
* [*]Prompt for development and/or incomplete code/drivers
2 Networking部分:
[*] Kernel/User netlink socket
[*] Routing messages
Netlink device emulation
* [*] Network firewalls
[*] Socket Filtering
Unix domain sockets
* [*] TCP/IP networking
[*] IP: multicasting
[*] IP: advanced router
[ ] IP: policy routing
[ ] IP: equal cost multipath
[ ] IP: use TOS value as routing key
[ ] IP: verbose route monitoring
[ ] IP: large routing tables
[ ] IP: kernel level autoconfiguration
* [*] IP: firewalling
[ ] IP: firewall packet netlink device
* [*] IP: transparent proxy support
* [*] IP: masquerading
--- Protocol-specific masquerading support will be built as modules.
* [*] IP: ICMP masquerading
--- Protocol-specific masquerading support will be built as modules.
* [*] IP: masquerading special modules support
* IP: ipautofw masq support (EXPERIMENTAL)(NEW)
* IP: ipportfw masq support (EXPERIMENTAL)(NEW)
* IP: ip fwmark masq-forwarding support (EXPERIMENTAL)(NEW)
* [*] IP: masquerading virtual server support (EXPERIMENTAL)(NEW)
[*] IP Virtual Server debugging (NEW) <--最好选择此项,以便观察LVS的调试信息
* (12) IP masquerading VS table size (the Nth power of 2) (NEW)
* IPVS: round-robin scheduling (NEW)
* IPVS: weighted round-robin scheduling (NEW)
* IPVS: least-connection scheduling (NEW)
* IPVS: weighted least-connection scheduling (NEW)
* IPVS: locality-based least-connection scheduling (NEW)
* IPVS: locality-based least-connection with replication scheduling
(NEW)
* [*] IP: optimize as router not host
* IP: tunneling
IP: GRE tunnels over IP
[*] IP: broadcast GRE over IP
[*] IP: multicast routing
[*] IP: PIM-SM version 1 support
[*] IP: PIM-SM version 2 support
* [*] IP: aliasing support
[ ] IP: ARP daemon support (EXPERIMENTAL)
* [*] IP: TCP syncookie support (not enabled per default)
--- (it is safe to leave these untouched)
IP: Reverse ARP
[*] IP: Allow large windows (not recommended if <16Mb of memory)
The IPv6 protocol (EXPERIMENTAL)
里面,带*号的为必选项。之后就是常规的编译内核过程,不再赘言。
在这儿要注意一点:假如你使用的是RedHat自带的内核或则从RedHat下载的内核版本,早已预先打好了LVS的补丁。这可以通过查看/usr/src/linux/net/目录下有没有几个ipvs开头的文件来判定:假如有,则说明早已打过补丁。
编撰LVS配置文件,实例中的配置文件如下:
#lvs_dr.conf (C) Joseph Mack mack@ncifcrf.gov
LVS_TYPE=VS_DR
INITIAL_STATE=on
VIP=eth0:101 192.168.0.101 255.255.255.0 192.168.0.0
DIRECTOR_INSIDEIP=eth0 192.168.0.1 192.168.0.0 255.255.255.0 192.168.0. 255
SERVICE=t telnet rr rs1:telnet rs2:telnet
SERVICE=t www rr rs1:www rs2:www
SERVER_VIP_DEVICE=dummy0
SERVER_NET_DEVICE=eth0
#----------end lvs_dr.conf------------------------------------
将该文件放在/etc/lvs目录下。
使用LVS的配置脚本形成lvs.conf文件。该配置脚本可以从单独下载,在ipvs-1.0.6-2.2.19.tar.gz包中也有包含脚本configure的使用方式:
[root@vs2 lvs]# configure lvs.conf
这样会形成几个配置文件linux 操作系统原理,这儿我们只使用其中的rc.lvs_dr文件。更改/etc/rc.d/init.d/rc.local,降低如下几行:
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/ip_always_defrag
# 显示最多调试信息
echo 10 > /proc/sys/net/ipv4/vs/debug_level
配置NFS服务。这一步仅仅是为了便捷管理,不是必须的步骤。假定配置文件lvs.conf文件置于/etc/lvs目录下,则/etc/exports文件的内容为:
/etc/lvs ro(rs1,rs2)
之后使用exportfs命令输出这个目录:
[root@vs2 lvs]# exportfs
假如遇见哪些麻烦,可以尝试:
[root@vs2 lvs]# /etc/rc.d/init.d/nfs restart
[root@vs2 lvs]# exportfs
这样,各个realserver可以通过NFS获得rc.lvs_dr文件,便捷了集群的配置:你每次更改lvs.conf中的配置选项linux安装教程,都可以即可反映在rs1,rs2的相应目录里。更改/etc/syslogd.conf,降低如下一行:kern.*/var/log/kernel_log。这样,LVS的一些调试信息都会写入/var/log/kernel_log文件中。
RealServer的配置
RealServer的配置相对简单,主要是是以下几点:
配置telnet和WWW服务。telnet服务没有须要非常注意的事项,并且对于www服务,须要更改httpd.conf文件,致使apache在虚拟服务器的ip地址上窃听,如下所示:
Listen 192.168.0.101:80
关掉RealServer上dummy0的arp恳求响应能力。这是必须的,具体缘由请参见ARPprobleminLVS/TUNandLVS/DR关掉dummy0的arp响应的方法有多种,比较简单地方式是linux 操作系统原理,更改/etc/rc.d/rc.local文件,降低如下几行:
echo 1 > /proc/sys/net/ipv4/conf/all/hidden
ifconfig dummy0 up
ifconfig dummy0 192.168.0.101 netmask 255.255.255.0 broadcast 192.168. 0.0 up
echo 1 > /proc/sys/net/ipv4/conf/dummy0/hidden
再次修改/etc/rc.d/rc.local,增加如下一行:(可以和步骤2合并)
echo 1 > /proc/sys/net/ipv4/ip_forward
四LVS的测试
好了,经过了里面的配置步骤,如今可以测试LVS了,步骤如下:
分别在vs1,rs1,rs2上运行/etc/lvs/rc.lvs_dr。注意,rs1,rs2里面的/etc/lvs目录是vs2输出的。倘若您的NFS配置没有成功,也可以把vs1上/etc/lvs/rc.lvs_dr复制到rs1,rs2上,之后分别运行。确保rs1,rs2里面的apache早已启动而且容许telnet。
之后从client运行telnet192.168.0.101,假如登陆后见到如下输出就说明集群早已开始工作了。(假定以guest用户身分登入)
[guest@rs1guest]$-----------说明早已登陆到服务器rs1上。
再开启一个telnet窗口,登陆后会发觉系统提示变为:
[guest@rs2guest]$-----------说明早已登陆到服务器rs2上。
之后在vs2上运行如下命令:
[root@vs2 /root]ipvsadm
运行结果应当为:
IP Virtual Server version 1.0.6 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.101:telnet rr
-> rs2:telnet Route 1 1 0
-> rs1:telnet Route 1 1 0
TCP 192.168.0.101:www rr
-> rs2:www Route 1 0 0
-> rs1:www Route 1 0 0
至此早已验证telnet的LVS正常。之后测试一下WWW是否正常:用你的浏览器查看是否有哪些变化?为了更明晰的区别响应来自哪个RealServer,可以在rs1,rs2里面分别放置如下的测试页面(test.html):
我是real server #1 or #2
之后刷新几次页面(),假如你看见“我是realserver#1”和“我是realserver#2”交替出现,说明www的LVS系统早已正常工作了。
然而因为InternetExplore或则Netscape本身的缓存机制,你或许总是只能看见其中的一个。不过通过ipvsadm还是可以看出,页面恳求早已分配到两个RealServer上了,如下所示:
IP Virtual Server version 1.0.6 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.101:telnet rr
-> rs2:telnet Route 1 0 0
-> rs1:telnet Route 1 0 0
TCP 192.168.0.101:www rr
-> rs2:www Route 1 0 5
-> rs1:www Route 1 0 4
或则,可以采用linux的lynx作为测试顾客端,疗效更好一些。如下运行命令:
[root@client /root]while true; do lynx -dump
http://10.64.1.56/test.html; sleep 1; done
这样,每隔一秒钟“我是realserver#1”和“我是realserver#2”就交替出现一次,清楚地表明响应分别来自两个不同的RealServer。