集群技术案例介绍和具体操做


集群技术案例介绍和具体操做

1.1 什么是集群
简单的说,集群(cluster)就是一组计算机,它们做为一个总体向用户提
供一组网络资源。这些单个的计算机系统就是集群的节点(node)。一个理想的
集群是,用户历来不会意识到集群系统底层的节点,在他/她们看来,集群是一
个系统,而非多个计算机系统。而且集群系统的管理员能够随意增长和删改集群
系统的节点。

1.2 为何须要集群
集群并非一个全新的概念,其实早在七十年代计算机厂商和研究机构就
开始了对集群系统的研究和开发。因为主要用于科学工程计算,因此这些系统并
不为你们所熟知。直到Linux集群的出现,集群的概念才得以广为传播。
对集群的研究起源于集群系统良好的性能可扩展性(scalability)。提升CPU
主频和总线带宽是最初提供计算机性能的主要手段。可是这一手段对系统性能的
提供是有限的。接着人们经过增长CPU个数和内存容量来提升性能,因而出现了
向量机,对称多处理机(SMP)等。可是当CPU的个数超过某一阈值,象SMP这些
多处理机系统的可扩展性就变的极差。主要瓶颈在于CPU访问内存的带宽并不能
随着CPU个数的增长而有效增加。与SMP相反,集群系统的性能随着CPU个数的
增长几乎是线性变化的。图1显示了这中状况。
图1. 几种计算机系统的可扩展性
对于关键业务,停机一般是灾难性的。由于停机带来的损失也是巨大的。下
面的统计数字列举了不一样类型企业应用系统停机所带来的损失。
中科红旗linux技术支持服务中心---西安站 http://linux.xab.ac.cn
×××西安网络中心 中科红旗linux培训认证中心
应用系统每分钟损失(美圆)
呼叫中心(Call Center) 27000
企业资源计划(ERP)系统13000
供应链管理(SCM)系统11000
电子商务(eCommerce)系统10000
客户服务(Customer Service Center)系统27000
图2:停机给企业带来的损失
随着企业愈来愈依赖于信息技术,因为系统停机而带来的损失也越拉越大。
集群系统的优势并不只在于此。下面列举了集群系统的主要优势:
高可扩展性:如上所述。
高可用性:集群中的一个节点失效,它的任务可传递给其余节点。能够有效防止单点失效。
高性能:负载平衡集群容许系统同时接入更多的用户。
高性价比:能够采用廉价的符合工业标准的硬件构造高性能的系统。

2.1 集群系统的分类
虽然,根据集群系统的不一样特征能够有多种分类方法,可是通常把集群系统分为两类:
(1)、高可用(High Availability)集群,简称HA集群。
这类集群致力于提供高度可靠的服务。就是利用集群系统的容错性对外提供7*24小时不间
断的服务,如高可用的文件服务器、数据库服务等关键应用。
目前已经有在Linux下的高可用集群,如Linux HA项目。
负载均衡集群:使任务能够在集群中尽量平均地分摊不一样的计算机进行处理,充分利
用集群的处理能力,提升对任务的处理效率。
在实际应用中这几种集群类型可能会混合使用,以提供更加高效稳定的服务。如在一个使
用的网络流量负载均衡集群中,就会包含高可用的网络文件系统、高可用的网络服务。
(2)、性能计算(High Perfermance Computing)集群,简称HPC集群,也称为科学计算
集群。
在这种集群上运行的是专门开发的并行应用程序,它能够把一个问题的数据分布到多
台的计算机上,利用这些计算机的共同资源来完成计算任务,从而能够解决单机不能胜任
的工做(如问题规模太大,单机计算速度太慢)。
这类集群致力于提供单个计算机所不能提供的强大的计算能力。如天气预报、石油勘探与油
藏模拟、分子模拟、生物计算等。这些应用一般在并行通信环境MPI、PVM等中开发,因为MPI

比较有名的集群Beowulf就是一种科学计算集群项目。

三、集群系统转发方式和调度算法

3.1转发方式
目前LVS主要有三种请求转发方式和八种调度算法。根据请求转发方式的不一样,所构
架集群的网络拓扑、安装方式、性能表现也各不相同。用LVS主要能够架构三种形式的集群,
分别是LVS/NAT、LVS/TUN和LVS/DR,能够根据须要选择其中一种。
(1)、网络地址转换(LVS/NAT)
中科红旗linux技术支持服务中心---西安站 http://linux.xab.ac.cn
×××西安网络中心 中科红旗linux培训认证中心
(2)、直接路由
(3)、IP隧道

三种转发方式的比较:
3.二、调度算法
在选定转发方式的状况下,采用哪一种调度算法将决定整个负载均衡的性能表现,不一样
的算法适用于不一样的应用场合,有时可能须要针对特殊场合,自行设计调度算法。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的最佳利用性。固然也能够自行开发算法,不过这已超出本文范围,请参考有
关算法原理的资料。

4.一、什么是高可用性
计算机系统的可用性(availability)是经过系统的可靠性(reliability)和可维护性
(maintainability)来度量的。工程上一般用平均无端障时间(MTTF)来度量系统的可靠性,
用平均维修时间(MTTR)来度量系统的可维护性。因而可用性被定义为:
中科红旗linux技术支持服务中心---西安站 http://linux.xab.ac.cn
×××西安网络中心 中科红旗linux培训认证中心
MTTF/(MTTF+MTTR)*100%
业界根据可用性把计算机系统分为以下几类:
可用比例
(Percent
Availability)
年停机时间
(downtime/year
)
可用性分类
99.5 3.7天
常规系统
(Conventional)
99.9 8.8小时可用系统(Available)
99.99 52.6分钟
高可用系统(Highly
Available)
99.999 5.3分钟Fault Resilient
99.9999 32秒Fault Tolerant
为了实现集群系统的高可用性,提升系统的高可性,须要在集群中创建冗余机制。一个功
能全面的集群机构以下图所示

负载均衡服务器的高可用性
为了屏蔽负载均衡服务器的失效,须要创建一个备份机。主服务器和备份机上都运行
High Availability监控程序,经过传送诸如“I am alive”这样的信息来监控对方的运
行情况。当备份机不能在必定的时间内收到这样的信息时,它就接管主服务器的服务IP并
继续提供服务;当备份管理器又从主管理器收到“I am alive”这样的信息是,它就释放
服务IP地址,这样的主管理器就开开始再次进行集群管理的工做了。为在住服务器失效的
状况下系统能正常工做,咱们在主、备份机之间实现负载集群系统配置信息的同步与备份,
保持两者系统的基本一致。
HA的容错备援运做过程
自动侦测(Auto-Detect)阶段 由主机上的软件经过冗余侦测线,经由复杂的监听程序。逻
辑判断,来相互侦测对方运行的状况,所检查的项目有:
主机硬件(CPU和周边)
主机网络
主机操做系统
数据库引擎及其它应用程序
主机与磁盘阵列连线
为确保侦测的正确性,而防止错误的判断,可设定安全侦测时间,包括侦测时间间隔,
侦测次数以调整安全系数,而且由主机的冗余通讯连线,将所聚集的讯息记录下来,以供
维护参考。
自动切换(Auto-Switch)阶段 某一主机若是确认对方故障,则正常主机除继续进行原来的
任务,还将依据各类容错备援模式接管预先设定的备援做业程序,并进行后续的程序及服
务。
自动恢复(Auto-Recovery)阶段 在正常主机代替故障主机工做后,故障主机可离线进行修
复工做。在故障主机修复后,透过冗余通信线与原正常主机连线,自动切换回修复完成的
主机上。整个回复过程完成由EDI-HA自动完成,亦可依据预先配置,选择回复动做为半自
动或不回复。

4.二、HA三种工做方式:
(1)、主从方式 (非对称方式)
工做原理:主机工做,备机处于监控准备情况;当主机宕机时,备机接管主机的一切工做,
待主机恢复正常后,按使用者的设定以自动或手动方式将服务切换到主机上运行,数据的
一致性经过共享存储系统解决。

(2)、双机双工方式(互备互援)
工做原理:两台主机同时运行各自的服务工做且相互监测状况,当任一台主机宕机时,另
一台主机当即接管它的一切工做,保证工做实时,应用服务系统的关键数据存放在共享存
储系统中。
(3)、集群工做方式(多服务器互备方式)
工做原理:多台主机一块儿工做,各自运行一个或几个服务,各为服务定义一个或多个备用
主机,当某个主机故障时,运行在其上的服务就能够被其它主机接管。

相关文档
http://tech.sina.com.cn/it/2004-04-09/1505346805.shtml
http://stonesoup.esd.ornl.gov
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 LVS实现集群系统结构简图
图1显示一台名为Director的机器在集群前端作负载分配工做;后端两台机器称之为
Real Server,专门负责处理Director分配来的外界请求。该集群的核心是前端的Director
机器,LVS就是安装在这台机器上,它必须安装Linux。Real Server则要根据其选用的负
载分配方式而定,一般Real Server上的设置比较少。接下来介绍Director机器上LVS的
安装过程。
安装
LVS的安装主要是在Director机器上进行,Real Server只需针对不一样的转发方式作简单
的设定便可。特别是对LVS的NAT方式,Real Server唯一要作的就是设一下缺省的网关。
因此构架集群的第一步从安装Director机器开始。
首先,要在Director机器上安装一个Linux操做系统。虽然早期的一些Red Hat版本,
如6.二、7.二、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的配置是经过前面所安装的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机器上,Dire
参考资料: http://www.linuxpower.cn/bbs/read.php?tid=630&fpage=1