技术开发 频道

集群技术实战:实现负载均衡和HA

【IT168 技术开发】集群(Cluster)技术已经在很多大型项目中得到广泛应用,并且正在成为一种低成本、高效率、成熟的系统级解决方案。

    所谓集群是指由多个独立的计算机节点构成的在网络中表现为单一的为客户工作站提供高可靠性服务的系统。在大型项目中,往往有大量的请求并发,这样就给服务器带来了很大的负载,而建立集群系统的目的就是为了解决负载均衡和高可用性的问题。 

    负载均衡是指大量的并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应的时间。既然服务是在多台节点设备上的运行,那么要屏蔽负载均衡服务器的失效,就要在主备机上都运行High Availability 监控程序,来监控对方的运行状况。通过这种方式,可以实现系统的高可用性,即当备份机不能在一定的时间内收到主服务器的活动信息时,它就接管主服务器的服务IP并继续提供服务。当备份机又从主服务器收到活动信息,它就释放服务IP地址,由主服务器提供服务。 

    通过以上的介绍,相信大家对集群技术及其应用领域已经有了宏观上的了解。下面,我们通过一个实际的案例来讲解如何在实战中建立一个具有高可用性的集群系统。读者可以依据本文介绍的方法进行集群实验,只需要准备两台普通的PC机模拟服务器即可。这里我们在两台PC机上都安装了SuSE Linux操作系统,并以IBM产品(WAS NDIBM HTTP Server,EDGE Component等)作为构建集群的软件支持,实现一个可拓展、高性能,具有高可用性的集群系统。 

    首先,我们来简单介绍一下支持集群系统的各个软件产品。 

    WAS ND: WebSphere Application Server Network Deployment,IBM公司的应用服务器网络部署版。 

    IHS:IBM公司的Web服务器IBM HttpServer的简称,包含在WAD ND介质中。 

    Edge Component:通过LoadBalancer实现负载均衡,并可以通过脚本配置来实现HA。Edge Component实现了对外提供单一IP地址,对内进行负载分发的功能。 

    下面,我们来规划一下整个网络。作为 Web 服务器的两台PC机,每个都需要一个IP 地址。同时,它们又用于做Dispatcher 操作,那么就需要一个共同的用于负载平衡的地址。简单地说,我们需要确定3个IP地址,即两个实际的IP地址和一个提供虚拟服务的IP地址,然后要确保两台PC机能够互通。 

    可以通过ping命令来测试,这里可能需要修改/etc/hosts文件才能保证ping 主机名的时候能够ping通。同时,在hosts文件中添加IP地址和主机名的对应可以保证在添加节点到Dmgr时不会出现“不能根据主机名进行查找”的错误。   

    做好以上的准备工作后,我们就可以进入实战了。在实际的软件部署中,我们采用了Edge Componet和IHS并置的方式,否则可能需要更多的主机来完成集群环境的搭建(这里不再赘述如何安装SuSE Linux操作系统及其网络设置和各个软件产品安装的具体细节,有兴趣的读者可以查阅相关资料)。 

    第一步,我们来建立应用系统集群,这里我们建议按如下的过程来进行。 

    A. 在服务器A和服务器B上分别安装WAS产品的应用服务器、Http Server、Plugins,并打上最新的补丁,可以在IBM的网站得到相关的补丁程序。 

    B.在服务器A上新建一个profile(概要表),选择第一个选项,即创建一个管理概要表,如下:

    C.在服务器A、B上各创建一个profile,选择的环境类型为custom profile(定制概要表)。 

    D.启动Dmgr,将两个custom profile节点添加到Dmgr。这里可以通过命令行方式,使用.addNode.sh命令或者在管理控制台进行添加节点的操作。这里要注意上文提到的修改/etc/hosts文件,否则可能会出现错误。 

    E.然后进入管理控制台创建集群即可,这里我们添加了四个集群成员。 

    以上的每个步骤为我们提供了建立应用系统层面集群的向导,完成以上步骤后,应用系统的集群我们就建立好了,可以通过集群拓扑来查看它的结构。通过下面的图,我们可以看到,在实战中我们有两个节点,即localNode和remoteNode;四个集群成员,即local01、local02、remote01、remote02。这样,最终我们提供给客户一个虚拟服务IP,但实际上将有四个应用服务器来为我们处理客户机的请求,Edge Component的Load Balancer组件正是用来配置这两个节点上的四个应用服务器,从而实现负载均衡,有效提高系统的性能。

    第二步,通过Edge Component来进行负载均衡和HA(High Availability)的配置。这样,就可以实现系统的高性能并且保证系统的高可用性。 

    A.可以使用光盘安装或者使用iso安装,安装时需要打上最新的补丁。这里要注意,补丁的安装很关键,在本次实战中,我们通过介质来安装,在安装时只选择安装产品的lic文件。安装完毕后,把已经安装的包全部卸载掉,使用最新的包来安装,再把lic文件copy回去。 

    B.安装完Edge Component,在任意路径下执行命令“dsserver”启动服务,并执行命令“lbadmin”,进入配置向导。

右键点击【分派器】,选择【连接到主机】, 右键点击【主机】,选择【启动执行程序】, 右键点击【执行程序】,选择【添加集群】, 右键点击【集群】,选择【添加端口】, 右键点击【端口】,选择【添加服务器】。将集群两个节点主机的IP输入。因Edge Component和HTTP Server安装在一台机器上,故需要对集群进行“并置”设置。

C.配置Edge Component和HTTP服务器的并置

在GUI方式下,添加完HTTP服务器后,点击所添加的HTTP服务器,在右边的配置界面页,选择【Collocated (“已配置”)】为yes;或者,通过命令行方式:
dscontrol server set clustername:80:http_name collocated y
clustername集群地址,这是一个虚IP,客户端请求将根据LB的配置被分发到两台服务器中的某一台。

D.在应用服务器上配置loopback

在命令行中分别执行(IP-A,IP-B分别为服务器的IP地址):

ifconfig lo0 alias IP-A netmask 255.255.255.0
ifconfig lo0 alias IP-B netmask 255.255.255.0

 之后重启IHS:

/opt/IBMIHS /bin/apachectl stop /opt/IBMIHS /bin/apachectl start

    然后在浏览器上用集群地址访问,测试是否配置成功。

    E.解除集群地址的配置。因为在HA的环境里,集群地址是要交给LB的脚本自动配置,而不是这样固定配置的。退出服务器A上的LB管理界面,停止LB服务:

dsserver stop

    F.在另一台LB的服务器B上,完全重复以上A-E的所有操作。特别是当LB验证安装配置成功后,一定要按照上一步,取消集群地址的配置。

    G. 可以使用以下脚本在命令行中实现HA的配置,当然,你也可以选择GUI的方式来配置主分发器和副分发器的配置。但是,依旧需要对goActive、goStandby、goInOp和highavailChange四个脚本的配置,这几个脚本在安装目录的/samples下有样本文件(.sample),进行简单修改即可。这里,我们将通过命令行的方式来对主分发器和副分发器进行配置,然后添加四个脚本文件。

    主分发器配置(以下脚本中serverA即为服务器A的IP,serverB即为服务器B的IP):

dscontrol set loglevel 1 dscontrol executor start dscontrol executor set fintimeout 30 dscontrol highavailability heartbeat add serverA serverB dscontrol highavailability backup add primary=serverA auto port dscontrol highavailability reach add netmaskIP dscontrol cluster add clusterIP address clusterIP primaryhost serverA dscontrol cluster set clusterIP proportions 49 50 1 0 dscontrol port add clusterIP 0:80 reset no dscontrol server add clusterIP:80: serverB address serverB dscontrol server set clusterIP:80: serverB weight 12 dscontrol server add clusterIP:80:serverA address serverA dscontrol server set clusterIP:80:serverA collocated y #(并置) dscontrol manager start manager.log 10004 dscontrol advisor start Http clusterIP:80 Http_clusterIP_80.log

副分发器配置:

dscontrol set loglevel 1 dscontrol executor start dscontrol executor set fintimeout 30 dscontrol highavailability heartbeat add serverB serverA dscontrol highavailability backup add backup auto 12345 dscontrol highavailability reach add netmaskIP dscontrol cluster add clusterIP address clusterIP primaryhost serverA dscontrol cluster set clusterIP proportions 49 50 1 0 dscontrol port add clusterIP:80 reset no dscontrol server add clusterIP:80:serverA address serverA dscontrol server set clusterIP:80:serverA weight 12 dscontrol server add clusterIP:80:serverB address serverB dscontrol server set clusterIP:80:serverB collocated y dscontrol manager start manager.log 10004 dscontrol advisor start Http clusterIP:80 Http_clusterIP_80.log


    完成分发器的配置后,我们来添加脚本。在serverA和serverB上的/opt/ibm/edge/lb/servers/bin目录下添加以下四个文件,并使root用户对其具有执行权(脚本中你要将CLUSTER设置为你自己的设定的集群地址):

文件

内容

goActive #!/bin/bash
CLUSTER=192.168.0.30
INTERFACE=eth0:1
NETMASK=255.255.255.0
BCAST=192.168.0.255
# Delete cluster ip on loop back and change sysctl settings
ip addr show lo | grep -q $CLUSTER
if [ $? -eq 0 ]; then
echo "delete $CLUSTER on loop back"
ip addr del $CLUSTER dev lo
fi
sysctl -w net.ipv4.conf.all.arp_ignore=0
sysctl -w net.ipv4.conf.all.arp_announce=0
# Add cluster ip on eth1
echo "Adding device alias"
ifconfig $INTERFACE $CLUSTER netmask $NETMASK broadcast $BCAST up
#!/bin/bash
CLUSTER=192.168.0.30
INTERFACE=eth0:1
# deactive eth0:1 interface
echo "Deleting the device alias(es)"
ifconfig $INTERFACE down
# add loop device alias and setup sysctl conf
ip addr add $CLUSTER/32 scope host dev lo
sysctl -w net.ipv4.conf.all.arp_ignore=3
sysctl -w net.ipv4.conf.all.arp_announce=2
goInOp #!/bin/bash
CLUSTER=192.168.0.30
INTERFACE=eth0:1
# deactive eth0:1 interface
echo "Deleting the device alias(es)"
ifconfig $INTERFACE down
# add loop device alias and setup sysctl conf
ip addr add $CLUSTER/32 scope host dev lo
sysctl -w net.ipv4.conf.all.arp_ignore=3
sysctl -w net.ipv4.conf.all.arp_announce=2
highavailChange #!/bin/bash
DATE=`date`
OUTPUT="$DATE LB just ran $1."
echo $OUTPUT >> /opt/ibm/edge/lb/servers/logs/lb.log
echo $OUTPUT | mail -s "highavailChange" root@localhost
goStandby #!/bin/bash
CLUSTER=192.168.0.30
INTERFACE=eth0:1
# deactive eth0:1 interface
echo "Deleting the device alias(es)"
ifconfig $INTERFACE down
# add loop device alias and setup sysctl conf
ip addr add $CLUSTER/32 scope host dev lo
sysctl -w net.ipv4.conf.all.arp_ignore=3
sysctl -w net.ipv4.conf.all.arp_announce=2
#!/bin/bash
CLUSTER=192.168.0.30
INTERFACE=eth0:1
# deactive eth0:1 interface
echo "Deleting the device alias(es)"
ifconfig $INTERFACE down
# add loop device alias and setup sysctl conf
ip addr add $CLUSTER/32 scope host dev lo
sysctl -w net.ipv4.conf.all.arp_ignore=3
sysctl -w net.ipv4.conf.all.arp_announce=2


    至此,我们的应用系统集群就建立好了,可以使用各种方式来测试一下两台主机的工作情况,比如拔掉主服务器的网线,看服务是不是能自动切换到备机,即通过集群地址是不是能够访问我们部署的应用。正常的工作状态下,你可以通过每台主机的IP或者集群地址来访问部署的应用程序,如果其中一台主机的服务宕掉,你仍旧也可以通过集群地址来访问我们的应用程序。

0
相关文章