随着Internet技术的迅猛发展,网络技术、性能的不断提高,高可伸缩性、高可用性、可管理性、价格有效性的网络服务技术将成为网络服务技术的主导。各种平台下的技术方案应运而生。本文试图以一篇完整的理论+实践性的文字来介绍如何在优秀的开源操作系统Linux下创建低成本、高性能、高可用的服务集群系统。文中所使用的系统和软件包均为最新版本。希望通过对本文的阅读能使你对如何创建Linux下的集群系统有所帮助。
随着Internet技术的迅猛发展,网络技术、性能的不断提高,高可伸缩性、高可用性、可管理性、价格有效性的网络服务技术将成为网络服务技术的主导。各种平台下的技术方案应运而生。本文试图以一篇完整的理论+实践性的文字来介绍如何在优秀的开源操作系统Linux下创建低成本、高性能、高可用的服务集群系统。文中所使用的系统和软件包均为最新版本。希望通过对本文的阅读能使你对如何创建Linux下的集群系统有所帮助。
1.Linux下的解决方案
Linux下的集群系统通常可以分为三类:
本文所要介绍的是前两类集群的一个完美的组合。
1.1. Linux Virtual Server项目
在1998年5月,由章文嵩博士成立了Linux Virtual Server的自由软件项目,进行Linux服务器集群的开发工作。同时,Linux Virtual Server项目也是国内最早出现的自由软件项目之一。该项目针对高可伸缩、高可用网络服务的需求,给出了基于IP层和基于内容请求分发的负载平衡调度解决方法,它通过前端一个负载调度器(Load Balancer)无缝地将网络请求调度到真实服务器上,从而使得服务器集群的结构对客户是透明的,客户访问集群系统提供的网络服务就像访问一台高性能、高可用的服务器一样。客户程序不受服务器集群的影响不需作任何修改。系统的伸缩性通过在服务机群中透明地加入和删除一个节点来达到,通过检测节点或服务进程故障和正确地重置系统达到高可用性。并在Linux内核中实现了这些方法,将一组服务器构成一个实现可伸缩的、高可用网络服务的虚拟服务器。
虚拟服务器的体系结构如图2所示。
javascript:window.open(this.src);" style="CURSOR: pointer" onload="return imgzoom(this,550)">
图2:虚拟服务器的结构
1.1.1. LVS的核心软件IPVS
在调度器的实现技术中,IP负载均衡技术是效率最高的。在已有的IP负载均衡技术中有通过网络地址转换(Network Address Translation)VS/NAT技术的基础上,IPVS软件实现了三种IP负载均衡技术:
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调度器实现了如下十种负载调度算法:
其中9-10是最新1.09版IPVS软件包中新增的调度算法,这十种调度算法将会在后面的ipvsadm配置文件中用到,通常用英文单词的第一个字母的缩写来表示。例如:轮叫(Round Robin)表示为rr。
三种IP负载均衡技术的优缺点比较
VS/NAT | |||
服务器(OS) | 任意 | 支持隧道 | 多数(支持Non-arp ) |
服务器网络 | 私有网络 | 局域网 | 局域网 |
服务器数目(100M网络) | 10~20 | 100 | 多(100) |
服务器网关 | 负载均衡器 | 自己的路由 | 自己的路由 |
效率 | 一般 | 高 | 最高 |
三种IP负载均衡技术中特别是后两种技术VS/TUN,VS/DR极大地提高系统的伸缩性,它们的相关技术原理不是本文讨论的重点,若需了解详细内容,请参看章文嵩博士的相关撰文。
图1
图2
图3
1.2. High Availability of LVS
较为成熟的方案有mon+heartbeat+fake+coda 和ldirectord+heartbeat 方案,本文我们采用的是ldirectord+heartbeat 方案。
1.2.1. Heartbeat
Linux-HA 项目开始于 1998 年,是 Linux-HA HOWTO(Haranld Milz 著)的产物。该项目目前由 Alan Robertson 领导,许多其他代码提供者也参与其中。1.0.3版本是2003年6月发布的最新稳定版本。
Heartbeat 通过通信介质(通常是串行设备和以太网)监控节点的"健康"状况。最好有多个冗余介质,以便我们既可以使用串行线又可以使用以太网链接。每个节点运行一个守护程序进程(称为"心跳")。主守护程序派生出读和写每个心跳介质的子进程,以及状态进程。当检测到某个节点发生故障时,Heartbeat 运行 shell 脚本来启动(或停止)辅助节点上的服务。按照设计,这些脚本使用与系统 init 脚本(通常位于 /etc/init.d 中)相同的语法。缺省脚本是为文件系统、Web 服务器和虚拟 IP 故障转移提供的。
1.2.2. Ldirectord
"ldirectord"(Linux Director Daemon)是Jacob Rief编程实现的一个独立进程,以实现对服务和物理服务器的监测,广泛地用于http和https等服务, Ldirectord与mon相比,优点如下:
1.2.3. ldirectord+heartbeat的绝妙组合
ldirectord+heartbeat方案前端负载调度器采用双机热备份方式,双机均安装双网卡,一个网卡用于连接集群系统,另一个作为冗余心跳线路连接双机。采用串口线 + 以太网口做为冗余心跳线路,以确保双机热备份的可靠性,消除由于主负载调度器或心跳线故障带来的集群单点故障。
在主负载调度器及备份负载调度器同时安装ldirectord及heartbeat,并同时运行Heartbeat,相互监视"健康"状况,一旦备份负载调度器监测到主负载调度器发生故障,备份服务器通过运行shell脚本来启动备份调度器上服务来完成虚拟 IP 故障转移,通过ipvsadm启动LVS及ldirectord,完成负载调度器的整体接管。一旦主负载调度器恢复正常工作,备份负载将通过脚本停掉备份负载调度器上的LVS及ldirectord,同时完成虚拟 IP 故障转移,主负载调度器重新恢复接管LVS及ldirectord监控服务。这样负载调度器就完成了一个标准的接管及恢复过程。
该方案结构清晰明了,安装简便,并且ldirectord是专门为LVS所开发,针对性强,无缝衔接,配合默契,堪称绝妙组合。
2. LVS在Red Hat 9.0上的具体实现
2.1. 实现目标:
实现以常用、效率最高的LVS-DR IP负载技术为基础,以高可用性(HA)+ 高性能 + 高性能/价格比 + 高可伸缩性为最终目的。负载均衡器采用HA技术构架,采用Heartbeat软件包,heartbeat采用串口、网络口冗余线路,保证24X7不间断运行。结构如图:
Setup LVS using LVS-DR forwarding
|
2.2. 设备要求:
因为负载均衡器和真实服务器节点均有软硬件冗余保障,所以硬件设备可以根据具体资金情况及提供服务规模而定。当然最好采用支持RAID,SCSI,内存ECC校验,热插拔等技术的专用服务器,以提供稳定高效的服务。对于非关键业务服务,也可以考虑采用最新支持IDE RAID(0,1,0+1,1.5,5)的服务器,可以获得一个良好的性能/价格比。当然,如果你是一个对硬件技术细节非常熟悉,说话又有分量,对自己非常有信心,敢冒风险,崇尚节约、实用性的人,那么DIY一组高性价比的服务器集群,也是一件非常有意义而且充满乐趣的工作。
2.3.原始软件环境:
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来构造我们的集群系统。
2.4.需下载软件包:
# Linux kernel
http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.20.tar.gz
# ipvs patch
http://www.linuxvirtualserver.org/software/kernel-2.4/linux-2.4.20-ipvs-1.0.9.patch.gz
# ipvs tar ball
http://www.linuxvirtualserver.org/software/kernel-2.4/ipvs-1.0.9.tar.gz
# hidden patch(已经包括在ipvs-1.0.9.tar.gz,可不用下载)
http://www.ssi.bg/~ja/hidden-2.4.20pre10-1.diff (解决arp 问题 for LVS-DR/LVS-Tun)
# ipvsadm (已包含在ipvs-1.0.9.tar.gz包中, 可不用下载)
# Ldirectord
http://www.linux-ha.org/download/heartbeat-ldirectord-1.0.3-1.i386.rpm
# heartbeat
http://www.linux-ha.org/download/heartbeat-1.0.3.tar.gz
http://www.linux-ha.org/download/heartbeat-1.0.3-1.src.rpm
http://www.linux-ha.org/download/heartbeat-1.0.3-1.i386.rpm
http://www.linux-ha.org/download/heartbeat-pils-1.0.3-1.i386.rpm
http://www.linux-ha.org/download/heartbeat-stonith-1.0.3-1.i386.rpm
2.5. 安装要求:
2.5.1 Director:
2.5.2 RealServes: (在LVS-NAT方式下,不需要打任何补丁)
内核打arp的补丁hidden-2.4.20pre10-1.diff (arp problem for LVS-DR/LVS-Tun)编译新内核。
如果你不知道你的内核源代码是否已经预打过ipvs的补丁, 可以询问你的Linux发行版的制造商或查看相关ipvs 文件,文件名类似于 /usr/src/linux-2.4/net/ipv4/ip_vs_*.c。
2.6. 安装步骤:
2.6.1 Director或RealServer上内核的安装:
|
相关网络内核选项:
相关LVS内核选项:
|
如果要安装该内核在其它机器上:
|
2.6.2 Director上ipvsadm 的安装:
用打过ipvs和hidden(for LVS-DR/LVS-Tun)补丁的新内核启动linux
|
检查ipvsadm 探测到内核的ipvs的补丁可以运行
|
如果成功你会看到类似于如下内容:
|
说明安装成功
运行lsmod | grep ip_vs 可以看到ip_vs模块已经被插入内核运行。
2.6.3. 运行脚本( Run Scripts )
以下以最常用的LVS-DR模式来介绍相关的脚本设置
( 以Telnet服务, 轮叫(rr)策略为例 )
2.6.3.1 Director上:
|
该段运行脚本对于熟悉Linux网络配置的读者来说应该很容易理解。由于LVS是通过对标准内核打补丁,在内核级提供支持,所以在LVS-DR模式下,首先是进行内核的相关设置。要关闭标准内核下的ip_forward转发方式,即置为0。同时因为LVS-DR模式下,集群的网关是外部网关,而不是负载均衡器。所以要打开icmp包的重定向设置send_redirects 置为1。接着就是绑定集群的虚拟服务器的IP地址,并添加一条到该IP地址的主机路由。然后对该虚拟IP做一些必要的自我检测,同时列出路由表。最后是有关ipvasdm的设置,首先清空ipvasdm表,然后添加需要提供负载均衡的服务及调度策略,这里例举的是telnet服务,也可以直接使用端口号,调度策略为轮叫(rr)策略。最后添加转发到真实服务器的直接路由,如果有多台RealServer或需要提供多种服务的负载均衡,依次添加。再做一些到RealServer的网络测试(也可不要),最后显示ipvasdm所有的设置信息。
注意:
ipvs-1.0.9.tar.gz中包含的ipvsadm是1.21版,安装后在/etc/rc.d/init.d/目录下自动生成了标准的init服务脚本,如果你的Director没有安装备份服务器,你可以通过服务管理工具让它在相应的运行级里自动运行,如果Director是HA系统,则由heartbeat控制运行。
另外该服务脚本提供了配置保存功能。配置文件为:/etc/sysconfig/ipvsadm 你必须手工建立。然后在其中输入规则和策略:
例如:
|
然后存盘。
或直接运行:
|
然后运行:/etc/rc.d/init.d/ipvsadm save
就可以保存当前配置到/etc/sysconfig/ipvsadm文件中。
在具有HA系统的Director上,ipvsadm可以方便地被Heartbeat管理-启动、停止。Director上的VIP(虚拟)服务器地址由Heartbeat负责设置和切换。
做法如下:
在Heartbeat的配置文件haresources中加类似入如下一行:
linuxha1 IPaddr::192.168.7.110/24/192.168.7.255 ipvsadm ldirectord::www ldirectord::mail
2.6.3.2. RealServers上:
|
该段脚本和上面的脚本比较类似,相信不用再多做介绍了。需要注意的是:LVS-DR模式下,缺省网关的设置。集群的网关是外部网关,而不是负载均衡器。还有就是RealServer上绑定的VIP地址的设备lo:0。另外不要忘了开启not arp补丁的设置开关。相信你已经很清楚了。
你也可以把以上脚本改写成符合init语法的标准脚本,放到/etc/rc.d/init.d/下面运行,或直接加到/etc/init.d/rc.local下运行。
改写为标准init语法脚本如下:
|
然后:
cp rc.lvs /etc/rc.d/init.d/hiddend
chmod 755 /etc/rc.d/init/d/hiddend
chkconfig - -add hiddend
2.6.4. Ldirectord的安装:
一些文章介绍在ipvs-x.x.x.tar.gz中已包含了Ldirectord,估计该作者并没有进入到相关目录中去仔细查看,该目录中只有一个README文件,告诉你在哪里可以找到Ldirecrtord的代码。总之我在ipvs-1.0.9.tar.gz中是没有看到Ldirectord源代码。其实它的源代码是包含在heartbeat-1.0.3.tar.gz中的。所以请到这里下载相关代码:http://www.linux-ha.org/download/
在安装时可能会遇到依赖性的错误,可以用--nodeps参数进行安装。总之把它提示所需要的rpm包(在dependancies目录下)全部装上。在dependancies目录下其它一些其它rpm包,如果不用相关功能可以不装。
源代码安装:
|
rpm安装:
|
为了简化安装步骤,我安装的是Ldirectord for Red Hat 9的rpm包,RedHat和Debian版本的从这里下载:http://www.ultramonkey.org/download/heartbeat/
注意:
/usr/share/doc/heartbeat-ldirectord-1.0.3/ldirectord.cf文件是Ldirectord的配置文件的范例。拷贝该文件到/etc/ha.d/目录下,修改其内容,并另存为xxx.cf(例如:www.cf,mail.cf),以便在Heartbeat的配置文件haresources中使用。
范例:www.cf(http服务)
|
然后你必须在每台真实服务器节点的www的根目录上生成以Test Page为内容的.testpage文件。在每台真实服务器节点的www的根目录上执行命令:echo "Test Page" > .testpage
2.6.5. 配置 Heartbeat
需要配置的有三个文件:ha.cf haresources(在每个节点必须相同) Authkeys,应该将它们放置在/etc/ha.d目录下。范例配置在/usr/shared/doc/heartbeat-1.0.3目录下,你可以修改后拷贝到/etc/ha.d目录下。
2.6.5.1. 配置ha.cf
这个配置文件告诉heartbeat 使用的是什么介质和如何配置它们。ha.cf 包含你将到的所有的选项,内容如下:
serial /dev/ttyS0
使用串口heartbeat - 如果你不使用串口heartbeat, 你必须选择其它的介质,比如以太网bcast (ethernet) heartbeat。如果你使用其它串口heartbeat,修改/dev/ttyS0 为其它的串口设备。
watchdog /dev/watchdog
可选项:watchdog功能提供了一种方法能让系统在出现故障无法提供"heartbeat"时,仍然具有最小的功能,能在出现故障1分钟后重启该机器。这个功能可以帮助服务器在确实停止心跳后能够重新恢复心跳。如果你想使用该特性,你必须在内核中装入"softdog" 内核模块用来生成实际的设备文件。想要达到这个目的, 首先输入 "insmod softdog" 加载模块。然后,输入"grep misc /proc/devices" 注意显示的数字 (should be 10). 然后, 输入"cat /proc/misc | grep watchdog" 注意输出显示出的数字(should be 130)。现在你可以生成设备文件使用如下命令:"mknod /dev/watchdog c 10 130" 。
bcast eth1
指定使用的广播heartbeat 的网络接口eth1(修改为eth0, eth2, 或你所使用的接口)
keepalive 2
设置心跳间隔时间为2两秒。
warntime 10
在日志中发出最后心跳"late heartbeat" 前的警告时间设定。
deadtime 30
在30秒后明确该节点的死亡。
initdead 120
在一些配置中,节点重启后需要花一些时间启动网络。这个时间与"deadtime"不同,要单独对待。 至少是标准死亡时间的两倍。
hopfudge 1
可选项: 用于环状拓扑结构,在集群中总共跳跃节点的数量。
baud 19200
串口波特率的设定(bps).
udpport 694
bcast和ucast通讯使用的端口号694 。这是缺省值,官方IANA 使用标准端口号。
nice_failback on
可选项:对那些熟悉Tru64 Unix, 心跳活动就像是"favored member"模式。主节点获取所有资源直到它宕机,同时备份节点启用。一旦主节点重新开始工作, 它将从备份节点重新获取所有资源。这个选项用来防止主节点失效后重新又获得集群资源。
node linuxha1.linux-ha.org
强制选项:通过`uname -n`命令显示出的集群中的机器名。
node linuxha2.linux-ha.org
强制选项:通过`uname -n`命令显示出的集群中的机器名。
respawn userid cmd
可选项:列出可以被spawned 和监控的命令。例如:To spawn ccm 后台进程,可以增加如下内容:
respawn hacluster /usr/lib/heartbeat/ccm
通知heartbeat 重新以可信任userid身份运行(在我们的例子中是hacluster) 同时监视该进程的"健康"状况,如果进程死掉,重启它。例如ipfail, 内容如下:
respawn hacluster /usr/lib/heartbeat/ipfail
NOTE: 如果进程以退出代码100死掉, 这个进程将不会respawned。
ping ping1.linux-ha.org ping2.linux-ha.org ....
可选项:指定ping 的节点。 这些节点不是集群中的节点。它们用来检测网络的连接性,以便运行一些像ipfail的模块。
2.6.5.2. 配置 haresources
一旦你配置好了ha.cf文件,下面就需要设置haresources文件,这个文件指定集群所提供的服务以及谁是缺省的主节点。注意,该配置文件在所有节点应该是相同的。
在我们的例子中,我们的HA集群提供的是负载均衡服务(LVS)和服务监控服务(Ldirectord)。这里集群的IP(虚拟)地址是必须配置的,不要在haresources文件以外的地方配置该IP地址。所以我们应该添加如下一行:
linuxha1 IPaddr::192.168.7.110/24/192.168.7.255 ipvsadm ldirectord::www ldirectord::mail
::前的表示服务脚本名称(IPaddr),你可以在目录/etc/ha.d/resource.d下找到一个脚本名叫 Ipaddr,后面的表示输入的参数。
Heartbeat 会在下面的路径搜索同名的启动脚本:
/etc/ha.d/resource.d
/etc/rc.d/init.d
这里的服务脚本的使用是符合Init标准语法,所以你可以在这里通过Heartbeat方便地运行、停止/etc/rc.d/init.d下标准的服务后台进程。
2.6.5.3. 配置 Authkeys
配置加密认证算法,有三种算法:CRC, md5,sha1。你会问我们应该用哪种呢?
如果你的heartbeat运行在一个安全的网络,例如CAT5交叉线,你可以用CRC,从资源开销上来说,这是最节省开销的。如果网络是不可靠的,而且你也不是一个网络安全痴狂者或者你十分关心CPU资源的最小开销,就用md5,最后如果你关心的是安全而不是CPU资源的开销,那么建议你使用sha1,你将会得到最佳的安全度,很难被黑客所破解。
格式如下:auth <number> <number> <authmethod> [<authkey>]
例: /etc/ha.d/authkeys
使用sha1
auth 1
1 sha1 key-for-sha1-any-text-you-want
使用md5
auth 1
1 sha1 key-for-md5-any-text-you-want
使用CRC
auth 2
2 crc
chmod 600 Authkeys
3.WindowsNT/2K做RealServer
在本文介绍的方案中,正如前面所提到的,集群中的真实节点可以是Linux系统,也可以是WindowsNT/2K或其它支持的系统,在本文例举的VS/DR方式下,支持WindowsNT/2K做为RealServer,提是你必须安装了MS Lookback Adapter。如果你没有在NT/2K上安装MS Lookback Adapter Driver,你可以选择添加新硬件,添加网络适配器,选择Microsoft,选择Lookback Adapter. 你可能会需要NT的安装盘。然后添加VIP (Virtual IP) 地址在 MS Loopback Adapter上, 不要输入网关gateway IP地址。子网掩码 255.255.255.255 在MS NT/2K会被认为是无效的。你有两种解决方法:
你先接受缺省的netmask, 然后进入MS-DOS 提示符,删除外部路由
c: route delete <VIP's network> <VIP's netmask>
这将改变包的发送方向到其它的网络界面,而不是MS Loopback interface. 因此在这里设置网络掩码为255.0.0.0 同样可以工作。
可以通过修改注册表设置子网掩码为255.255.255.255, 这在我的DR系统中工作良好。而且这比每次启动时删除外部路由的方法要方便的多。
在Windows 2000,中 网络界面(interfaces)在:
HKEY_LOCAL_MACHINESystemCurrentControlSetServicesTcpipParametersInterfaces
找到适当的网络界面IP地址,修改它的子网掩码,(注意修改方式)不需要重启,只需重新激活该网络界面即可。
本人强烈建议您使用第二种方法,这将带来极大的方便。
4.启动和测试
4.1. 启动:
|
如果你安装的是rpm的版本,该连接已经被建立,就不需要手工建立以上连接了。
注意:
如果你使用watchdog 功能,你必须在启动的时候装入该模块。你可以在 /etc/rc.d/rc.sysinit 文件中加如一句:
/sbin/insmod softdog
4.2. 测试:
测试分为三部分测试
1)HA负载调度器测试
可以用telnet服务来验证HA负载调度器是否正常工作,方法:
修改haresources为:linuxha1.linux-ha.org IPaddr::192.168.7.110/24/192.168.7.255 telnet
在客户机上telnet到192.168.7.110上,你将会看到linuxha1,然后宕掉linuxha1, 再telnet到192.168.7.110上,你将会看到linuxha2,说明HA工作正常。中间间隔时间10秒左右。如果超过30秒仍无法正常工作,说明有问题存在。在测试中要保证至少有一条心跳线连接良好,否则重新连上心跳线后会引起资源上的混乱。
2)HA+LVS测试
如果HA负载调度器可以正常工作,那么就可以进行HA+LVS测试,方法类似:
修改haresources为:
linuxha1.linux-ha.org IPaddr::192.168.7.110/24/192.168.7.255 ipvsadm
设置ipvsadm中相关http的规则。
在RealServers上打开httpd服务。然后在不同的RealServer www首页上以内容区分开来。然后在客户机上进行测试,客户机上的浏览器由于缓冲的缘故,你可能需要刷新几次。
再做宕机测试。看备份Director能否正常接管,并且使RealServers继续提供服务。
3)HA+LVS+Ldirectord测试
方法类似。修改haresources为:
linuxha1 IPaddr::192.168.7.110/24/192.168.7.255 ipvsadm ldirectord::www
加入ldirectord服务监控进程。宕掉部分RealServers上的服务,进行测试。你可以通过运行ipvsadm查看ipvs的路由表来确定宕掉服务的RealServer的相关该服务路由信息是否被更改。
如果以上测试都能正常通过,恭喜你,你的心血没有白费。你将会得到一个高可用、高性能、高可伸缩性的服务集群。
结束语
到此,本文已接近尾声,希望通过对本文的阅读,能够让你了解什么是Linux下的集群技术,更重要的是让你知道如何一步步地亲自去构建Linux下的集群。锻炼你理论与实际相结合工作的能力,能给你带来工作中的乐趣与收获。同时希望能与大家一起交流Linux下的相关技术,互相促进,相互提高。
参考文献