通常,第一种涉及为群集开发并行编程应用程序,以解决复杂的科学问题。这是并行计算的基础,尽管它不使用专门的并行超级计算机,这种超级计算机内部由十至上万个独立处理器组成。但它却使用商业系统,如通过高速连接来链接的一组单处理器或双处理器 PC,并且在公共消息传递层上进行通信以运行并行应用程序。因此,您会常常听说又有一种便宜的 Linux 超级计算机问世了。但它实际是一个计算机群集,其处理能力与真的超级计算机相等,通常一套象样的群集配置开销要超过 $100,000。这对一般人来说似乎是太贵了,但与价值上百万美元的专用超级计算机相比还算是便宜的。
当谈到 Linux 集群时,许多人的第一反映是 Beowulf。那是最著名的 Linux 科学软件集群系统。没有一个包叫做 Beowulf。实际上,它是一个术语,适用于在 Linux 内核上运行的一组公共软件工具。其中包括流行的软件消息传递 API,如“消息传送接口”(MPI) 或“并行虚拟机”(PVM),对 Linux 内核的修改,以允许结合几个以太网接口、高性能网络驱动器,对虚拟内存管理器的更改,以及分布式进程间通信 (DIPC) 服务。公共全局进程标识空间允许使用 DIPC 机制从任何节点访问任何进程。Beowulf 还在节点间支持一系列硬件连通性选件。
Legion 提供了高性能并行、负载均衡、分布式数据管理和容错性。它通过其容错管理和成员节点间的动态重新配置来支持高可用性。它还有一个可扩充核心,该核心可以在 出现新的改进和进展时动态替换或升级。系统并不是只接受单一控制,而是可以由任意数量的组织管理,而每个组织都支持整体的自治部分。Legion API 通过其内置的并行性提供了高性能计算。
Legion 需要使用特别编写的软件,以使它可以使用其 API 库。它位于用户计算机操作系统之上,协调本地资源和分布式资源。它自动处理资源调度和安全性,还管理上下文空间以描述和访问整个系统中上亿种可能之外的对象。然而,在每个节点上运行时,不需要使用系统管理员特权,并且可以使用无特权的用户帐号进行工作。这将增加加入 Legion 的节点和用户的灵活性。
网络流量负载均衡是一个过程,它检查到某个群集的入网流量,然后将流量分发到各个节点以进行适当处理。它最适合大型网络应用程序,如 Web 或 FTP 服务器。负载均衡网络应用服务要求群集软件检查每个节点的当前负载,并确定哪些节点可以接受新的作业。这最适合运行如数据分析等串行和批处理作业。那些系统还可以配置成关注某特定节点的硬件或操作系统功能:这样,群集中的节点就没有必要是一致的。
“Linux 虚拟服务器”项目已经实现了许多内核补丁,它们为入网 TCP/IP 流量创建了负载均衡系统。LVS 软件检查入网流量,然后根据负载均衡算法,将流量重定向到一组充当群集的服务器。这允许网络应用程序,如 Web 服务器,在节点群集上运行以支持大量用户。
LVS 支持作为负载均衡服务器直接连接到同一个 LAN 的群集节点,但它还能够以通道传送 IP 包的方式连接到远程服务器。后一种方法包括压缩 IP 包中的均衡请求,这些 IP 信息包从负载均衡服务器直接发送到远程群集节点。尽管 LVS 可以远程支持网站的负载均衡,但它使用的负载均衡算法现在对于虚拟群集中的广域 Web 服务器仍无效。因此,如果 Web 服务器都在同一个 LAN 中,LVS 最好当作负载均衡服务器使用。
Resonate 有一种基于软件的负载均衡方法,类似于 Linux 虚拟服务器。但是,它支持更多特性,以及一些更好的负载均衡算法。例如,使用 Resonate,可以在每个群集节点装入一个代理,以确定该节点当前的系统负载。然后,负载均衡服务器检查每个节点的代理,以确定哪个节点的负载最少,并且将新的流量发送给它。另外,Resonate 还可以使用它的 Global Dispatch 产品更有效地支持地区性分布式服务器。
Resonate 已经在 Red Hat Linux 上彻底测试了该软件,相信它也可以在其它发行版上运行。Resonate 的软件还可以在其它各种平台上运行,包括 Solaris、AIX、Windows NT,并且它还可以在混合环境中进行负载均衡。
MOSIX 使用 Linux 内核新版本来实现进程负载均衡集群系统。该群集中,任何服务器或工作站可以按指定加入或离开,即添加到群集的总处理能力,或从中除去。根据其文档,MOSIX 使用自适应进程负载均衡和内存引导算法使整体性能最大化。应用程序进程可以在节点之间抢先迁移,以利用最好的资源,这类似于对称多处理器系统可以在各个处理器之间切换应用程序。
MOSIX 的不利之处是它更改 Linux 内核行为的一些核心部分,于是系统级应用程序将不会按期望运行。
除了高性能科学计算,MOSIX 提供了一个有趣的选项,用于以共同设置创建集群环境。通过使用服务器和工作站上的闲置资源,它可以更快更有效地创建和运行应用程序。由于访问了多台服务器,并且可以动态调整群集大小和更改负载均衡规则,它还可以提供高度的服务器可用性。MOSIX 的不利之处是它更改 Linux 内核行为的一些核心部分,于是系统级应用程序将不会按期望运行。要使用网络应用程序时,而该程序使用基于单个服务器地址的套接字连接,MOSIX 通常也会受到限制。这意味着网络应用程序在一个服务器节点上开始运行时,如果 IP 地址与套接字绑定,那么它必须继续在该节点上运行。显然,MOSIX 还正在开始迁移套接字,因此这很快就变成了争论的焦点。
某 些 HA 群集也可以维护节点间冗余应用程序。因此,用户的应用程序将继续运行,即使他或她使用的节点出了故障。正在运行的应用程序会在几秒之内迁移到另一个节点, 而所有用户只会察觉到响应稍微慢了一点。但是,这种应用程序级冗余要求将软件设计成具有群集意识的,并且知道节点失败时应该做什么。但对于 Linux,大多数现在还做不到。因为 Linux 系统没有 HA 集群标准,并且也没有公共 API 可供应用程序开发者构建有群集意识的软件。
HA 群集可以执行负载均衡,但通常主服务器运行作业,而系统使辅助服务器保持闲置。辅助服务器通常是主服务器操作系统设置的镜像,尽管硬件本身稍有不同。辅助 节点对主服务器进行活动监控或心跳观察,以查看它是否仍在运行。如果心跳计时器没有接收到主服务器的响应,则辅助节点将接管网络和系统身份(如果是 Linux 系统,则是 IP 主机名和地址)。
高可用性 Linux 项目,根据其目标声明,旨在为 Linux 提供高可用性解决方案,以通过社区开发成果提高可靠性、可用性和服务能力。Linux 达到高可用性集群时,这是一种试图给予 Linux 与先进的 Unix 系统,如 Solaris、AIX 和 HP/UX,一样具有竞争力的特性。因此,项目的目标是在 2001 年之前达到 Unix 集群比较报告 ( http://www.sun.com/clusters/dh.brown.pdf) 中分析专家组 D. H. Brown 特定功能性级别。
项目中有可以维护节点间心跳并接管失败节点的 IP 地址的软件。如果一个节点失败,它使用“伪造冗余 IP”软件包将失败节点的地址添加到工作节点以承担它的职责。于是,可以在几毫秒时间内自动替换失败的节点。实际使用中,心跳通常在几秒范围内,除非在节点之间有专用网络链接。因此,失败系统中的用户应用程序仍需要在新的节点上重新启动。
对于 Linux,有许多集群系统可供选用。同时,那些项目中有几个是非商业性的,甚至是实验性质的。虽然对学术界和某些组织这也没有形成问题,但大公司通常首选著名供应商的商业支持平台。供应商,如 IBM、SGI、HP 和 Sun,提供了用于在 Linux 中构建科学群集的产品和服务,因为群集很流行,并且可以销售大量的服务器设备。一旦商业机构认为其它形式的集群是可靠的,那些相同的服务器供应商或许会围绕着开放源码集群解决方案创建自己的产品。
Linux 作为服务器平台的重要性依赖于支持大型服务器和服务器群集的能力。这就使它可以与 Sun、HP、IBM 和其它公司的 UNIX 服务器在更高层面上竞争。虽然 Windows NT 和 2000 不支持 Linux 能够支持的集群范围,但是 HA 集群正规方法的可用性以及用于构建有群集意识的 API 也使它能够参与竞争。
如果正在考虑构建一个群集,那么您应当仔细检查那些可能性,并将它们与您的需求做比较。您也许会发现想要实现的目标还不能成为一个完整的解决方案,或许会发现已经有了现成的解决方案。不管是哪种情况,请相信许多现有公司将他们的应用程序托付给进行深度计算并提供大量网页的 Linux 系统群集。集群是一种企业系统服务,已经在 Linux 下成功测试过。尽管新的集群将出现,但选择的多样性正是 Linux 超过其它系统,如 Windows NT,的优势。
1)Virtual Server via Network Address Translation(VS/NAT) 网络地址转换 (如图1) 2)Virtual Server via IP Tunneling(VS/TUN) 隧道技术 (如图2) 3)Virtual Server via Direct Routing(VS/DR) 直接路由 (如图3)
针对不同的网络服务需求和服务器配置,IPVS调度器实现了如下十种负载调度算法:
轮叫(Round Robin)
加权轮叫(Weighted Round Robin)
最少链接(Least Connections)
加权最少链接(Weighted Least Connections)
基于局部性的最少链接(Locality-Based Least Connections)
带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)
在主负载 调度器及备份负载调度器同时安装ldirectord及heartbeat,并同时运行Heartbeat,相互监视"健康"状况,一旦备份负载调度器监 测到主负载调度器发生故障,备份服务器通过运行shell脚本来启动备份调度器上服务来完成虚拟 IP 故障转移,通过ipvsadm启动LVS及ldirectord,完成负载调度器的整体接管。一旦主负载调度器恢复正常工作,备份负载将通过脚本停掉备份 负载调度器上的LVS及ldirectord,同时完成虚拟 IP 故障转移,主负载调度器重新恢复接管LVS及ldirectord监控服务。这样负载调度器就完成了一个标准的接管及恢复过程。
Red Hat 9.0 完全安装 Red Hat 9.0 (kernel-2.4.20-8 ) gcc -3.2.2-5
如 果你使用的是Red Hat 8 ,那么你很幸运。Red Hat 8 (kernel-2.4.18-14)已经预先打了ipvs的补丁,在预安装的内核中已将ipvs编译成模块,可以通过检查 /lib/modules/2.4.18-14/kernel/net/ipv4/ipvs 是否存在来判断。可以直接安装ipvsadm。从Red Hat 9 (kernel-2.4.20-8),Red Hat 取消了ipvs的补丁及预编译ipvs为模块的内核,且Red Hat 9 自带的kernel-2.4.20-8的内核无法通过ipvs补丁linux-2.4.20-ipvs-1.0.9 .patch.gz的编译,至少在我的两台P4的机器上都没有通过编译。标准内核linux-2.4.20.tar.gz则可以通过编译。所以我们将采用 www.kernel.org上的标准内核kernel-2.4.20.tar.gz来构造我们的集群系统。
内 核打non-arp的补丁hidden-2.4.20pre10-1.diff (解决arp problem for LVS-DR/LVS-Tun,虽然在Directors上运行时并不需要,但硬件环境如果和Realserver类似,内核可以直接放到 RealServer上运行,不用再为realServer重新编译内核,当然也可不打该补丁。)
export D=/tmp/download mkdir $D cd $D wget http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.20.tar.gz wget http://www.linuxvirtualserver.org/software/kernel-2.4/linux-2.4.20-ipvs-1.0.9 .patch.gz wget http://www.linuxvirtualserver.org/software/kernel-2.4/ipvs-1.0.9.tar.gz tar zxvf linux-2.4.20.tar.gz tar zxvf ipvs-1.0.9.tar.gz gunzip linux-2.4.20-ipvs-1.0.9.patch.gz mv linux-2.4.20 /usr/src/linux-2.4.20 cd /usr/src rm -f linux-2.4 ln -s linux-2.4.20 linux-2.4 cd linux-2.4 patch -p1 < $D/ipvs-1.0.9/contrib/patches/hidden-2.4.20pre10-1.diff (arp for LVS-DR/LVS-Tun) patch -p1 < $D/linux-2.4.20-ipvs-1.0.9.patch (仅在编译Director内核时打补丁) make mrproper cp /boot/config-2.4.20-8 .config (使用Red Hat 9自带的config内核配置文件或使用/usr/src/linux-2.4.7-10/configs下的配置文件) make menuconfig(参照相关ipvs及内核配置) 或在图形界面运行: make xconfig
相关网络内核选项:
相关LVS内核选项:
make dep make clean make bzImage make modules make modules_install cp arch/i386/boot/bzImage /boot/ vmlinuz-2.4.20-lvs (rs) cp System.map /boot/System.map.2.4.20-lvs (rs) cp vmlinux /boot/vmlinux-2.4.20-lvs (rs) cd /boot rm -f System map ln -s System.map.2.4.20-lvs (rs) System.map vi /boot/grub/grub.conf: title 2.4.20-lvs root (hd0,0) kernel /boot/vmlinuz-2.4.20-lvs (rs) ro root=/dev/xxx
如果要安装该内核在其它机器上:
tar czf linux-2.4.20-dir.tgz /usr/src/linux-2.4.20/ 在其它机器上解压tar zxvf linux-2.4.20-dir.tgz 放置到/usr/src rm -f linux-2.4 ln -s linux-2.4.20 linux-2.4 cd linux-2.4 make modules_install cp arch/i386/boot/bzImage /boot/ vmlinuz-2.4.20-lvs (rs) cp System.map /boot/System.map.2.4.20-lvs (rs) cd /boot rm -f System map ln -s System.map.2.4.20-lvs (rs) System.map vi /boot/grub/grub.conf: title 2.4.20-lvs root (hd0,0) kernel /boot/vmlinuz-2.4.20-lvs (rs) ro root=/dev/xxx
2.6.2 Director上ipvsadm 的安装:
用打过ipvs和hidden(for LVS-DR/LVS-Tun)补丁的新内核启动linux
cd / tmp/download/ipvs-1.0.9/ipvs/ipvsadm make install
检查ipvsadm 探测到内核的ipvs的补丁可以运行
ipvsadm
如果成功你会看到类似于如下内容:
director: /usr/src# ipvsadm IP Virtual Server version 0.2.7 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
说明安装成功
运行lsmod | grep ip_vs 可以看到ip_vs模块已经被插入内核运行。
2.6.3. 运行脚本( Run Scripts )
以下以最常用的LVS-DR模式来介绍相关的脚本设置
( 以Telnet服务, 轮叫(rr)策略为例 )
2.6.3.1 Director上:
#!/bin/bash #---------------mini-rc.lvs_dr-director------------------------ #set ip_forward OFF for vs-dr director (1 on, 0 off) cat /proc/sys/net/ipv4/ip_forward echo 0 >/proc/sys/net/ipv4/ip_forward #director is not gw for realservers: leave icmp redirects on echo 'setting icmp redirects (1 on, 0 off) ' echo 1 >/proc/sys/net/ipv4/conf/all/send_redirects cat /proc/sys/net/ipv4/conf/all/send_redirects echo 1 >/proc/sys/net/ipv4/conf/default/send_redirects cat /proc/sys/net/ipv4/conf/default/send_redirects echo 1 >/proc/sys/net/ipv4/conf/eth0/send_redirects cat /proc/sys/net/ipv4/conf/eth0/send_redirects #add ethernet device and routing for VIP 192.168.7.110 #if use backup director ,pay any attention about bellow /sbin/ifconfig eth0:0 192.168.7.110 broadcast 192.168.7.110 netmask 255.255.255.255 up /sbin/route add -host 192.168.7.110 dev eth0:0 #listing ifconfig info for VIP 192.168.7.110 /sbin/ifconfig eth0:0 #check VIP 192.168.7.110 is reachable from self (director) /bin/ping -c 1 192.168.7.110 #listing routing info for VIP 192.168.7.110 /bin/netstat -rn #setup_ipvsadm_table #clear ipvsadm table /sbin/ipvsadm -C #installing LVS services with ipvsadm #add telnet to VIP with round robin scheduling /sbin/ipvsadm -A -t 192.168.7.110:telnet -s rr #forward telnet to realserver using direct routing with weight 1 /sbin/ipvsadm -a -t 192.168.7.110:telnet -r 192.168.7.11 -g -w 1 #check realserver reachable from director ping -c 1 192.168.7.11 #forward telnet to realserver using direct routing with weight 1 /sbin/ipvsadm -a -t 192.168.7.110:telnet -r 192.168.7.12 -g -w 1 #check realserver reachable from director ping -c 1 192.168.7.12 #displaying ipvsadm settings /sbin/ipvsadm #not installing a default gw for LVS_TYPE vs-dr #---------------mini-rc.lvs_dr-director------------------------