集群和linux上的集群解决方案
lvs 简介
lvs 配置实例
lvs 的测试
调试技巧
内容:
集群和linux上的集群解决方案
lvs 简介
lvs 配置实例
lvs 的测试
调试技巧
一 集群和linux上的集群解决方案
集群系统(cluster)主要解决下面几个问题:
高可靠性(ha)。利用集群管理软件,当主服务器故障时,备份服务器能够自动接管主服务器的工作,并及时切换过去,以实现对用户的不间断服务。
高性能计算(hp)。即充分利用集群中的每一台计算机的资源,实现复杂运算的并行处理,通常用于科学计算领域,比如基因分析,化学分析等。
负载平衡。即把负载压力根据某种算法合理分配到集群中的每一台计算机上,以减轻主服务器的压力,降低对主服务器的硬件和软件要求。
基于linux的集群解决方案可谓百花齐放,具体请参见 linux 集群系统大比拼
在实际应用中,最常见的情况是利用集群解决负载平衡问题,比如用于提供www服务。在这里主要展示如何使用lvs(linux virtial server)来实现实用的www负载平衡集群系统。
二 lvs简介
lvs是章文嵩博士发起和领导的优秀的集群解决方案,许多商业的集群产品,比如redhat的piranha,turbolinux公司的turbo cluster等,都是基于lvs的核心代码的。在现实的应用中,lvs得到了大量的部署,请参考http://www.linuxvirtualserver.org/deployment.html
关于linux lvs的工作原理和更详细的信息,请参考http://www.linuxvirtualserver.org。
三 lvs配置实例
通过linux lvs,实现www,te.net服务的负载平衡。这里实现te.net集群服务仅为了测试上的方便。
lvs有三种负载平衡方式,nat.network address translation),dr(direct routing),ip tunneling。其中,最为常用的是dr方式,因此这里只说明dr(direct routing)方式的lvs负载平衡。
网络拓扑结构。
如图1所示,为测试方便,4台机器处于同一网段内,通过一交换机或者集线器相连。实际的应用中,最好能将虚拟服务器vs1和真实服务器rs1, rs2置于于不同的网段上,即提高了性能,也加强了整个集群系统的安全性。
服务器的软硬件配置
首先说明,虽然本文的测试环境中用的是3台相同配置的服务器,但lvs并不要求集群中的服务器规格划一,相反,可以根据服务器的不同配置和负载情况,调整负载分配策略,充分利用集群环境中的每一台服务器。
这3台服务器中,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,下载地址为:http://www.kernel.org/,解压缩后置于/usr/src/linux目录下。
其次需要下载lvs的内核补丁,地址为:http://www.linuxvirtualserver.org/software/ipvs-1.0.6-2.2.19.tar.gz。这里注意,如果你用的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)
上面,带*号的为必选项。
然后就是常规的编译内核过程,不再赘述,请参考编译 linux 教程
在这里要注意一点:如果你使用的是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 te.net rr rs1:te.net rs2:te.net
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文件。该配置脚本可以从http://www.linuxvirtualserver.org/joseph.mack/configure-lvs_0.8.tar.gz 单独下载,在ipvs-1.0.6-2.2.19.tar.gz包中也有包含脚本configure的使用方法:
[root@vs2 lvs]# configure lvs.conf
这样会产生几个配置文件,这里我们只使用其中的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
这样,各个real server可以通过nfs获得rc.lvs_dr文件,方便了集群的配置:你每次修改lvs.conf中的配置选项,都可以即可反映在rs1,rs2的相应目录里。
修改/etc/syslogd.conf,增加如下一行: kern.* /var/log/kernel_log
这样,lvs的一些调试信息就会写入/var/log/kernel_log文件中.
real server的配置
real server的配置相对简单,主要是是以下几点:
配置te.net和www服务。te.net服务没有需要特别注意的事项,但是对于www服务,需要修改httpd.conf文件,使得apache在虚拟服务器的ip地址上监听,如下所示:
listen 192.168.0.101:80
关闭real server上dummy0的arp请求响应能力。这是必须的,具体原因请参见 arp problem in lvs/tun and lvs/dr(http://www.linuxvirtualserver.org/arp.html)。关闭dummy0的arp响应的方式有多种,比较简单地方法是,修改/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已经启动并且允许te.net。
然后从client运行te.net 192.168.0.101,如果登录后看到如下输出就说明集群已经开始工作了:(假设以guest用户身份登录)
[guest@rs1 guest]$-----------说明已经登录到服务器rs1上。
再开启一个te.net窗口,登录后会发现系统提示变为:
[guest@rs2 guest]$-----------说明已经登录到服务器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:te.net rr
-> rs2:te.net route 1 1 0
-> rs1:te.net route 1 1 0
tcp 192.168.0.101:www rr
-> rs2:www route 1 0 0
-> rs1:www route 1 0 0
至此已经验证te.net的lvs正常。
然后测试一下www是否正常:用你的浏览器查看http://192.168.0.101/是否有什么变化?为了更明确的区别响应来自那个real server,可以在rs1,rs2上面分别放置如下的测试页面(test.html):
我是real server #1 or #2
然后刷新几次页面(http://192.168.0.101/test.html),如果你看到“我是real server #1”和“我是real server #2”交替出现,说明www的lvs系统已经正常工作了。
但是由于inte.net explore 或.netscape本身的缓存机制,你也许总是只能看到其中的一个。不过通过ipvsadm还是可以看出,页面请求已经分配到两个real server上了,如下所示:
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:te.net rr
-> rs2:te.net route 1 0 0
-> rs1:te.net 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
这样,每隔1秒钟“我是realserver #1”和“我是realserver #2”就交替出现一次,清楚地表明响应分别来自两个不同的real server。
五 调试技巧
如果您的运气不好,在配置lvs的过程中也许会遇到一些困难,下面的技巧或许有帮助:
首先确定网络硬件没有问题,尤其是网线,ping工具就足够了。
使.netstat查看端口的活动情况。
使用tcpdump查看数据包的流动情况。
查看/var/log/kernel_log文件。
关于作者
宿宝臣(linuxman@263.net),1992年毕业于山东工程学院电气技术专业,1997年毕业于上海交通大学自动化系,获硕士学位,现供职于山东工程学院。自接触linux后,顿感相见恨晚,一见钟情,一发而不可收拾。现主要研究linux, java及其在web上的应用,尤其熟悉enhydra的体系结构和程序设计,企望有机会和同道者多多交流。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器