随着越来越多的商业应用移动Internet上来时,提供高可用性的服务变得越来越重要。高可用性技术就是一种自动检测服务器节点和服务进程错误、失效,并且当发生这种情况时能够自动适当地重新配置系统,使得集群中的其它节点能够自动承担这些服务,以实现服务不中断。
IBM公司的RS6000系列小型机十分畅销,广为市场所接受的原因,一方面是因为其优秀的整机性能,另一方面就是配套的HACMP方案—IBM高可用性解决方案。可见高可用性在关键应用场合的重要性。
1.基于LVS的HA方案
Linux要进入高端市场就必须在这方面有相应的措施,所以许多公司都这方面加大了研究力度。现在,我们可以使用一些现存的软件去构筑具有高可性的LVS系统。下面列出两种方案,以供参考。
方案一:mon+heartbeat+fake+coda
我们可以使用"mon"、"heartbeat"、"fake"和"coda"四个软件来构筑具用高可用性的Virtual Server。"mon"是一个大众化的资源管理系统,用来监控网络上的服务器节点和网络服务。"heartbeat"实现在两台计
算机间通过在串行线上使用UDP协议传送"心跳信息"。"Fake"是一个使用ARP欺骗的方法来实现IP接管。具
有高可用性的Linux Virtual Server如下图所示:
当服务器故障时,处理过程如下:
"mon"进程运行在负载均衡器上,负责监测整个集群的服务器节点和服务进程。在配置文件"fping.monitor"中写入要检测服务器节点,
然后"mon"进程将会t秒检查一下相应的服务器节点是否还活着。另外相关的服务监视器也要做相应的配置,这样"mon"进程将每m秒检测一下所有节点的
相应服务进程。例如,http.monitor用于配置监控http服务;ftp.monitor用于配置监控ftp服务;以此类推。当配置完成后,某个
服务器节点失效或重新生效、服务进程失效或重新生效时都会发送一个通告信息,因此,负载均衡器能够知道服务器节点是否能接受服务。
现在,负载均衡器成为了整个系统的单点失效。为了防止这一现象,我们必须安装一个负载均衡器的备份服务器。"fake"软件实现当负载均衡器失效
时,备份服务器自动接管IP地址,继续服务。而"heartbeat"则随时根据负载均衡器的状态自动激活/去激活备份服务器上的"fake"进程。在负
载均衡器和备份服务器上都运行着一个"heartbeat"进程,它们通过串行线周期性地发送"I'm alive "消息。如果备份服务器在一个预定时
间内接收不到来自负载均衡器的"I'm alive"信息时,将自动激活"fake"进程接管负载均衡器的IP地址,并开始提供负载均衡服务;而当再次收
到来自负载均衡器的"I'm alive "消息时,备份服务器将自动将"fake"进程去激活,释放出它接管的服务器,负载均衡器重新开始工作。
但是,如果负载均衡器在客户正在请求时失效,这时会引起客户请求失败,客户必须重新发出请求信
息。
"coda"是一个容错的分布式文件系统,源于Andrew文件系统。服务器上的目录能够存储在"coda"上,所
以文件能够实现高可用性,并且易于管理。
配置实例:
下面是一个基于VS-DR的Virutal Server构筑高可用性的WEB服务器。
"mon"用于监测集群中的服务器节点和服务进程。例如,"fping.monitor"文件用于监测服务器节点,
"http.monitor"文件用于检测HTTP服务,"ftp.monitor"用于检测FTP服务,以此类推。所以,我们只需往里
增加或删除一个规则。下面是一个配置实例:lvs.alert。
#!/usr/bin/perl
#
# lvs.alert - Linux Virtual Server alert for mon
#
# It can be activated by mon to remove a real server when the
# service is down, or add the server when the service is up.
#
#
use Getopt::Std;
getopts ("s:g:h:t:l:P:V:R:W:F:u");
$ipvsadm = "/sbin/ipvsadm";
$protocol = $opt_P;
$virtual_service = $opt_V;
$remote = $opt_R;
if ($opt_u) {
$weight = $opt_W;
if ($opt_F eq "nat") {
$forwarding = "-m";
} elsif ($opt_F eq "tun") {
$forwarding = "-i";
} else {
$forwarding = "-g";
}
if ($protocol eq "tcp") {
system("$ipvsadm -a -t $virtual_service -r $remote -w $weight $forwarding");
} else {
system("$ipvsadm -a -u $virtual_service -r $remote -w $weight $forwarding");
}
} else {
if ($protocol eq "tcp") {
system("$ipvsadm -d -t $virtual_service -r $remote");
} else {
system("$ipvsadm -d -u $virtual_service -r $remote");
}
};
"lvs.alert"文件放在/usr/lib/mon/alert.d目录下。
"mon"的配置文件(/etc/mon/mon.cf或者/etc/mon.cf)可以象下面所示一样,配置成在集群中监测
HTTP服务和服务器节点的功能。
#
# The mon.cf file
#
#
# global options
#
cfbasedir = /etc/mon
alertdir = /usr/lib/mon/alert.d
mondir = /usr/lib/mon/mon.d
maxprocs = 20
histlength = 100
randstart = 30s
#
# group definitions (hostnames or IP addresses)
#
hostgroup www1 www1.domain.com
hostgroup www2 www2.domain.com
#
# Web server 1
#
watch www1
service http
interval 10s
monitor http.monitor
period wd {Sun-Sat}
alert mail.alert wensong
upalert mail.alert wensong
alert lvs.alert -P tcp -V 10.0.0.3:80 -R 192.168.0.1 -W 5 -F dr
upalert lvs.alert -P tcp -V 10.0.0.3:80 -R 192.168.0.1 -W 5 -F dr
#
# Web server 2
#
watch www2
service http
interval 10s
monitor http.monitor
period wd {Sun-Sat}
alert mail.alert wensong
upalert mail.alert wensong
alert lvs.alert -P tcp -V 10.0.0.3:80 -R 192.168.0.2 -W 5 -F dr
upalert lvs.alert -P tcp -V 10.0.0.3:80 -R 192.168.0.2 -W 5 -F dr
注意:如果目标端口不同,则你需要为"lvs.alert"设置参数,形如:
"lvs.alert -V 10.0.0.3:80 -R 192.168.0.3:8080"
现在,负载均衡器能够将服务器节点失效和服务失效的情况隐藏起来,当它们恢复正常后又自动将其投入使用。
另外,为了防止负载均衡器成为整个系统的单点失效,我们需要构建一个负载均衡器的备份服务器,让它们周期性地传递"心跳信息"。详细的细节请参考"heartbeat"软件包中带的相关文档,构建两个服务器节点组成"heartbeat"系统是相单简单的。
例如,我们假定两个负载均衡器有下列的IP地址:
lvs1.domain.com (负载均衡器) 10.0.0.1
lvs2.domain.com (备份服务器) 10.0.0.2
(集群服务的虚拟IP) 10.0.0.3
在lvs1.domain.com 和lvs2.domain.com两台机器上都安装"heartbeat"软件包,然后新建/etc/hd.d/ha.conf,内容如下:
#
# keepalive: how many seconds between heartbeats
#
keepalive 2
#
# deadtime: seconds-to-declare-host-dead
#
deadtime 10
# hopfudge maximum hop count minus number of nodes in config
hopfudge 1
#
# What UDP port to use for udp or ppp-udp communication?
#
udpport 1001
# What interfaces to heartbeat over?
udp eth0
#
# Facility to use for syslog()/logger (alternative to log/debugfile)
#
logfacility local0
#
# Tell what machines are in the cluster
# node nodename ... -- must match uname -n
node lvs1.domain.com
node lvs2.domain.com
"/etc/ha.d/haresources"文件内容如下:
lvs1.domain.com 10.0.0.3 lvs mon
"/etc/rc.d/init.d/lvs"文件内容如下:
#!/bin/sh
#
# You probably want to set the path to include
# nothing but local filesystems.
#
PATH=/bin:/usr/bin:/sbin:/usr/sbin
export PATH
IPVSADM=/sbin/ipvsadm
case "$1" in
start)
if [ -x $IPVSADM ]
then
echo 1 > /proc/sys/net/ipv4/ip_forward
$IPVSADM -A -t 10.0.0.3:80
$IPVSADM -a -t 10.0.0.3:80 -r 192.168.0.1 -w 5 -g
$IPVSADM -a -t 10.0.0.3:80 -r 192.168.0.2 -w 5 -g
fi
;;
stop)
if [ -x $IPVSADM ]
then
$IPVSADM -C
fi
;;
*)
echo "Usage: lvs {start|stop}"
exit 1
esac
exit 0
最后,确认你已经在负载均衡器和备份服务器上均新建了以上文件,你就可以在两台机器上启动"heartbeat"进程了。
注意:"fake"已经包含在"heartbeat"包中,所以无需单独地安装"fake"包。当
lvs1.domain.com失效时,lvs2.domain.com将接管所有lvs1.domain.com的"haresources",也就是
使用ARP欺骗接管10.0.0.3,并启动/etc/rc.d/init.d/lvs和/etc/rc.d/init.d/mon脚本。当
lvs1.domain.com恢复正常时,lvs2将释放所有HA资源,lvs1接替工作。
方案二:ldirectord+heartbeat
"ldirectord"(Linux Director Daemon)是Jacob Rief编程实现的一个独立进程,以实现对服务和物理服务器的监测,广泛地用于http和https服务。
"ldirectord"安装简单,能很好地与"heartbeat"很好的配合工作。"ldirectord"程序包含在"ipvs"包中的"contrib"目录中。
下面指出了"ldirectord"的一些优点:
"ldirectord"是专门撰写的LVS监测程序。
它从/etc/ha.d/xxx.cf文件中读取所有关于IPVS路由表的配置信息。当"ldirectord"运行起来后,IPVS路由表将会被适当地配置。
也可以将Virtual service配置放在多个配置文件中,所以可以单独修改某一种服务的参数,而不影响其它的服务。"ldirectord"能被"heartbeat"轻松地管理----启动、关闭。
将"ldirectord"放到/etc/ha.d/resource.d/目录下,然后在/etc/ha.d/haresources中增加一行:
node1 IPaddr::10.0.0.3 ldirectord::www ldirectord::mail
"ldirectord"能够手动开启、关闭。可以在无备份负载均衡器的LVS集群中使用它。
配置实例:
新建或修改配置文件/etc/ha.d/,使其包含:
#
# The /etc/ha.d/ for ldirectord
#
# the number of second until a real server is declared dead
timeout = 10
# the number of second between server checks
checkinterval = 10
#
# virtual = x.y.z.w:p
# protocol = tcp|udp
# scheduler = rr|wrr|lc|wlc
# real = x.y.z.w:p gate|masq|ipip [weight]
# ...
#
virtual = 10.0.0.3:80
protocol = tcp
scheduler = wlc
real = 192.168.0.1:80 gate 5
real = 192.168.0.2:80 gate 5
request = "/.testpage"
receive = "test page"
在 /etc/ha.d/haresources文件中写入以下配置:
lvs1.domain.com IPaddr::10.0.0.3 ldirectord::www
同时,必须新建一个.testpage文件放在所有WWW服务器的主目录下:
使用命令:
echo "test page" > .testpage
在主、备两台机器上都启动"heartbeat"进程,如果有任何错误,可以分别检查/var/log/ha-log和
/var/log/ldirector.log两个文件。
2 Xlinux的LATCH HA解决方案
正如前面所述,高可用性解决方案(HA)是一种极为重要的,许许多多厂商投入了大量的研究,其中Xlinux发行版就提供了LATCH HA解决
方案,能够应用在各种集中式、客户机-服务器模式或OLTP系统中。同时其与市场上各种主流的数据库系统与OLTP软件(如Oracle、
SYSBASE、Informix与Tuxedo)也都保持兼容。LATCH HA同时提供了各种应用程序接口。因此,客户能够在其私有软件中集成各种功
能来保证系统的高可靠性,这样也保护了客户的投资。下面我们就一起看看LATCH HA方案。
LATCH HA解决方案的最典型的系统结构:两台主机A、B共享一个磁盘阵列,A为工作机,B为备份机。它们之间用一根心跳线来连接,这称为
“心跳检测”,主要通过一条RS232检测链路来完成。LATCH HA也采用了网络Ping来验证系统宕机检测的准确性。安装在主机上的HA软件上的
HA软件通过心跳线来实时监测对方的运行状态,一旦正在工作的主机A因为各种硬件故障导致系统发生故障,主机B立即投入工作。怎么样,与IBM的
HACMP有点象吧!
LATCH HA实现了“高可靠性共享存储”架构。该架构由两个或三个冗余服务器、一个共享冗余磁盘阵列、一个可选DBMS及LATCH HA系
统软件构成。在LATCH HA的保护下,企业的计算机系统能够提供不间断的信息服务,避免由于硬件故障或日常维护所带来的宕机,因而能够首先最佳的可靠
性及最大程度地减少宕机时间。
方案应用
LATCH HA能够应用在各种集中式、客户机-服务器模式或OLTP系统中。同时其与市场上各种主流的数据库系统与OLTP软件-如
Oracle、 SYBASE、 Informix与Tuxedo-也都保持兼容。LATCH HA同时提供了各种应用程序接口。因此,客户能够在其私有
软件中集成各种功能来保证系统的高可靠性。
1) LATCH HA/HS2000 在线待机模式
在这种模式下,一个服务器作为主服务器。正常情况下其承当所有的服务。另外一台服务器作为待机服务器,正常情况下除了监控主服务器的状态,不进行
其他的操作。一旦主服务器宕机,待机服务器就接手工作,成为新的主服务器。客户仍然可以拥有同样的服务器IP地址、NFS、数据、数据库及其他……这种应
用模式近似于上面介绍的典型应用模式—A与B实际上是在完成同一个功能应用,安装在主机上的HA软件通过心跳线来实时监测对方的运行状态,一旦正在工作的
主机A因为各种硬件故障-如电源失效、主要部件失效或者启动盘失效等导致系统发生故障,主机B立即投入工作。
2) LATCH HA/DA2000双机就绪模式
在这种模式下,两个主机都作为主服务器,共享自己的磁盘阵列,各自承当一部分服务。例如服务器A在执行应用A, 服务器B在执行应用B, 两个主
机在正常情况下各自独立运行自己的应用逻辑,两个主机同时又都作为对方的待机服务器,通过心跳线监控对方的状态。一旦某一服务器宕机,另一台服务器就承担
所有的服务,为所有的客户服务。及一旦服务器A发生故障,服务器B马上接管服务器A上原来的应用;或者服务器B发生故障,服务器A马上接管服务器B上原来
的应用,这是一种互为冗余的模式。
很明显,一旦某一服务器宕机,另一台服务器的工作服但就比较重,于是就有了下面的三主机模式。
3) LATCH HA/HC2000 三主机模式
这种应用模式是最高端的HA应用模式,它既保证了系统的设备冗余,避免系统宕机,而且又能保证在一旦宕机的情况下有足够的系统资源以供使用。
在这种模式中,待机服务器C同时监控主服务器A与B的状态。一旦服务器A或B宕机,服务器C将承担其服务,为客户服务。这种系统结构既保证了系统的安全运行,又保证了系统资源。
阅读(2172) | 评论(0) | 转发(0) |